ホストからデバイスへのデータ転送が使用されないようにする方法を試しました。通常、ループを使用してホスト配列の要素に値を割り当て、それをデバイスに転送します。これは、1Dおよび2Dアレイで問題なく機能します。私が試した新しい方法は、カーネルの配列要素に値を与えることです。1D配列に成功しました。ただし、2D配列の場合、結果は0
です。私のデバイスは、ブロックごとに(512,512)スレッドをサポートできます。出力値はLength=22まで正常になりますが、Length=23の場合は「0」と表示されます[22<sqrt(512)<23]
。によると、スレッド[22<sqrt(512)<23]
のみが使用されていることがわかります。22x22
どうしたの??なぜこうなった?
コード:
const int Length=23;
主な機能:
int A[Length],B[Length],C[Length],D[Length],*Ad,*Bd;
int size=Length*sizeof(int);
cudaMalloc((void**)&Ad,size);
cudaMalloc((void**)&Bd,size);
dim3 dimGrid(1,1);
dim3 dimBlock(Length,Length);
FuncG<<<dimGrid,dimBlock>>>(Ad,Bd);
cudaMemcpy(C,Ad,size,cudaMemcpyDeviceToHost);
cudaMemcpy(D,Bd,size,cudaMemcpyDeviceToHost);
for(int i=0;i<Length;i++){
printf("%d %d\n",C[i],D[i]);
}
return 0;
カーネル関数:
__global__ void FuncG(int *Ad,int *Bd){
int tx=threadIdx.x;
int ty=threadIdx.y;
Ad[tx]=tx;
Bd[ty]=ty;
}