Я пытаюсь использовать графический процессор для обработки изображений. В моей функции ядра я уловил исключение «несоосность» как
Поток пытался прочитать или записать данные, которые выровнены на оборудовании, которое не обеспечивает выравнивание. Например, 16-битные значения должны быть выровнены по 2-байтовым границам; 32-битные значения на 4-байтовых границах и т. Д.
Я сократил код ядра только до циклов, но у меня все еще есть эта проблема. мой уменьшенный функция ядра:
__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
Я использую Visual Studio 2015 с плагином CodeXL и запускаю программу на AMD Spectre (Radion R7).
Что может вызвать эту проблему?
Задача ещё не решена.
Других решений пока нет …