Ошибка сегментации ядра openCL в вычислениях пи - PullRequest
0 голосов
/ 19 ноября 2018

Добрый вечер всем,

Я пытаюсь создать ядро ​​openCL для вычисления числа пи.Это школьное задание, и нам сказали использовать это уравнение:

Pi / 4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 - ...

Вот мой дизайн ядра, который в настоящее время генерирует segfault, и я не уверен почему:каждый работник возьмет нумерацию сроков и определит частичное вычисление числа пи.В этом случае я также использую 16 для нумерации.Термины чередуются, поэтому для каждого нечетного термина я вычитаю и каждого четного добавляю.Первый работник отвечает за вычисление первых 16 терминов, следующий работник - за следующие 16 терминов и т. Д., Чтобы создать 16 частичных сумм по 16 цифр каждый.Как только каждый работник рассчитал свою частичную сумму, я попросил первого работника взять все частичные суммы и сложить их для отправки.Я также умножаю на 4, чтобы завершить уравнение.

Моя проблема заключается в том, что я продолжаю получать ошибку сегментации в моей основной программе в следующей строке:

ret = clEnqueueReadBuffer(command_queue, result_buffer, CL_TRUE, 0, sizeof(result), &result, 0, NULL, NULL);

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

float result[1] = {0}; // Initialized at top of main
/* Create buffers to hold the text characters and count */
cl_mem result_buffer = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, sizeof(result), result, NULL);
printf("Final calculated value: %f \n", result[0]);

Может кто-нибудь дать мне представление о том, почему у меня возникает ошибка при попытке чтения буфера результатов обратно в результат?

Полный код можно увидеть в моем github: https://github.com/TreverWagenhals/TreverWagenhals/tree/master/School/Heterogeneous%20Computing/Lab2

Спасибо.

РЕДАКТИРОВАТЬ: Я нашел проблему, которая была в моем коде.Я создавал переменную с именем numWorkers и передавал ее в один из аргументов ядра, что, очевидно, было неверно.В процессе упрощения моего кода я смог удалить его и напрямую использовать переменную global_size, которая теперь решает проблему с ошибкой сегмента и отображает данные при каждом вызове.

Теперь у меня возникла проблема с ядромгде возвращается 4 вместо значения для пи.Я продолжу отлаживать и создам новый вопрос, если не вижу проблемы.У меня будет

...