Межблочная синхронизация в CUDA
Я искал месяц для этой проблемы. Я не могу синхронизировать блоки в CUDA.
Я прочитал много постов об atomicAdd, кооперативных группах и т. Д. Я решил использовать глобальный массив, чтобы блок мог записывать один элемент глобального массива. После этой записи поток блоков ожидает (т.е. попадает в цикл while), пока все блоки не записывают глобальный массив.
Когда я использовал 3 блока, моя синхронизация работает хорошо (потому что у меня 3 SM). Но использование 3 блоков дает мне 12% загрузки. Поэтому мне нужно использовать больше блоков, но они не могут быть синхронизированы. Проблема в том, что блок на SM ожидает другие блоки, поэтому SM не может получить другой блок.
Что я могу сделать? Как можно синхронизировать блоки, когда блоков больше, чем количество SM?
Спецификация CUDA-GPU: CC. 6.1, 3 SM, windows 10, VS2015, графическая карта GeForce MX150. Пожалуйста, помогите мне в этой проблеме. Я использовал много кодов, но ни один из них не работает.
1 ответ
Методы модели программирования CUDA для межблочной синхронизации:
(неявно) Используйте сам запуск ядра. Перед запуском ядра или после его завершения все блоки (в запущенном ядре) синхронизируются с известным состоянием. Концептуально это верно независимо от того, запускается ли ядро из кода хоста или как часть запуска CUDA Dynamic Parallelism.
(явно) Используйте сеточную синхронизацию в кооперативных группах CUDA. У этого есть множество требований к поддержке, которые вы начинаете изучать в своем другом вопросе. Самое простое определение поддержки - если установлено соответствующее свойство (
cooperativeLaunch
). Вы можете запросить свойство программно, используяcudaGetDeviceProperties()
,