前提・実現したいこと
数値計算のボトルネック解消のため、また個人的な興味から、CUDAの勉強を始めたところです。
基本的な概念は把握したのですが、スレッド/ブロック数の決め方の感覚がよくわかっていません。
(もちろん最終的には試行錯誤というのも了解しているのですが、現場の感覚に基づく相場観/方向性をご教示頂ければ幸いです。)
取り急ぎは、1枚のGPUボードの話でOKですが、もし余裕があれば、複数枚の取り扱いなど発展的な話題についても教えて頂ければ嬉しいです。
CUDAで走らせたいコード
例えば以下のような4重ループの計算をCUDAで実装できればと思っています。
arrayは計算に用いるデータ。dimとticksはintです。
dimの数を増やすと、おおよそ4乗で計算量が増えていくので、CPUだとすぐに苦しくなります。
GPUを活用することで、どこまで取り扱い可能なdimを増やせるかに興味を持っています。
Python
1def func(array, dim, ticks): 2 3 result = np.zeros((dim, dim, dim, dim)) 4 5 for j in range(dim): 6 for k in range(j+1,dim): 7 for l in range(dim): 8 for m in range(l+1,dim): 9 for q_i in range(ticks): // 積分 10 result[j][k][l][m] += (arrayに基づいた計算) 11 return result
GPUの情報
手元のPCに刺さっているGPUはRTX2080Tiです。deviceQueryの結果は次のとおりです。
Device 0: "GeForce RTX 2080 Ti" CUDA Driver Version / Runtime Version 11.0 / 10.2 CUDA Capability Major/Minor version number: 7.5 Total amount of global memory: 11017 MBytes (11552096256 bytes) (68) Multiprocessors, ( 64) CUDA Cores/MP: 4352 CUDA Cores GPU Max Clock rate: 1650 MHz (1.65 GHz) Memory Clock rate: 7000 Mhz Memory Bus Width: 352-bit L2 Cache Size: 5767168 bytes Maximum Texture Dimension Size (x,y,z) 1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384) Maximum Layered 1D Texture Size, (num) layers 1D=(32768), 2048 layers Maximum Layered 2D Texture Size, (num) layers 2D=(32768, 32768), 2048 layers Total amount of constant memory: 65536 bytes Total amount of shared memory per block: 49152 bytes Total number of registers available per block: 65536 Warp size: 32 Maximum number of threads per multiprocessor: 1024 Maximum number of threads per block: 1024 Max dimension size of a thread block (x,y,z): (1024, 1024, 64) Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535) Maximum memory pitch: 2147483647 bytes Texture alignment: 512 bytes Concurrent copy and kernel execution: Yes with 3 copy engine(s) Run time limit on kernels: No Integrated GPU sharing Host Memory: No Support host page-locked memory mapping: Yes Alignment requirement for Surfaces: Yes Device has ECC support: Disabled Device supports Unified Addressing (UVA): Yes Device supports Compute Preemption: Yes Supports Cooperative Kernel Launch: Yes Supports MultiDevice Co-op Kernel Launch: Yes Device PCI Domain ID / Bus ID / location ID: 0 / 101 / 0 Compute Mode: < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
試したこと
pyCUDAを使って、dim=27程度、これを1次元配列化してのテストはしました。しかしスレッド数をMAXまで使い切るのがよいのか否か?、"for k in range(j+1,dim)"といった非対称な部分の取り扱いのベストプラクティスは?などと考えているうちに頭が大混乱してしまったので、一度詳しい皆様にお尋ねしたいと考えた次第です。初心者質問で恐縮ですが、何卒よろしくお願い申し上げます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/26 10:48
2020/06/26 11:06 編集