Graphic Card を使った 高性能計算 石川健一 (広島大学) 共同研究者 尾崎裕介 A04班 ワークショップ「計算科学による素粒子・原子核・宇宙の融合」 2008年12月1日ー2日
1.とりあえず背景 格子QCD 計算でしんどい所 一階の差分方程式=大規模疎行列連立一次方程式を大量に解く必要がある。 ホッピング行列(係数 (U とかγ)付一階差分) 解く連立方程式 (Wilson型) Dw =1-κM (Overlap型) Dov = m – Dw / sqrt( Dw^+ Dw ) D x = b ホッピング行列は倍精度計算で格子点あたり ~ 3 Byte/Flop 要求
2. GPUの動向 GPU (AMD-ATI, Nvidia) すでに“Lattice QCD as a video game”, リアルタイムでのグラフィック処理を要求するため高いスループットで計算ができる。 高い並列度、高いメモリバンド幅 グラフィック以外の用途にこの計算リソースを使う => GPGPU すでに“Lattice QCD as a video game”, [G.I.Egri, Z.Fodor, S.D.Katz, D.Nogradi, K.K.Szabo, hep-lat/0611022]. NVIDIA G80 arch. > 300 GFlops(SP) Lattice Wilson kernel > 30 GFlops Graphic API (OpenGL) 30GFlops
2. GPUの動向 GPGPU開発言語 性能: CUDA (Nvidia) (C extension) すでに単精度で~1TFlops My experience with CUDA (GeForce 8800 GTX) [NO WARRANTY CUDA code:http://theo.phys.sci.hiroshima-u.ac.jp/~ishikawa/CUDA/CudaQCDSolver_0.06.tar.gz] Hopping matrix mult (16^4) can also achieve > 40 GFlops. (13% sustained speed) 性能: すでに単精度で~1TFlops 倍精度計算も可能~100GFlops オンボードメモリは 1GByte オンボードメモリ-GPU間バンド幅 100GByte/s ボトルネックはホストーカード間データ転送 PCI-E G2(x16) 2~4GByte/s? 単精度の場合 要求1.5Byte/Flop GPUカードは (100GByte/s)/(1000GFlop/s)=0.1Byte/Flop メモリバンド幅で制限されるので性能は 100/1.5=67GFlops予想
2. GPUの動向 性能: [C.Rebbi et. al., PoS(LATTICE 2008)045] GFix してバンド幅を節約しているけど 70-90GFlops でる!(単精度)
3.CUDA Programming My experience with CUDA (GeForce 8800 GTX) Cuda code example: Link variable times 2-Spinor code Almost C language
3.CUDA Programming My experience with CUDA (GeForce 8800 GTX) CUDA Programming model Single Program Multiple Data (SPMD) Single Thread Multiple Stream? Nested threading. Grid / Block / Thread Thread ID + Block ID (Corresponds to MPI RANK) Block has local memory shared by threads in a block. Grid for 16^3x32 lattice Block for 4^3x2 lattice Spinor data are vector loaded [100GFlop/sec] on the shared memory on each block. They are reused by (max 8 times/ min 4 times). Link fields are loaded via Texture Fetching mechanism (Cached). Thread for single site
4. 単精度計算で倍精度計算を行う Mixed precision / Inner-Outer solver 4. 単精度計算で倍精度計算を行う Mixed precision / Inner-Outer solver Flexible Preconditioner 可能な反復法で計算 Richardson 反復(Iterative refinement)法を基に作る 単精度で解ききっていれば、倍精度の解を得るのにRefinment 反復は3-5回。 演算量はすべて倍精度で計算するときより増えるが単精度計算の効率や速さが良いときは全体で速くなる。 Intel 系は確かに SSE2などを使うとキャッシュやメモリバンド幅、レジスタの利用率があがり全体で2倍の速度上昇があった。 GPU計算をここに使うことで更なるスピードアップ
4. 単精度計算で倍精度計算を行う GPUを使って実験してみた Nested BiCGStab (Sakurai, Tadano) 4. 単精度計算で倍精度計算を行う GPUを使って実験してみた (GeForce 8800GTX, Core2Duo2.66GHz, PCI-E G1.1x16[peak 4GB/s], H⇒D:1.36GB/s, H←D:1.53GB/s, D⇔G:70.8GB/s) Nested BiCGStab (Sakurai, Tadano) 外側反復 BiCGStab 倍精度で CPUで計算 内側反復 BiCGStab 単精度 CPUで計算した場合とGPUで計算した場合の比較 Even-Odd site preconditioned O(a)-Wilson quark [広大M2学生 尾崎裕介君 coding/exp.] GPUを使うと計算時間は 1/8に短縮される!(当社比) CPUコードはもう少し改良する 余地(SSEの使用)がある。 1/4から1/5の短縮かもしれない。
4. 単精度計算で倍精度計算を行う GPUを使って実験してみた GPUを使うと計算時間は 1/7に短縮される!(当社比) CPUコードはもう少し改良する 余地(SSEの使用)がある。 1/4から1/5の短縮かもしれない。 全計算時間のほとんどは内部反復に費やされているが、GPU版は内部反復がとても早いので外部反復の遅さが目立つかも。
4. 単精度計算で倍精度計算を行う GPUを使って実験してみた CPU(Fortran) only GPU(CUDA)+CPU(C)
5. 今後の方針とまとめ 並列化無しの単体のコードの書き方は分かってきた。それなりに速度向上はできそうである。 5. 今後の方針とまとめ 並列化無しの単体のコードの書き方は分かってきた。それなりに速度向上はできそうである。 問題は大規模並列のときどうするか? リンク変数は一度GPUに送ってしまえばGPU上に取っておける。 クォークベクトルをHost(CPU)-GPU間でやり取りしつつ、並列計算のため Host-Host 間でデータの交換が必要。 GPUで計算しているとき CPUは遊んでいる。 Host-Host通信中は GPU,CPUは遊んでいる。 遊ばせないアルゴリズムはあるか? Overlap fermion のときはどうするか? 5D表現で行えば Wilsonのときと同様だが、、、どうか?
5. 今後の方針とまとめ 並列化の方針、とりあえずWilson型 領域分割法の前処理としてブロック部分の逆を取るところを GPUに任せる 5. 今後の方針とまとめ 並列化の方針、とりあえずWilson型 領域分割法の前処理としてブロック部分の逆を取るところを GPUに任せる ブロック内の の計算をGPUに任せてはどうか?
5. 今後の方針とまとめ
空白 空白
Nested Domain Decomposition +Some Improvement technology. u/d/s Small block p n p/n ( L > 6 fm?, 1/a=2GeV, 64^4 lattice) Nested Domain Decomposition +Some Improvement technology. [Luscher, JHEP 0305 (2003) 052 ]
Communication with Surface data only. or GPGPU Accelerator Communication with Surface data only. Bandwidth can be properly treated by this blocking. But Latency is limited by speed of light.
GPGPU This year NVIDA and AMD/ATI provide DP enabled architecture NVIDIA GT200 (Tesla 10series) 240 SP (SP cores), 30 DP cores ~1,000(or 600)Glops(SP), ~90GFlops(DP) We expect > 60 GFlops(SP) for QCD kernel. (assuming 10% efficiency) AMD/ATI RV770 (Firestream 9250) 640 SP units, (160 DP units?) 1.2TFlops (SP), 200 GFlops (DP) AMD Stream SDK For QCD No ECC, check the result on the host side. O(1000) thread programming/SIMD programming is required. (1site=1thread) Make use of the Local memories attached each core for good efficiency. Host device communication is limited by PCI-E x16 G2 speed (8GB/sec (sustained at 2GB/sec))