Я пытаюсь реализовать алгоритм оптимизации роя частиц с использованием параллельных вычислений в 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)
Плохой ответ