【发布时间】:2012-11-03 20:09:18
【问题描述】:
我正在使用 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 的一维块大小来保证这一点。
【问题讨论】:
-
保持线程块的扭曲同步。在每次
while迭代结束时使用__syncthreads()。 -
谢谢,不过我只是在一个块上运行。我还需要这样做吗?
标签: cuda