理乃美

ソフトとハードと論理の覚え書き

自宅のPCでFDPSを使ってみる

2022-10-08 00:30:03 | 自作パソコン
FDPS (Framework for Developing Particle Simulator) [1]は、オープンソースの粒子シミュレーションのフレームワークである。( https://github.com/FDPS/FDPS )
これを自宅のPCで動かしてみた。今となっては2世代前の第11世代 Core i7のデスクトップ。OSはUbuntu 22.04。

GitHubからソース一式をダウンロードしmakeすれば 重力N体シミュレーションコード(sample/c++/nbody) は素直にビルドできた。OpenMPのみの利用、PIKGによるAVX-512利用もチュートリアルの記載どおりにMakeファイルを修正すればビルドできて動く。
NVIDIAのGPUを使うには、チュートリアルの記載に加え Makefile 35行目でnvccのコマンドパラメータの修正が必要だった。まず、-std=c++11 とあるのは -std=c++17 にしないとコンパイルが通らない。また、私のPCに載っているのは古い TESLA K80なので、-arch sm_37 を指定する必要がある。その二つの変更を追加すればOK。

で、重力N体シミュレーションコード (nbody.out)の実行時間 (timeコマンドでrealの値) は次のとおり。粒子数が64K個でもどうという事なく計算できている。


粒子数 AVX512+OpenMP AVX512 OpenMP 1 core 1 thread K80+OpenMP K80
1024 1.306 1.086 1.552 2.63 1.831 1.344
2048 1.575 2.684 2.367 7.363 2.543 2.768
4096 2.364 7.379 3.791 18.16 4.585 7.023
8192 3.616 14.621 7.559 41.434 7.913 13.112
16384 6.968 35.919 15.626 101.708 17.502 32.182
32768 17.246 88.197 35.687 236.615 40.989 78.441
65536 34.685 173.999 77.391 524.673 78.302 144.925

ここで予想外だったのは、TESLA K80が CPU(AVX-512利用)に負けていること。
nvidia-smiで見てみると、理由が見て取れた。K80は外見は一つだが、中身は二つのGPUからできている。nvidia-smiで見てみると、GPUが一つしか使われていないうえ、GPUの使用率が30%強だった。つまりCUDA用の実装がいまいちでGPGPUの実力を完全には引き出せていないという事なのだろう。
このサンプルプログラムでは、n_group_limitがデフォルトで64となっている。つまり、最大でも64粒子になるまで分割している。もっと大きな塊で計算させればCUDAの効率を上げられるのではということで n_group_limit を変えてみた結果がこちら。粒子数10万個で、n_group_limitを64から4096まで変えてみた。AVX-512を使った場合もCUDAを使った場合も最初は実行時間が減るが、これは領域分割・ツリー構築の時間が減ったためだろう。やがて重力相互作用の計算時間が増える影響がでて実行時間が増える。AVX-512に比べCUDAのほうが増加が緩やかなので逆転はする。だが、最適なn_goup_limitだとAVX-512のほうが早い。 nvidia-smiで見てみると n_group_limit = 4096の場合でGPU使用率が50%前後。でもK80全体の1/4しか使えていないことになる。


ちなみに、私はWindowsユーザーだが、サンプルプログラムのnbodyは、POSIX API (unistd.h) を使っていたりして Windows上でビルドするのが面倒だったので 素直にLinuxにした。

PCのスペック詳細
CPU: intel 第11世代 Core i7 11700K
Memory: 64GB
マザーボード: ASUS TUF GAMING Z590-PLUS
ストレージ: SATA接続 SSD
OS: Ubuntu 22.04
GPGPU: TESLA K80

[1] Iwasawa et al. (PASJ, 68, 54), Namekawa et al. (PASJ, 70, 70)
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする