Я пишу довольно большую программу OpenCL с большим количеством вызовов функций. У меня были проблемы с ошибками CL_OUT_OF_RESOURCES, но мне удалось исправить проблему с помощью простого оператора printf. Это фрагмент кода, о котором идет речь:
...
const float color = raytrace(depthMap, triangles, ...tonMoreParameters...);
if (i == 1234) {
printf("hello\n");
}
outImage[i] = color;
...
Это работает нормально, но если я уберу функцию printf, программа вылетит. Если я сохраню это, это не так. При сбое выдает ошибку CL_OUT_OF_RESOURCES. Кто-нибудь может объяснить, почему добавление printf заставляет программу , а не исчерпать ресурсы? Как я могу заставить эту работу работать без этого бесполезного printf?
Соответствующие спецификации:
- OpenCL 1.2
- NVIDIA GTX 660
- Использование Java JOCL в качествекод хоста
РЕДАКТИРОВАТЬ:
Я заметил, что размещение операторов printf в других местах меняет способ работы кода. Некоторые операторы printf приводят к тому, что программа выводит разные числовые результаты, в то время как другие приводят к сбою.
Даже изменение кода, который никогда не выполняется, приводит к значительным изменениям в вычислениях. Как будто изменение любого кода случайным образом влияет на его выполнение.
Является ли это признаком неисправной видеокарты? Или, возможно, ошибка в компиляторе OpenCL?
EDIT 2
Как оказалось, рекурсия не является проблемой. Я удалил все рекурсивные вызовы, но printfs и другие безвредные изменения по-прежнему изменяют способ выполнения кода в зависимости от того, где они находятся.
Это определенно проблема, укоренившаяся во время компиляции.