Я закончил писать ядро OpenCL для расчетов термодинамики и наблюдал действительно странную ошибку. Мое ядро выглядит следующим образом:OpenCL использование программы аварийных ошибок регистра
__kernel void energy(... float3 dest, int nlocal, ...){
int i = get_global_id(0);
float3 ev = {0.0f, 0.0f, 0.0f};
for(...){
//some thermo calculations, adding values to evx and evy
ev.x +=...;
ev.y +=...;
}
//Then I want to save the result in dest[i].
//Program exits at next two line
dest[i].x = ev.x;
dest[i].y = ev.y;
я получаю "неотображённые Memory" и Segfault ошибку. Я получаю ту же ошибку при попытке распечатать значение с помощью printf. Похоже, программа не может прочитать значение. Запись на него работает хотя! (Возможно, из-за некоторых оптимизаций компилятора) Теперь, если я использую другое значение регистра с плавающей запятой, я получаю ту же ошибку. Но если я изменю последние строки на что-то вроде этого (без использования ev.x или ev.y)
dest[i].x = i/nlocal*3.1f
dest[i].y = ...;
все будет, как ожидается, и я не получаю сообщение об ошибке.
Это тоже работает:
int i = ...
float3 = {0.0f, ...}
dest[i].x = ev.x;
Но как-то после фактического расчета не представляется возможным больше.
Программа работает на архитектуре Nvidia K40m, Kepler.
Проблема также может быть здесь: 'эв. x + = ...; ev.y + = ...; '. CL компилятор просто удалит код, который не влияет на выходной массив. Отправьте пример воспроизводимого кода, иначе мы не сможем вам помочь. – DarkZeros
Спасибо за вашу помощь, я изменил свой код. Сейчас это все ядро. – Noahnder