我正在使用OpenCL实现FFT算法(具体来说,来自 OpenCL in Action的算法。它可以在两个不同的NVIDIA GPU(Tesla K20c和GeForce GTX 650)上正常运行但是在我的英特尔CPU上运行它时,会给我一个分段错误。
我在内核代码中找到了问题,但它没有意义。包含错误的唯一两行是在下面的块中对本地内存的最后两次写入。没有其他内存写入会导致CPU出现问题,并且它们不会导致GPU出现问题。
__kernel void fft_init(__global float2 *g_data, __local float2 *l_data,
uint points_per_group, uint size, int dir) {
uint4 br, index;
uint points_per_item, g_addr, l_addr, i, fft_index, stage, N2;
float2 x1, x2, x3, x4, sum12, diff12, sum34, diff34;
points_per_item = points_per_group/get_local_size(0);
l_addr = get_local_id(0) * points_per_item;
g_addr = get_group_id(0) * points_per_group + l_addr;
for(i=0; i<points_per_item; i+=4) {
...
l_data[l_addr] = sum12 + sum34;
l_data[l_addr+1] = diff12 + diff34;
l_data[l_addr+2] = sum12 - sum34;
l_data[l_addr+3] = diff12 - diff34;
l_addr+= 4;
}
我也知道问题不是l_addr + {2,3}
,因为内核中的数组至少被访问l_addr + 4
。
之前有没有人遇到这样的问题,或者对我如何解决这个问题有任何想法?要运行内核,我使用EnqueueNDRangeKernel,在设置本地内存数组的参数时,我使用的是整个本地内存大小。
提前致谢!
答案 0 :(得分:0)
我不完全确定它为什么会起作用,但我已经设法找到了解决方案。使用此程序,工作组大小必须为1024.两个NVIDIA卡已将此作为其最大工作组大小,但Intel CPU的最大工作组大小为4096(均由clGetKernelWorkGroupInfo(...CL_KERNEL_WORK_GROUP_SIZE...)
返回。这就是为什么GPU工作而CPU没有。
同样,不确定为什么这会使代码工作,但这是一个修复,我会接受它。