0

問題は:

共有配列perBlockMsg[i] は 0 に等しいすべての値を保持しますが、値と同様に 0 より大きい 10 進数値であることが期待されd_msg[]ます。d_msg[]iaは2D配列で、それを1Dにフラット化し、データがデバイスに正常に渡されることを確認しました。

__global__ void add( int *d_msg, int *d_checkSumArray) {

    int i=threadIdx.x;
    int j=blockIdx.x;
    extern  __shared__ int perBlockMsg[];

    if(d_msg[i* gridDim.x + j]<=1)
    {
        perBlockMsg[i]=d_msg[i* gridDim.x + j];
    }

    __syncthreads();

    if(j==2 && i<=gridDim.x)  //here i is the row number
    {
        d_checkSumArray[i]=perBlockMsg[i];
    }
}

カーネル呼び出しは以下のようでした (たとえば) M=7、R=4 で、これら 2 つの変数も動的です

add<<<R,(M+R), (M+R)* sizeof(int)>>>( d_msg, d_checkSumArray ); 

誰かが問題の可能性がある場所を指摘できますか?

4

1 に答える 1

1

これを未回答リストから外すための回答を提供します。

コードで特定された主な問題は、このテスト:

if(d_msg[i* gridDim.x + j]<=1)

正しくありませんでした。次のようになります。

if(d_msg[i* gridDim.x + j]>=1)

質問に示されているように、「0より大きい10進数」をキャプチャします。

また、フォローアップの質問は、共有変数のドキュメントで説明されています。

1 つの方法は、すべての共有変数を単一の動的割り当て (ポインター) で処理することです。

extern  __shared__ int perBlockMsg[];
int *msgLength = perBlockMsg + perBlockMsgLength;
于 2014-08-18T16:24:57.163 に答える