Mahdi Nejadsahebi Ответов: 2

Функция Opencl atomic_add() возвращает неверное значение


Хорошо провести время

у меня есть проблема в OpenCL 1.2.
Послушайте, у меня есть массив как глобальный в ядре, а размер группы равен 1000.
Проблема в том, что функция atomic_add() работает неправильно.

Мой код ядра :

buffer[3] = 100;
atomic_add(&buffer[3], 1);


если я создам 1000 потоков, то ожидаю, что значение buffer[3] будет равно 1100, не так ли?
но поведение программы не определено.
иногда это будет 1100, иногда 1064, иногда 1093 и т. д...

Что я уже пробовал:

я также включаю расширение opencl, как показано ниже :

#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable


но проблема все равно существует.
в другом проекте я создам простой проект opencl, и atomic_add работает правильно, и я проверил почти всю конфигурацию проекта, но я не знаю, где находится проблема.

Вы не могли бы мне помочь?
спасибо

2 Ответов

Рейтинг:
1

tugrulGtx

```
буфер[3] = 100;
```

это состояние расы. Сделайте это со стороны хоста процессора или другого ядра.


Рейтинг:
0

Richard MacCutchan

Видеть Обзор Атомики OpenCL 2.0[^].


Mahdi Nejadsahebi

Прошу прощения мой друг
я не могу найти свою проблему, когда читаю ссылку, которую вы мне прислали.
не могли бы вы мне объяснить?
хотя я работаю с opencl 1.2.
спасибо

Richard MacCutchan

Извините, я никогда не работал с OpenCL, но вероятность того, что в вашем коде есть что-то неправильное, довольно высока.

Richard MacCutchan

Где определяется буфер и какого он типа? Правильно ли он был инициализирован, как описано в документации?

0x01AA

Никакого голосования с моей стороны. Но это не ответ! Погуглил, выбрал один из первых лучших хитов, скопировал как ответ, больше ничего!

Richard MacCutchan

Пожалуйста, уходи, ты ведешь себя как ребенок.

Mahdi Nejadsahebi

Дорогой Ричард, я уважаю тебя за то, что ты тратишь свое время на меня.
Позвольте мне проверить, и тогда я скажу вам результат.

Mahdi Nejadsahebi

Я не знаю о вас, дорогой друг (0x01AA) ... но спасибо за ваш комментарий.