テスト環境:CPUが高性能、GPUは中(FP64は低)性能でアンバランス。
GPU: NVIDIA RTX 4000 Ada(20GB、CC 8.9)
CPU: AMD EPYC 9754(128 コア)
1. 密度流 (v2 sample3.dtr, KAN3=2 密度連成)
流れ:GPU + 粒子追跡:OpenMP のハイブリッドとしました。
流れ系 (setelm ~48% + solpcg ~28%の self-time) が構造的に並列で GPU 理想形。ここを GPU カーネル化して大幅短縮です。
粒子追跡 MOVE1 連鎖 (~20%) はバケット探索の IF/GOTO 分岐が多く、GPU だと並列効率が落ちました。これは OpenMP スレッドに流す形が BESTでした。
2. 表面流+移流分散
一番速かったのは ompacc で、密度流と同じ戦略(流れ:GPU + 粒子:OMP)。全構成中で最大のを記録しました。
surface_flow.f90 (D8 地表水ルーティング) の self-time が ~2.3% しかないため、にここは GPU 化不要、host 常駐で問題なし。残りは密度流と同じハイブリッドという構成でした。
当初、なぜ FP64 が弱い GPU でも速くなったのか不思議でした。AIに聞くと、「典型的な arithmetic intensity(バイトあたりFLOP数)が低い 処理だったから」+「16tだから」とのこと。この辺りをAIに頼るようではまだまだかな。
- 1要素読むごとの計算量はわずか。演算器はメモリ待ちで遊んでいるので足を引っ張らない。
- GPUは数千〜数万スレッドを同時に走らせ、メモリレイテンシをスレッド切替で隠蔽。結果、自分の~360 GB/sをほぼ飽和できた。
- CPU 側の並列効率が悪く、460 GB/sを使い切れず~16t相当で頭打ち。
純 GPU (acc) が負けるのは、ハードの性能差が大きなこともありますが、分岐の多い粒子追跡が GPU の thread divergence に弱いのも一因。ここをテコ入れするとGPUの方が速くなるかもしれません。なお、途中でSPH の Box Search 手法を取り入れてみましたが、劇的な効果は見られませんでした。
このような計算をしていると、FP64に強いGPUだとどうなるのか、試してみたくなります。
改変コードの公開は配布元が許可されていません。時代の流れでコーディング問題はほぼ解決したので、いずれ配布元でもGPU対応版やMPI版、表流水連携版を公開されると思います。比較は出るまで待ちましょう。