Для проекта мне пришлось погрузиться в 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)
).