Fdtd3d: 並列計算に関する質問

作成日 2020年01月08日  ·  9コメント  ·  ソース: zer011b/fdtd3d

こんにちはグレブ、

成毅です。 この素晴らしいプロジェクトを開発していただきありがとうございます。 FDTDとその並行性を研究するのに非常に役立ちます。 しかし、MPI / GPUコンピューティングを使用する際にいくつかの問題が発生しました。

  1. 問題は、次のコマンドを使用してfdtd3dコードを呼び出すと、
    ./Release/Source/fdtd3d --cmd-from-file ./Examples/vacuum3D_test.txt
    次のコードを挿入して、「vacuum3D.txt」に基づいて「vacuum3D_test.txt」を作成しました。
--use-cuda
--cuda-buffer-size 1
--cuda-gpus 0
--num-cuda-threads-x 4
--num-cuda-threads-y 4
--num-cuda-threads-z 4

プログラムは、「ファイル./Examples/vacuum3D_test.txtからコマンドラインを読み込んでいます」というログのみを表示します。
「そして私がそれを殺すまで待ち​​続けてください。私が正しく設定しなかったいくつかの構成があるかどうか疑問に思っていますか?
ちなみに、これはあなたがそれを必要とする場合に備えて私のcmakeフラグです:
cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DVALUE_TYPE=f -DPRINT_MESSAGE=ON -DCUDA_ENABLED=ON -DCUDA_ARCH_SM_TYPE=sm_60 -DCXX11_ENABLED=ON -DPARALLEL_GRID=ON -DPARALLEL_GRID_DIMENSION=3

  1. また、MPIで「vacuum3D.txt」をシミュレートした場合、fdtd3dによって提供されるスケーラビリティはあまり理想的ではありません。 たとえば、グリッドサイズは40 x 40 x 40で、64000に相当します。18コアのチップが1つあります。 1つのプロセスで実行する場合、67.74秒かかり、8つのプロセッサを有効にすると約11.34秒になります。 スピードアップは約6です。18のようなプロセッサをさらに適用すると、時間の短縮は簡単です。たとえば、11.34秒から9.6秒になります。 これは合理的ですか? 並列計算のパフォーマンスを調整できるシミュレーション構成があるかどうかを尋ねることはできますか?

シミュレーションの詳細が必要な場合は、お知らせください。 どうもありがとうございました。

たくさんの感謝と願いを込めて、
成毅

Question

全てのコメント9件

  1. スタックしているとは思いません。計算を実行するだけで、 RelWithDebInfoモードでもはるかに低速です。 さらに、Cudaの起動の場合、実行の最後に完全なログが印刷されます。

ちょっとしたヒント:使用するモードが正確にわかっている場合は、(コンパイルと実行の観点から) -DSOLVER_DIM_MODESを指定する方が高速です。 デフォルトでは、すべてのモードがバイナリにコンパイルされます。これにより、Cudaビルドの場合のコンパイル時間が大幅に増加します。 あなたの場合、 -DSOLVER_DIM_MODES=DIM3で十分です。

  1. ここで覚えておくべきことがいくつかあります。 まず、各タイムステップの全体的な実行時間は、計算時間と共有時間の合計です。 グリッドが比較的小さい場合(あなたの場合のように)、共有時間が重要になる可能性があり、仮想トポロジを慎重に選択する必要があります(fdtd3dは、出力で指定されたグリッドサイズに最適な仮想トポロジを示します)。

ただし、共有メモリ共有操作を使用するシステムでは、(スレッド同期を除いて)まったく必要ありません。 そのため、ここではOpenMPがMPIよりもはるかに適用可能であり、MPIベースのプログラムは最高のスピードアップを示しません。 残念ながら、OpenMPはfdtd3dではまだサポートされていません。

これらすべてを念頭に置いて、fdtd3dにはまだ微調整が必​​要です。

  • デフォルトでは、Ox軸のみが計算ノード間で分散されますが、これを-DPARALLEL_BUFFER_DIMENSION=xyzで変更できます。これにより、グリッドがすべての次元のチャンクに分割されます。 fdtd3dの出力を確認してください。これは、最適な仮想トポロジをアドバイスするためです。
  • バッファのサイズは--buffer-size Bで設定でき、共有操作は各Bステップでのみ実行されます。 この場合、fdtd3dによってアドバイスされる最適な仮想トポロジが最適であるとは限りません。 ただし、 --manual-topology --topology-sizex X --topology-sizey Y --topology-sizez Zを使用して仮想トポロジを手動で設定できます。

プロセスの数がグリッドの全体的なサイズの分割ではない場合、fdtd3dによってアドバイスされた最適な仮想トポロジも最適であるとは限らないことに注意してください。

このタイムリーな返信ありがとうございます。

  1. シングルGPUコンピューティングに関しては、次のフラグを使用してfdtd3dを作り直しました。

cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DVALUE_TYPE=f -DPRINT_MESSAGE=ON -DCUDA_ENABLED=ON -DCXX11_ENABLED=ON -DPARALLEL_GRID=ON -DPARALLEL_GRID_DIMENSION=3 -DSOLVER_DIM_MODES=DIM3 -DPARALLEL_BUFFER_DIMENSION=x

