3

我正在尝试使用 GPU 进行一些图像处理。在我的内核函数中,我捕获了“未对齐”异常

线程试图在不提供对齐的硬件上读取或写入未对齐的数据。例如,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));

oImage并且iImagecl::Buffer

saturationfloat

header.GetVal()返回int

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

什么会导致这个问题?

4

0 回答 0