gpt4 book ai didi

c++ - 通过对数组、OpenCL、交错寻址求和得出无效结果

转载 作者:太空宇宙 更新时间:2023-11-04 13:43:19 24 4
gpt4 key购买 nike

我开始学习 OpenCl,作为我必须编写的任务之一,我编写了程序,对数组的所有元素求和。

这个程序本来应该很简单的,今天我也不知道是怎么了,但是还是不行。嗯,确实如此,但有时它会显示错误的结果(有时不会)。

我们拥有的元素越多,得到错误结果的机会就越大(尤其是在 16536 之后)元素的数量总是等于二的幂。

谁能告诉我,这是怎么回事?

内核:

__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];
}

关于c++ - 通过对数组、OpenCL、交错寻址求和得出无效结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26950668/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com