Межблочная синхронизация в 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 для межблочной синхронизации:

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

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

Другие вопросы по тегам