我开始学习OpenCl,并且作为我必须编写的程序之一,它对数组的所有元素求和。
该程序应该很简单,我不知道今天出了什么问题,但无法正常工作。可以,但是有时显示错误的结果(有时没有)。
我们拥有的元素越多,获得错误结果的机会就越大(尤其是在16536之后)
元素的数量始终等于2的幂。
有人可以告诉我,这是怎么了?
内核:
__kernel void Reduction_InterleavedAddressing(__global uint* array, uint stride)
{
unsigned int i = get_global_id (0);
unsigned int size = get_global_size(0);
if ((i % stride*2) == 0 && (i + stride)<size){
array[i] += array[i+stride];
}
}
内核调用:
unsigned int stride = 1;
clErr = clSetKernelArg(m_InterleavedAddressingKernel, 0, sizeof(cl_mem), (void*)&m_dPingArray);
for (; stride <= m_N / 2 ; stride*=2){
clErr = clSetKernelArg(m_InterleavedAddressingKernel, 1, sizeof(cl_int), (void*)&stride);
clErr = clEnqueueNDRangeKernel(CommandQueue, m_InterleavedAddressingKernel, 1, NULL, &globalWorkSize, LocalWorkSize, 0, NULL, NULL);
V_RETURN_CL(clErr, "Error executing kernel");
}
预先感谢您的提示
最佳答案
我作证。您必须将stride * 2
设置为(stride * 2
)!对于我的解决方案,它运作良好。
if ((i % (stride*2)) == 0 && (i + stride) < size) {
array[i] += array[i+stride];
}