Состояние гонки в ядре cuda, множество потоков обращаются к одной переменной - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь реализовать алгоритм оптимизации роя частиц с использованием параллельных вычислений в cuda. Я уже выполнил весь код, но из-за состояния гонки при проверке и установке наилучшего положения совокупности (определяемого 3 числами с плавающей запятой: x, y, value), конечные результаты сильно отличаются между запусками программы.

Эта часть ядра доставляет мне неприятности (все потоки пытаются читать и записывать переменные):

if (value[index] < globals[2] || globals[2] == -1)
    {
        globals[0] = x[index];  
        globals[1] = y[index];
        globals[2] = value[index];
    }

Этот код проверяет, является ли значение этой частицы лучше, чем лучшее значение совокупности, и обновляет его. Если много частиц решат обновить глобальную переменную, произойдет гонка.

У вас есть идеи, как это исправить?

Правильный ответ (0,0,0)

Плохой ответ

...