结果的预期值= 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);
}
答案 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/