1

単純なカーネルの最大スレッド数をテストしています。スレッドの総数が 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 メモリ操作は、カーネルからの出力が表示されるようにコードをブロックするためにあります。

4

1 に答える 1

6

kernel を悪用printfしており、それを使用して実行できるスレッド数を判断することは、まったく無意味な考えです。ランタイムには出力用のバッファー サイズが制限されており、printf十分な数のスレッドを実行すると、単純に出力でオーバーフローします。およびprintfを使用して、バッファ サイズを照会および設定する API があります(コメント内のドキュメントへのリンクについては、Robert Crovella に感謝します)。cudaDeviceGetLimitcudaDeviceSetLimitprintf

特定のカーネルが実行できるスレッドの最大数は、ドキュメントのこちらを参照してください。

于 2013-04-09T04:59:14.613 に答える