CL_OUT_OF_RESOURCES для 2 миллионов операций с 1 ГБ видеопамяти? - PullRequest
5 голосов
/ 21 октября 2010

Кажется, что 2 миллиона операций с плавающей запятой не должны быть большой проблемой, только 8 МБ 1 ГБ ОЗУ графического процессора. Я могу выделить это много раз, а иногда и больше, без проблем. Я получаю CL_OUT_OF_RESOURCES, когда делаю clEnqueueReadBuffer, что кажется странным. Могу ли я узнать, где на самом деле начались проблемы? OpenCL не должен терпеть неудачу как этот в clEnqueueReadBuffer правильно? Должно быть, когда я распределил данные правильно? Есть ли способ получить больше информации, чем просто код ошибки? Было бы здорово, если бы я мог видеть, сколько VRAM было выделено, когда OpenCL объявил CL_OUT_OF_RESOURCES.

Ответы [ 4 ]

8 голосов
/ 16 декабря 2012

У меня была та же проблема, что и у вас (у меня ушёл целый день, чтобы исправить). Я уверен, что люди с такой же проблемой наткнуться на это, поэтому я отвечаю на этот старый вопрос.

Возможно, вы не проверяли максимальный размер рабочей группы для ядра .

Вот как вы это делаете:

size_t kernel_work_group_size;
clGetKernelWorkGroupInfo(kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(size_t), &kernel_work_group_size, NULL);

Мои устройства (2x NVIDIA GTX 460 и процессор Intel i7) поддерживают максимальный размер рабочей группы 1024, но приведенный выше код возвращает примерно 500, когда я передаю ядро ​​Path Tracing. Когда я использовал рабочую группу размером 1024, она явно потерпела неудачу и выдала мне ошибку CL_OUT_OF_RESOURCES.

Чем сложнее становится ваше ядро, тем меньше будет максимальный размер рабочей группы для него (или это, по крайней мере, то, что я испытал).

Редактировать:
Я только что понял, что вы сказали "clEnqueueReadBuffer" вместо "clEnqueueNDRangeKernel" ...
Мой ответ был связан с clEnqueueNDRangeKernel.
Извините за ошибку.
Я надеюсь, что это все еще полезно для других людей.

5 голосов
/ 22 октября 2010

Из другого источника :

- вызов clFinish () возвращает вам статус ошибки для расчета (а не при попытке прочитать данные).
- "из"«Ресурсы» ошибка также может быть вызвана тайм-аутом 5 с, если карта (NVidia) также используется в качестве дисплея
- она ​​также может появляться, если в вашем ядре есть ошибки указателя.

Последующее предложение предлагает сначала запустить ядро ​​на ЦП, чтобы убедиться, что вы не осуществляете доступ к памяти вне пределов.

3 голосов
/ 21 октября 2010

Не вся доступная память может быть обязательно предоставлена ​​для одного запроса на получение. Читайте о фрагментации кучи 1 , 2 , 3 , чтобы узнать больше о том, почему наибольшее выделение, которое может быть успешным, предназначено для самого большого непрерывного блока памяти и как блоки в результате использования памяти разделитесь на более мелкие части.

Дело не в том, что ресурс исчерпан ... Он просто не может найти ни одного куска, достаточно большого, чтобы удовлетворить ваш запрос ...

1 голос
/ 27 августа 2013

Запрещенные доступы в ядре обычно молчат (поскольку при вызове очереди ядра все еще нет ошибок).

Однако, если вы попытаетесь прочитать результат ядра позже с помощью clEnqueueReadBuffer ().Эта ошибка будет отображаться.Это указывает на то, что во время выполнения ядра что-то пошло не так.

Проверьте код ядра на наличие запрещенных операций чтения / записи.

...