OpenCL嵌套循环未对齐

时间:2017-04-19 14:41:33

标签: c++ opencl gpgpu codexl

我尝试使用GPU进行图像处理。在我的内核函数中,我抓住了#34;错位"

的例外情况
  

线程试图读取或写入未提供对齐的硬件上未对齐的数据。例如,16位值必须在2字节边界上对齐; 4字节边界上的32位值,依此类推。

我只将内核代码简化为循环,但我仍然遇到了这个问题。我的简化内核函数:

__kernel void TestKernel(
    global const uchar* iImage, 
    global uchar* oImage, 
    uint width,
    uint heigth, 
    uchar dif,
    float power)
{
   uint y = get_global_id(0);

    if (y >= heigth) 
        return; 

    for (uint x = 0; x< width; ++x){
        for (uint i = 0; i < 5; ++i) {
            uint sum = 0;
            for (uint j = 0; j<5; ++j) {
                sum += 3;
            }
        }

    }   
}

(程序在第二个循环中抛出异常)

我使用C ++包装器来调用我的内核

kernel.setArg(iArg++, iImage);
    kernel.setArg(iArg++, oImage);
    kernel.setArg(iArg++, header.GetVal(header.Width));
    kernel.setArg(iArg++, header.GetVal(header.Height));
    kernel.setArg(iArg++, (unsigned char)10);
    kernel.setArg(iArg++, saturation);


    queue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(header.GetVal(header.Height)), cl::NDRange(128));

oImageiImagecl::Buffer

saturationfloat

header.GetVal()返回int

我使用带有CodeXL插件的Visual Studio 2015并在AMD Spectre(Radion R7)上运行该程序。

什么可能导致这个问题?

0 个答案:

没有答案