Очень странное поведение OpenCL CL_OUT_OF_RESOURCES - PullRequest
3 голосов
/ 11 октября 2019

Я пишу довольно большую программу 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 и другие безвредные изменения по-прежнему изменяют способ выполнения кода в зависимости от того, где они находятся.

Это определенно проблема, укоренившаяся во время компиляции.

Ответы [ 2 ]

1 голос
/ 14 октября 2019

большая программа OpenCL с большим количеством вызовов функций и рекурсией

OpenCL C 2.2 pdf, страница 46:

Recursion is not supported.

Я понятия не имею, почему printf меняет вещи, но ваша программа использует функцию, которая явно не поддерживается.

0 голосов
/ 20 октября 2019

Я нашел решение своей собственной проблемы.

Проблема была вызвана простой ошибкой массива. По-видимому, OpenCL не ловит эти типы ошибок. Таким образом, любые попытки чтения или записи за пределы могут вызвать молчаливое повреждение памяти, как в моем случае. Поврежденная память была инструкциями для самой программы, отсюда и случайные результаты выполнения.

Проблема также была частично вызвана незаконным использованием рекурсии, как упоминалось в mogu. Опять же, компилятор OpenCL позволяет этому незаметно повредить память программы.

Так что будьте осторожны с разработчиками OpenCL.

...