使用CPU时OpenCL段错误

时间:2014-01-17 20:34:09

标签: opencl

我正在使用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,在设置本地内存数组的参数时,我使用的是整个本地内存大小。

提前致谢!

1 个答案:

答案 0 :(得分:0)

我不完全确定它为什么会起作用,但我已经设法找到了解决方案。使用此程序,工作组大小必须为1024.两个NVIDIA卡已将此作为其最大工作组大小,但Intel CPU的最大工作组大小为4096(均由clGetKernelWorkGroupInfo(...CL_KERNEL_WORK_GROUP_SIZE...)返回。这就是为什么GPU工作而CPU没有。

同样,不确定为什么这会使代码工作,但这是一个修复,我会接受它。