我正在使用 CUDA 提供的编程指南自学 CUDA。为了练习,我制作了一个简单的内核来确定数组的最大值并将其返回给 CPU:
__global__ void getTheMaximum(float* myArrayFromCPU, float* returnedMaximum) {
// Store my current value in shared memory.
extern __shared__ float sharedData[];
sharedData[threadIdx.x] = myArrayFromCPU[threadIdx.x];
// Iteratively calculate the maximum.
int halfScan = blockDim.x / 2;
while (halfScan > 0 && threadIdx.x < halfScan) {
if (sharedData[threadIdx.x] < sharedData[threadIdx.x + halfScan]) {
sharedData[threadIdx.x] = sharedData[threadIdx.x + halfScan];
}
halfScan = halfScan / 2;
}
// Put maximum value in global memory for later return to CPU.
returnedMaximum[0] = sharedData[0];
}
myArrayFromCPU
是一个大小为 1024 的浮点值数组。returnedMaximum
是一个包含单个项目的普通数组:计算的最大值。
我对这个算法的想法是,它会迭代地确定最大值,因为它会从当前值的一半块大小中减少值。
但是,当我运行此代码时,我得到不可靠的输出。返回的最大值会有所不同。这是为什么?单个算法如何每次都产生不同的值?
更新:
我也只是在一个街区上跑步。我通过设置 X=1024 的一维块大小来保证这一点。