Межблочная синхронизация в CUDA - PullRequest
0 голосов
/ 14 декабря 2018

Я искал месяц для этой проблемы.Я не могу синхронизировать блоки в CUDA.

Я прочитал много постов об atomicAdd, кооперативных группах и т. Д. Я решил использовать глобальный массив, чтобы блок мог записывать один элемент глобального массива.После этой записи поток блоков ожидает (т. Е. Перехватывается в цикле while), пока все блоки не записывают глобальный массив.

Когда я использовал 3 блока, моя синхронизация работает хорошо (потому что у меня 3 SM).Но использование 3 блоков дает мне 12% загрузки.Поэтому мне нужно использовать больше блоков, но они не могут быть синхронизированы.Проблема в том, что блок на SM ожидает другие блоки, поэтому SM не может получить другой блок.

Что я могу сделать?Как можно синхронизировать блоки, когда количество блоков превышает количество SM?

Спецификация CUDA-GPU: CC.6.1, 3 SM, windows 10, VS2015, графическая карта GeForce MX150.Пожалуйста, помогите мне в этой проблеме.Я использовал много кодов, но ни один из них не работает.

1 Ответ

0 голосов
/ 14 декабря 2018

Методы модели программирования CUDA для межблочной синхронизации:

  1. (неявно) Используйте сам запуск ядра.Перед запуском ядра или после его завершения все блоки (в запущенном ядре) синхронизируются с известным состоянием.Концептуально это верно независимо от того, запускается ли ядро ​​из кода хоста или как часть запуска CUDA Dynamic Parallelism.

  2. (явный) Использование синхронизации сетки в CUDA Cooperative groups ,У этого есть множество требований к поддержке, которые вы начинаете изучать в своем другом вопросе .Самое простое определение поддержки - если установлено соответствующее свойство (cooperativeLaunch).Вы можете запросить свойство программно, используя cudaGetDeviceProperties().

...