CUDA中的并行列表减少

Abr*_*m P 1 c parallel-processing cuda gpu

我正在通过Cuda Parallel减少白皮书,但不幸的是我的算法似乎反复产生不正确的结果,我似乎无法弄清楚为什么(当然教科书示例必须有效?当然我只是做了一些非常明显错误的事情?) .这是我的核心功能:

我的定义:

 #define BLOCK_SIZE 512
Run Code Online (Sandbox Code Playgroud)

我的内核功能:

 __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];
}
Run Code Online (Sandbox Code Playgroud)

我的记忆分配:

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

我的设备电话:

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

 total<<<dimBlock, dimGrid>>>(deviceInput, deviceOutput, outputSize);
 cudaDeviceSynchronize();
Run Code Online (Sandbox Code Playgroud)

我的记忆取得:

 cudaMemcpy(hostOutput, deviceOutput, outputSize*sizeof(float), cudaMemcpyDeviceToHost);
Run Code Online (Sandbox Code Playgroud)

最后我的最终计算:

 for (int counter = 1; counter < outputSize; counter++) {
    hostOutput[0] += hostOutput[counter];
 }
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.

sga*_*zvi 5

您的代码的以下行中的内核启动配置不正确.

total<<<dimBlock, dimGrid>>>(deviceInput, deviceOutput, outputSize); 
Run Code Online (Sandbox Code Playgroud)

内核配置的第一个参数是网格大小,第二个参数是块大小.

你应该这样做:

total<<<dimGrid, dimBlock>>>(deviceInput, deviceOutput, outputSize); 
Run Code Online (Sandbox Code Playgroud)

请始终对CUDA运行时函数调用执行错误检查,并检查返回的错误代码以获取程序失败的原因.

您的内核启动应该在当前代码中失败.对cudaDeviceSynchronize呼叫进行错误检查会导致您查看错误结果的原因.