Для проекта мне пришлось погрузиться в OpenCL: дела идут довольно хорошо, за исключением того, что теперь мне нужны атомарные операции. Я выполняю код OpenCL поверх графического процессора Nvidia с последними драйверами. clGetDeviceInfo() запрос CL_DEVICE_VERSION возвращает мне: OpenCL 1.0 CUDA, поэтому я думаю, что мне нужно обратиться к спецификациям OpenCL 1.0.
Я начал использовать операцию atom_add в своем ядре с буфером __global int* vnumber: atom_add(&vnumber[0], 1);. Это дало мне явно неправильные результаты. Таким образом, в качестве дополнительной проверки я переместил инструкцию добавления в начало ядра, чтобы она выполнялась для каждого потока. Когда ядро запускается с потоками 512 x 512, содержимое vnumber[0] равно: 524288, что равно 2 x 512 x 512, что в два раза превышает значение, которое я должен получить. Самое смешное, что при изменении операции добавления на atom_add(&vnumber[0], 2); возвращаемое значение равно 65536, опять же в два раза больше, чем я должен получить.
Кто-то уже сталкивался с чем-то подобным? Я упускаю что-то очень простое? Я проверил правильность типов данных, но все в порядке (я использую буфер *int и выделяю его с помощью sizeof(cl_int)).