こんにちはグレブ、
成毅です。 この素晴らしいプロジェクトを開発していただきありがとうございます。 FDTDとその並行性を研究するのに非常に役立ちます。 しかし、MPI / GPUコンピューティングを使用する際にいくつかの問題が発生しました。
./Release/Source/fdtd3d --cmd-from-file ./Examples/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
シミュレーションの詳細が必要な場合は、お知らせください。 どうもありがとうございました。
たくさんの感謝と願いを込めて、
成毅
RelWithDebInfo
モードでもはるかに低速です。 さらに、Cudaの起動の場合、実行の最後に完全なログが印刷されます。ちょっとしたヒント:使用するモードが正確にわかっている場合は、(コンパイルと実行の観点から) -DSOLVER_DIM_MODES
を指定する方が高速です。 デフォルトでは、すべてのモードがバイナリにコンパイルされます。これにより、Cudaビルドの場合のコンパイル時間が大幅に増加します。 あなたの場合、 -DSOLVER_DIM_MODES=DIM3
で十分です。
ただし、共有メモリ共有操作を使用するシステムでは、(スレッド同期を除いて)まったく必要ありません。 そのため、ここではOpenMPがMPIよりもはるかに適用可能であり、MPIベースのプログラムは最高のスピードアップを示しません。 残念ながら、OpenMPはfdtd3dではまだサポートされていません。
これらすべてを念頭に置いて、fdtd3dにはまだ微調整が必要です。
-DPARALLEL_BUFFER_DIMENSION=xyz
で変更できます。これにより、グリッドがすべての次元のチャンクに分割されます。 fdtd3dの出力を確認してください。これは、最適な仮想トポロジをアドバイスするためです。--buffer-size B
で設定でき、共有操作は各B
ステップでのみ実行されます。 この場合、fdtd3dによってアドバイスされる最適な仮想トポロジが最適であるとは限りません。 ただし、 --manual-topology --topology-sizex X --topology-sizey Y --topology-sizez Z
を使用して仮想トポロジを手動で設定できます。プロセスの数がグリッドの全体的なサイズの分割ではない場合、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である必要があります)
mpiexec --mca btl ^openib -n 2 ./Release/Source/fdtd3d --cmd-from-file ./Examples/vacuum3D_test.txt
--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の両方でスケーラビリティをテストできます。
かっこいいです、ありがとう!!!
さらに質問がある場合は、この問題を再開してください。