通过求和数组,OpenCL,交织寻址来得到无效结果

时间:2014-11-15 21:00:19

标签: c++ opencl gpu reduction

我开始学习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");
    }

提前感谢您的提示

1 个答案:

答案 0 :(得分:0)

我测试了一下。您必须将stride * 2设置为(stride * 2)!对于我的解决方案,它运作良好。

if ((i % (stride*2)) == 0 && (i + stride) < size) {
    array[i]  += array[i+stride];
}