OpenCL 2.0 - гонка в программе только с атомами
В статье "Гетерогенные модели беспроблемной памяти" автор утверждает следующее:
"... в OpenCL 2.0 можно написать программу, которая полностью состоит из атомов, если эти атомы не используют области правильно..."
Как это возможно? Может кто-нибудь объяснить это?
1 ответ
В спецификации OpenCL 2.0 (стр. 14) говорится, что программа содержит гонку данных, если:
он содержит два действия в разных рабочих элементах или потоках хоста, где
одно действие изменяет ячейку памяти, а другое - считывает или изменяет ту же ячейку памяти, и
по крайней мере одно из этих действий не является атомарным, или соответствующие области памяти не являются включающими, и
действия - это глобальные действия, неупорядоченные отношением global-случаем-до, или локальные действия, неупорядоченные отношением local-случаем-до.
Второе предложение подразумевает, что даже если оба действия являются атомарными, вы все равно можете иметь гонку данных, если области памяти не являются "включающими". Пример не включающих областей памяти: попытка синхронизации между рабочими элементами на разных устройствах с использованием workgroup
объем.
На практике вполне может быть, что ничего плохого не произойдет, если ваши прицелы не являются инклюзивными. Но технически программа с не включающими областями памяти нарушает контракт, определенный в спецификации, поэтому ее поведение не определено.