広島大学 理学研究科 尾崎 裕介 石川 健一 1 1. 2. 3. 4. 5. 6. Graphic Processing Unit (GPU)とは? Nvidia CUDA programming model GPUの高速化 QCD with CUDA 結果 まとめ 2 主に画像処理を行うPCパーツ 滑らかな描画 リアルタイム表示 100~200基のprocesserによる 超並列高速計算 価格: 5~10万円 性能: 数百GFLOPS (単精度) GPUを搭載した Graphic Card 手軽に高性能 O(a)改良したWilson-Dirac quarkの solverをCUDAによって作成し、 GPUでどのくらい加速されたか見てみた 先行研究 : Gyözö I. Egri, hep-lat/0611022 “Lattice QCD as a video game” → 単精度 本研究では倍精度 3 単精度solverを用いて倍精度 の結果を得る手法 反復改良法、 連立方程式(Wilson-Dirac) Dx = b を倍精度で解く 単精度で Dx=b を複数回解く と倍精度の解が得られるようにし た方法 GPU:単精度計算が非常に高速 (300-900GFlops) 単精度で解くところをGPUに担当 させると全体がスピードアップ! CPUの倍精度solver 10-15 CPUの単精度solver 10-6 10-12 GPUの単精度solver 10-15 10-6 10-15 10-12 4 L次元ベクトルの和の計算例 (L=N×M) c=a+b //=== host から呼び出される GPU code ==== _global_ void vadd_kernel(float *a, float *b, float *c) { int idx = threadIdx.x+blockIdx.x*blockDim.x; c[idx] = a[idx] + b[idx]; } //==== host 側 code === void main() { …… // GPU上にメモリ確保 cudaMalloc((void**)&a,….); ….. // c = a+b カーネルをGPUへ投げる // thread数/block=N, block数=M で並列実行 vadd_kernel<<<M,N>>>(a,b,c); } 高い並列度をうまく利用する必要がある thread 1 block 1 thread 2 block 2 thread 3 block 3 thread 4 block 4 ⋮ ⋮ thread N block M block grid thread : 最小の実行単位 (max 512/block) thread block : 同一のmultiprocessor上で 実行されるthreadの集まり (max 65535) grid :thread blockの集まり 並列化されたカーネルの全体 5 Nvidia CUDA Programming Guide より できる限り並列化 → 1thread で 1 格子点の計算 できる限り高速なメモリアクセス → GPU上の様々なメモリ領域の最適な使い方 6 Shared Memory •高速なメモリアクセス (4 clock cycles) •read-write アクセス •同一block内のthread間で共有 •16KB/block global Memory •device memory 上のメモリ •低速なメモリアクセス (400~600 clock cycles) •read-write アクセス •全thread間で共有 Shared Memory の有効活用 7 CUDA with QCD, programming strategy 1格子点あたりのデータ量とロード回数 •fermion : 8回+(1回) 3×4×2×4Byte=96Byte •gauge link : 2回 3×(3-1)×2×4Byte×4=48Byte×4 SU(3) reconstruction method. •clover項 : 1回 21×2×2×4Byte=336Byte CUDA ブロックに 43×2 格子点をアサイン スレッド数=128 スレッド fermion を shared memory に乗せた 4×4×4×2×96Byte=12.3KB, (max 16KB/block) gauge link と clover は device memory からロード データの出入り:1584 Byte 計算量:1896 Flop Byte/Flop = 0.83 G80バンド幅: ~80GB/s 予想性能: 100 GFlops!! 8 •マシン構成 GPU・・・NVIDIA GeForce 8800 GTX 354.6GFLOPS CPU・・・Intel Core 2 @2.66GHz 21.3GFLOPS •solver O(a)改良のWilson-Dirac quark solver Bi-CGStab 法 反復改良法 単精度部分をGPUが担当 even-odd preconditioning 9 •格子サイズ163×32 quench 0.15fm •quark質量[MeV] 23、52、81 倍精度 単精度 23MeV GPU 52MeV 81MeV 単精度solverで 加速効果 GPUを用いた場合 さらに1/7に 10-15 10-6 10-12 10-15 10-6 10-12 10-15 10 •quark 質量 23MeV •格子サイズ 43×8 83×16 163×32 GPU CPU 今回の結果 最大性能 17GFLOPS ただし、まだ速くなるはず → coalesced access 11 4,8,or 16Byte 格子点 0 thread 0 格子点 0 thread 0 格子点 1 thread 1 格子点 0 thread 1 格子点 2 thread 2 格子点 0 thread 2 ⋮ ⋮ 格子点 1 ⋮ 格子点 0 格子点 1 格子点 1 格子点 1 格子点 2 格子点 2 ⋮ 格子点 2 格子点 0 格子点 2 ⋮ ⋮ 12 Nvidia GeForce GTX 280 Core 2 Duo 3.0GHz (6MB) •non coalesced access •on shared memory 20GFLOPS 石川健一solver •coalesced access •on texture cache 40~50GFLOPS hopping → 89GFLOPS clover → 100GFLOPS 倍精度solver 220秒 ×22 GPU solver ~10秒 13 GPUを用いると気軽に高速計算が可能。 ← 格子QCDでも GPUは単精度計算が高速。 反復改良法を利用したGPU solver を作成した。 ← 倍精度の結果 作成したsolverはO(a)の改良を行うclover項を導入している。 GeForce 8800 GTX での結果 solverの計算性能は最大約17GFOLPS。 計算時間は Core 2 Duo 2.66GHz CPUの1/7。 GeForce GTX 280 での結果 coalesced access 導入後40~50GFLOPS。 Core 2 Duo 3.0GHz の22倍。 高速な計算にはcoalesced access が必要。 複数のGPUによる計算。 14
© Copyright 2024 ExpyDoc