2011-12-23 19 views
3

私は以前に尋ねようとしたが、遠くには到達せず、新しい情報を見つけ出し、より大きな助けを望んでいるという問題があります。コードは複数のノードにまたがって実行しようとするとセグメンテーションフォルトでクラッシュするハイブリッドMPI/OPENMPコードです(マスタープロセスが生成されているノードでのみ実行されても動作します)。問題には静的配列があり、静的配列が "大きすぎる"場合はsegフォルトが発生することがわかりましたが、 "小"の場合はすべて正常に動作します。私はコードをダイナミックメモリ割り当てにテストとして変換しました。これは問題を解決します...サイズに関係なく(静的な世界では失敗したものも)、コードは正常に完了します。テストコードはテストコードなので、この解決策は長期間のものではありませんが、同じ動作を示し、動的に変更するコードがはるかに大きなオプションがあります。私は何が静的アレイのseg障害状況を引き起こしているのかを判断する必要があります。FORTRANメモリ使用率 - 静的対動的

基本的に、静的に割り当てられたメモリと動的に割り当てられたメモリがどのように処理されるかの違いは何ですか?何を(私が試したことを超えて)私はこれを越えようとするべきですか?問題はシステム設定に関係していると思われます。おそらく、ジョブがMPICH2を通過するときにしか違反しますが、ノードにログインしても問題にはなりません(なぜ、現在ログインしているノードでうまく動作するのでしょうか)。私.bashrcファイルで

は私が持っている "ulimit -s unlimited"、 "export OMP_STACKSIZE=4g" と "export KMP_STACKSIZE=4G" 私はのifortコンパイラを使用していますので、。私はこれが比較的単純な修正でなければならないと信じていますが、私はそれで来ることはできません。

違反しているプログラムのソースコードが必要な場合は、送信することができますが、ここに記載されている説明は問題をカバーしていると思います。

答えて

4

スタックには静的に割り当てられたものが表示され、ヒープには動的なものが表示されます。小さな静的配列はうまく動作し、大きな静的配列はうまく動作しません。

-heap-arraysでコンパイルしようとすると、動的に割り当てられた配列のみがヒープに配置されます(ifortが一意であるため、割り当て可能な配列は割り当てられた配列サブプログラムで)。

もう1つは、MPIジョブがスタックサイズを実際に設定することです。 mpirun -n <numprocs> ulimit -sを実行してみると、すべてunlimitedと表示されます。そうしないと、bashrcを尊重していません。その後で実行されるだろう

#!/bin/bash 
ulimit -s unlimited 
./myProg 

次のようなbashスクリプト(myScript.sh)を試すことができ

mpiexec -n <numprocs> myScript.sh 
+0

あなたはそれを考え出しました。問題は、シェル値と.bashrcファイルがmpiexecで呼び出されたときに転送/実行されないということです。スタックサイズは、4つのノードの「無制限、8192、8192、8192」でした。最初はログインしていたノードです。私が持っている次の質問...これを解決する方法?私は "ulimit -s unlimited"をmpiexec呼び出しで渡すことができますが、構文を知らないのです。クラスタの管理者側でこれを変更すべきですか? (私はコマンド "ulimit -s"をファイルに追加し、ファイルを実行可能にしてから./that_fileをmpiexecに渡して動作させなければならなかった)。 – jackd

+0

私はあなたの答えを "上乗せ"しようとしましたが、評判などが十分ではありません。ごめんなさい。 – jackd

+0

簡単なことに、私はさまざまな引用符で試した他のアプローチと同じように、 "mpiexec -np 4 - マシンファイルマシンulimit -s"を送信するとエラーが発生し、実行可能ファイル方式を使用しなければなりませんでした。エラーを起こさずに1つのコマンドですべてを送信する方法がわかりません。 – jackd

関連する問題