我尝试使用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));
oImage
和iImage
为cl::Buffer
saturation
是float
header.GetVal()
返回int
我使用带有CodeXL插件的Visual Studio 2015并在AMD Spectre(Radion R7)上运行该程序。
什么可能导致这个问题?