単純なカーネルの最大スレッド数をテストしています。スレッドの総数が 4096 を超えることはできません。コードは次のとおりです。
#include <stdio.h>
#define N 100
__global__ void test(){
printf("%d %d\n", blockIdx.x, threadIdx.x);
}
int main(void){
double *p;
size_t size=N*sizeof(double);
cudaMalloc(&p, size);
test<<<64,128>>>();
//test<<<64,128>>>();
cudaFree(p);
return 0;
}
私のテスト環境: Tesla M2050 の CUDA 4.2.9。コードはでコンパイルされます
nvcc -arch=sm_20 test.cu
出力を確認しているときに、いくつかの組み合わせが欠落していることがわかりました。コマンドを実行します
./a.out|wc -l
私は常に 4096 を取得しました。cc2.0 を確認すると、x、y、z 次元のブロックの最大数は (1024,1024,512) であり、ブロックあたりのスレッドの最大数は 1024 であることがわかります。カーネル ( または のいずれ<<<64,128>>>
か<<<128,64>>>
) が限界に達しています。何か案が?
注意: CUDA メモリ操作は、カーネルからの出力が表示されるようにコードをブロックするためにあります。