0

ホストからデバイスへのデータ転送が使用されないようにする方法を試しました。通常、ループを使用してホスト配列の要素に値を割り当て、それをデバイスに転送します。これは、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;
}
4

1 に答える 1

2

お使いのデバイスは、ブロックあたり512スレッドのみをサポートできます。最初の2つのスレッドブロックの寸法の最大寸法は512です。22x22ブロック(484スレッド)は有効なブロックサイズですが、23x23ブロック(529スレッド)はそうではありません。

カーネルが実行されていないため、出力は0になります。これを確認すると、カーネルの起動が無効な実行構成エラーで失敗していることがわかります。この種の起動の失敗をチェックする標準的な方法は、次のようなものです。

FuncG<<<dimGrid,dimBlock>>>(Ad,Bd);
if (cudaPeekAtLastError() != cudaSuccess) {
    // handle error.....
}
于 2012-09-19T10:33:59.917 に答える