Странное поведение атомарной операции добавления OpenCL - PullRequest
4 голосов
/ 02 ноября 2011

Для проекта мне пришлось погрузиться в OpenCL: дела идут довольно хорошо, за исключением того момента, когда мне нужны атомарные операции. Я выполняю код OpenCL поверх графического процессора Nvidia с последними драйверами. clGetDeviceInfo() запрос CL_DEVICE_VERSION возвращает меня: OpenCL 1.0 CUDA, поэтому я полагаю, что мне нужно обратиться к спецификациям OpenCL 1.0.

Я начал использовать операцию atom_add в своем ядре в буфере __global int* vnumber: atom_add(&vnumber[0], 1);. Это дало мне явно неверные результаты. Таким образом, в качестве дополнительной проверки я переместил инструкцию add в начало ядра, чтобы она выполнялась для каждого потока. Когда ядро ​​запускается с потоками 512 x 512, содержимое vnumber[0] равно: 524288, что в точности равно 2 x 512 x 512, в два раза больше значения, которое я должен получить. Самое смешное, что при изменении операции добавления на atom_add(&vnumber[0], 2); возвращаемое значение равно 65536, что в два раза больше того, что я должен получить.

Кто-то уже испытывал нечто подобное? Я скучаю по чему-то очень простому? Я проверил правильность типов данных, но, похоже, все в порядке (я использую буфер *int и выделяю его с помощью sizeof(cl_int)).

1 Ответ

3 голосов
/ 03 ноября 2011

Вы используете atom_add, который является расширением OpenCL 1.0 для локальной памяти. И все же вы передаете это глобальной памяти. Вместо этого попробуйте atomic_add в OpenCL 1.1, который работает с глобальной памятью.

...