2017-03-16 8 views
0

動作しないと私は、配列を初期化するための簡単なカーネルを持って立ち上げました。私の設定は次のとおりです:カーネルは、二次元が

int size = 30; 
int * result = (int*) malloc(sizeof(int)*size); 
int *resultD; 
cudaMalloc((void**)&resultD, sizeof(int)*size); 

for(int i = 0; i < size; i++) { 

    result[i] = 0; 
} 

cudaMemcpy(resultD, result, sizeof(int)*size, cudaMemcpyHostToDevice); 
dim3 block(100,30); 
test<<<1, block>>>(resultD); 

cudaMemcpy(result, resultD, sizeof(int)*size, cudaMemcpyDeviceToHost); 

for(int i = 0; i < size; i++) { 
    cout << result[i] << endl; 
} 

私の結果は0(ゼロ)です。なぜ私を助けることができますか?申し訳ありませんが、私はこれに新しいです。どうもありがとう。

答えて

2

結果が変わらない理由は、カーネルが起動に失敗するためです。

ホストからのCUDA API呼び出しの戻りエラーコードを常にチェックして、これらのタイプのエラーをキャッチしてください。

この場合、起動失敗を指定するエラーがあります。その理由は、ブロックサイズ(30 * 100 = 3000)が許容される最大サイズ(1024)よりも大きいためです。カーネルが必要な場合その多くのスレッド(不合理ではありません)では、それらを複数のスレッドブロックに分割する必要があります。