Прежде всего, я впервые почувствовал необходимость задать вопрос по StackOverflow, но я решил свою проблему, пытаясь установить и взломать свой собственный код OpenCL.Однако, учитывая, как мало полезной и доступной информации по отладке для OpenCL я нашел за пару месяцев, в течение которых я ее изучал, я подумал, что попытка записать это может помочь кому-то еще на моем месте, поскольку решение моей проблемыне было очевидно для новичка.
Контекст: я пишу raytracer с ограничениями на моем C, но разрешением использовать OpenCL для школы.Я уже собрал и отладил RNG-библиотеку OpenCL, которую я могу вызывать из простых ядер, портировал некоторые алгоритмы на подфункции, но все еще изучаю управление памятью и разложение больших алгоритмов на организованную последовательность ядер для постановки в очередь.
ОС: Xubuntu 18.04 Платформа: NVIDIA CUDA |Устройство: GeForce GTX 950M |Версия: OpenCL 1.2 CUDA
Я получил несогласованность в моих данных: printf () сказал мне, что мои данные были для моего второго ядра (того, где возникала проблема) и связного;но он никогда не встречал проверки в соответствующих операторах «если».Хуже того, мне показалось, что все утверждения, которые были «ложными» и были странными из-за потока управления графическим процессором, были в замешательстве.
Две страницы в Интернете, посвященные темам, наиболее похожим на то, что яполучал, но оба не были моей проблемой (может быть, именно поэтому я и добавляю их):
https://community.amd.com/thread/225707
https://computergraphics.stackexchange.com/questions/4115/gpu-branching-if-without-else
Для отладки,Я использовал следующий фрагмент в подфункции, которая возвращает цвет пикселя в основное ядро (которое его вызывает).
if (isequal((float)scene->camera.c_to_w.sF, (float)0.))
{
return ((float3)(0., 255., 0.));
}
else if (isequal((float)scene->camera.c_to_w.sF, (float)0.5))
{
return ((float3)(255., 0., 255.));
}
else //if (some other condition)
return ((float3)(255., 255., 0.));
Функция без этого фрагмента вернула черный экран.В противном случае он вернул экран цвета одного из операторов if в соответствии со следующим поведением.Комментируя, соответственно, «else» операторы и играя со значениями, я понял, что: пока существует этот фрагмент, один из этих «return (R, G, B)» обязательно будет прочитан;если хотя бы один из них был истинным, он был бы прочитан, иначе поведение было бы последовательно первым условием последовательности if-else этой переменной длины.