そしてそれは私のワークステーションで動作しました。 (ところで、私のワークステーションには4つのTesla P100があり、そのうちのアーチはSM_60である必要があります)

  1. マルチGPUコンピューティングを有効にしたい場合
    mpiexec --mca btl ^openib -n 2 ./Release/Source/fdtd3d --cmd-from-file ./Examples/vacuum3D_test.txt
    およびCUDAコマンド
--use-cuda
--cuda-buffer-size 2
--buffer-size 2
--cuda-gpus 0,1
--num-cuda-threads-x 4
--num-cuda-threads-y 4
--num-cuda-threads-z 4

次のようにエラーが発生します。

Calculating time step 0...
Calculating time step 1...
Fatal error: an illegal memory access was encountered at /home/t00540502/fdtd3d/Source/Scheme/InternalScheme.inc.h:912
*** FAILED - ABORTING
-------------------------------------------------------
Primary job  terminated normally, but 1 process returned
a non-zero exit code.. Per user-direction, the job has been aborted.

最初のステップは問題なかったようですが、2番目のステップで呼び出す関数InternalSchemeKernelHelpers::calculateFieldStepIterationKernelに問題があります。 MPI + CUDAの使用で間違いがあったに違いないのではないかと思います。 正しく呼ぶ方法を教えていただけますか?
どうもありがとう。

一番

たぶんsm_60archに何か問題があります、私はそれをテストしていません。 デフォルトのアーチはsm_20なので、カードで機能するはずです。 ただし、cuda archがGPUの計算機能と一致しなかったときに、 illegal memory accessを見たことがあることがあります。

マルチGPU計算の適用範囲は限られています。 すべてのデータが単一のGPUのメモリに収まる場合、単一の計算ノードでこの単一のGPUで計算を実行する方がはるかに高速です(CPU / GPU間および異なる計算ノード間で中間データ共有がないため)。

ただし、グリッドが非常に大きく、単一の計算ノードのメモリに配置できない場合は、複数の計算ノードを使用する以外に選択肢はありません。各ノードにはGPUが搭載されている可能性があります。 この場合、CPU-GPUおよびCPU-CPUデータ共有は、デフォルトでB=1の各Bステップで実行されます。 これは、単一のGPUでのすべてのタイムステップの単純な計算よりもはるかに低速です。

マルチGPU計算は、fdtd3dではまだ完全にはサポートされていません。現在fdtd3dは、すべてのデータが適切な場所に(CPUのみのモードでも)適合することを確認するためにユーザーに依存しているためです。 したがって、このような制限があれば機能するはずです。

@solotcyアーチが設定されていないというバグがありました(#140を参照)。 そのPRについてはsm_60で確認してください。

Illegal memory accessは、デバイスメモリにあるグローバル変数cudaSolverSettingsへのアクセスに関連しています( INTERNAL_SCHEME_BASE<Type, TCoord, layout_type>::calculateFieldStepIterationを参照)。

if (SOLVER_SETTINGS.getDoUseTFSF ())

私がfdtd3dをテストした同じ計算機能sm_35を備えた3つのGPUのうちの2つでは、すべてが正常に動作します(すべてのGPUは異なるモデルです)。 ただし、ある理由で、 getDoUseTFSFメソッドを入力すると、cudaSolverSettingsがNULLになります(つまり、このptrはNULLです)。 なぜこれが発生するのか理解できませんでしたが、デバイスの誤動作が原因で発生する可能性があることがわかりました。

少なくとも4つのGPUの1つでfdtd3dを正常に起動できたようです。 各GPUで個別にGPUのみのモードを試してください。 4つのGPUはすべてまったく同じであるため、fdtd3dの動作にまったく違いはありません。 違いがあると、デバイスの誤動作が原因である可能性が高くなります。

返信ありがとうございます。

PR#140を確認し、フラグ-DCUDA_ARCH_SM_TYPE = sm_60を追加してfdtd3dを再構築しました。 残念ながら、同じ問題が発生します。

ただし、おっしゃるように、シングルGPUモードで異なるGPUを切り替えたときに、同じエラーが発生しました。 そして、それは最初のステップではなく、前のように2番目のステップです。

Estimated current size: 1437644553 byte.
Setup blocks:
blockCount:
Coord (X : 1.000000, Y : 1.000000, Z : 1.000000).
blockSize:
Coord (X : 200.000000, Y : 200.000000, Z : 200.000000).
Calculating time step 0...
Calculating time step 1...
Fatal error: an illegal memory access was encountered at ~/fdtd3d/Source/Scheme/InternalScheme.inc.h:912

そして、それは最初のGPUでしか機能しなかったので、物事はちょっと奇妙になります。 他の3つについては、すべて失敗し、同じエラー情報がありました。

テストありがとうございます! 私はついにこの問題の根本的な理由を理解することができました。 PR#141は問題を解決します。 これで、fdtd3dはすべてのGPUで動作するはずです。 マルチGPUモードも機能するようになりました。

返信と変更されたコードをありがとう。 必要な数のGPUを使用して、ワークステーションでプログラムを実行することができました。 次に、CPUとGPUの両方でスケーラビリティをテストできます。
かっこいいです、ありがとう!!!

さらに質問がある場合は、この問題を再開してください。

このページは役に立ちましたか?
0 / 5 - 0 評価