CUDA を使用して、潜在的に大規模な 3D データ セットの計算を行っています。最初に短いコード スニペットを表示するのが最善だと思います。
void launch_kernel(/*arguments . . . */){
int bx = xend-xstart, by = yend-ystart, bz = zend-zstart;
dim3 blocks(/*dimensions*/);
dim3 threads(/*dimensions*/);
kernel<<blocks, threads>>();
}
セルの 3D セットがあり、それぞれを計算するためにカーネルを起動する必要があります。問題は、入力サイズが GPU、特にスレッドの能力を超える可能性があることです。したがって、次のようにコードします。
void launch_kernel(/*arguments . . . */){
int bx = xend-xstart, by = yend-ystart, bz = zend-zstart;
dim3 blocks(bx,by,1);
dim3 threads(bz);
kernel<<blocks, threads>>();
}
...うまくいきません。寸法が 1000x1000x1000 の場合はどうでしょうか。- ブロックごとに 1000 スレッドを起動できません。あるいは、寸法が 5x5x1000 の場合はどうでしょうか? - 現在、ブロックをほとんど起動していませんが、カーネルはハードウェアの 5x5x512 b/c で起動する必要があり、各スレッドは 2 つの計算を実行します。また、カーネル内の次元を識別できるようにするために、z の一部をブロックに、一部をスレッドに配置して、すべての次元をマッシュアップすることもできません。現在:
__global__ void kernel(/*arguments*/){
int x = xstart + blockIdx.x;
int y = ystart + blockIdx.y;
int z = zstart + threadIdx.x;
if(x < xend && y < yend && z < zend){
//calculate
}
}
これらの変数を把握するための確実で効率的な方法が必要です。
ブロック x の次元、ブロック y の次元、スレッド x (および y? と z?)、blockIdx と threadIdx を介してカーネルに入った後の x、y、z、および入力がハードウェアを超える場合は、 「ステップ」カーネル計算内の for ループで各次元を取得します。
ご不明な点がございましたら、お尋ねください。これは難しい質問であり、私を悩ませてきました (特に、起動するブロック/スレッドの量がパフォーマンスの主要な要素であるため)。このコードは、さまざまなデータ セットの決定を自動化する必要がありますが、それを効率的に行う方法がわかりません。前もって感謝します。