1

私はCudaParallel還元ホワイトペーパーに取り組んでいますが、残念ながら私のアルゴリズムは繰り返し間違った結果を生成するようで、理由を理解できないようです(確かに教科書の例が機能する必要がありますか?確かに私は非常に明白な間違ったことをしているだけですか?) 。これが私のカーネル関数です:

私の定義:

 #define BLOCK_SIZE 512

私のカーネル関数:

 __global__ void total(float * inputList, float * outputList, int len) {
      __shared__ float sdata[2*BLOCK_SIZE];
      unsigned int tid = threadIdx.x;
      unsigned int i = blockIdx.x*(blockDim.x*2) + threadIdx.x;
      sdata[t] = inputList[i]+inputList[i+blockDim.x];
      __syncthreads();
      for (unsigned int s=blockDim.x/2; s>0; s>>=1) {
        if (tid < s) {
          sdata[tid] += sdata[tid + s];
        }
        __syncthreads();
      }
      if (tid == 0) 
        outputList[blockIdx.x] = sdata[0];
}

私のメモリ割り当て:

  outputSize = inputSize / (BLOCK_SIZE<<1);
  cudaMalloc((void**) &deviceInput, inputSize*sizeof(float));
  cudaMalloc((void**) &deviceOutput, outputSize*sizeof(float));
  cudaMemcpy(deviceInput, hostInput, inputSize*sizeof(float), cudaMemcpyHostToDevice);

私のデバイス呼び出し:

 dim3 dimGrid((inputSize-1)/BLOCK_SIZE +1, 1, 1);
 dim3 dimBlock(BLOCK_SIZE,1,1);

 total<<<dimBlock, dimGrid>>>(deviceInput, deviceOutput, outputSize);
 cudaDeviceSynchronize();

私のメモリフェッチ:

 cudaMemcpy(hostOutput, deviceOutput, outputSize*sizeof(float), cudaMemcpyDeviceToHost);

そして最後に私の最終的な計算:

 for (int counter = 1; counter < outputSize; counter++) {
    hostOutput[0] += hostOutput[counter];
 }

どんな助けでもいただければ幸いです。

4

2 に答える 2

5

コードの次の行のカーネル起動構成が正しくありません。

total<<<dimBlock, dimGrid>>>(deviceInput, deviceOutput, outputSize); 

カーネル構成の最初の引数はグリッド サイズで、2 番目の引数はブロック サイズです。

あなたはこれをしているはずです:

total<<<dimGrid, dimBlock>>>(deviceInput, deviceOutput, outputSize); 

常にCUDA ランタイム関数呼び出しでエラー チェックを実行し、返されたエラー コードをチェックして、プログラムの失敗の理由を取得してください。

現在のコードでは、カーネルの起動は失敗するはずです。呼び出しでエラー チェックを行うcudaDeviceSynchronizeと、結果が正しくない理由がわかりました。

于 2013-01-14T11:06:13.390 に答える
3

このコードは、入力サイズがブロック サイズの倍数であると想定しています。inputSize がブロック サイズの倍数でない場合は、inputList 配列の末尾から読み取られます。

于 2013-01-14T10:29:51.113 に答える