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