内核线程分歧较小的内核

时间:2016-12-08 08:43:11

标签: c++ cuda

结果的预期值= 8.结果的接收值= 1;可以指出这有什么问题吗?结果应该具有值8,但它打印出值1.任何人都可以帮忙吗?

#include <stdio.h>`
#include <assert.h>
//define array size 8
#define ARRAY_SIZE 8
__global__ void vecAddKernel(int * A_d) {
//thread Index
unsigned int t = threadIdx.x;
    for (unsigned int stride = blockDim.x / 2; stride > 0; stride /= 2) {
    __syncthreads();
    if (t < stride)
        A_d[t] += A_d[t + stride];
    }
}

int main(int argc, char * * argv) {
    int A_h[ARRAY_SIZE];
   // initializing all values in A_h array to 1
    for (int i = 0; i < ARRAY_SIZE; i++) {
        A_h[i] = 1;
    }
    int * A_d, result;
   // reserving size array A_d of 8 in cuda
    cudaMalloc((void * * ) & A_d, ARRAY_SIZE * sizeof(int));

    cudaMemcpy(A_d, A_h, ARRAY_SIZE * sizeof(int), cudaMemcpyHostToDevice);

    vecAddKernel << < 1, ARRAY_SIZE / 2 >>> (A_d);
   Copy the first index of A_d to the result.
    cudaMemcpy( &result, &A_d[0], sizeof(int), cudaMemcpyDeviceToHost);
  // outputting the value of result
    printf("Result = %d\n", result);
    //freeing the memory
    cudaFree(A_d);
}

1 个答案:

答案 0 :(得分:1)

我不确定你是如何获得Result = 1的。

编译并运行代码时,我看到Result = 4。那是因为内核循环中stride的初始值应该是blockDim.x而不是blockDim.x / 2(循环的第一次迭代应该添加由ARRAY_SIZE / 2分隔的值对,blockDim.x已经ARRAY_SIZE / 2)。

blockDim.x / 2的初始化程序中用blockDim.x替换unsigned int stride会使程序正确无误。

如果您对执行这样的数组缩减感兴趣,可能需要查看__shfl_down以及Kepler引入的其他随机函数:https://devblogs.nvidia.com/parallelforall/faster-parallel-reductions-kepler/