2013-05-17 3 views
0
ошибку сегментации

Я с трудом определить, почему ошибка сегментации происходит случайным образом на следующей строке в моем коде:OpenCL clEnqueueReadBuffer случайно

rc = clEnqueueReadBuffer(ompctx->clctx->queue, 
       ompctx->result, CL_TRUE, 0, sizeof(int), &pos, 
       1, &ompctx->clctx->ev1, NULL); 

ompctx-> Результатом является объект памяти используется как массив целых чисел и позиция является объект хозяина объявлен как:

int pos 

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

Я использую AMD APP v2.8, и я попытался использовать i7 с 8 процессорами и AMD FirePro v8800. Оба имеют ту же проблему.

Я пропустил что-то очевидное? Что еще я должен проверить?

+0

Возможно, вы разыскиваете указатель 'null'? Не видя большего кода, это будет трудно сказать. –

+0

Я печатаю указатели, и все они выглядят нормально до вызова ReadBuffer. Очередь используется прямо перед этим вызовом, и она всегда преуспевает, результат также используется с успехом, pos - глобальная переменная, и события не имеют никакого значения, если они есть или нет. Поэтому я не думаю, что это разыменование нулевого указателя. –

+0

Вы пробовали использовать платформу Intel OpenCL? Это дает вам такую ​​же ошибку? – Ani

ответ

4

Поскольку у вас есть аргумент блокировки, установленный в CL_TRUE, clEnqueueReadBuffer не вернется, пока передача не будет завершена, а это значит, что все предыдущие команды, установленные перед передачей, также должны быть завершены. Вполне вероятно, что один из ваших предыдущих вызовов OpenCL выделил команду, которая выписывает границы или что-то (потому что это происходит случайным образом), и команда не выполняется до вызова clEnqueueReadBuffer. Попробуйте вызвать clFinish в своей командной очереди после каждого вызова OpenCL, который вы делаете, чтобы принудительно выполнить каждую команду сразу после ее включения в очередь, и вставить несколько отчетов printf, чтобы вы могли выяснить, какой из них действительно терпит неудачу.

+0

Я закончил это и последовал за крахом в библиотеку cl blas от amd. Забыл о добавлении решения здесь, спасибо за это :-) –

Смежные вопросы