К сожалению, то, чего вы хотите достичь (межблочная связь / синхронизация), не является строго возможным в CUDA. В руководстве по программированию CUDA говорится, что «блоки потоков должны выполняться независимо: должна быть возможность выполнять их в любом порядке, параллельно или последовательно». Причина этого ограничения состоит в том, чтобы обеспечить гибкость в планировщике потокового блока и позволить коду независимо масштабироваться в зависимости от количества ядер. Единственный поддерживаемый метод межблочной синхронизации - запуск другого ядра: запуски ядра (в том же потоке) являются точками неявной синхронизации.
Ваш код нарушает правило независимости блоков, потому что оно неявно предполагает, что блоки потоков вашего ядра выполняются одновременно (см. Параллельно). Но нет гарантии, что они делают. Чтобы понять, почему это важно для вашего кода, давайте рассмотрим гипотетический графический процессор с одним ядром. Мы также предполагаем, что вы хотите запустить только два потоковых блока. В этом случае ваше ядро spinloop фактически заходит в тупик. Если нулевой блок потока запланирован на ядре первым, он будет зацикливаться вечно, когда доберется до барьера, потому что первый блок потока никогда не имеет возможности обновить счетчик. Поскольку нулевой блок потока никогда не заменяется (блоки потока выполняются до их завершения), он останавливает блок потока одного из ядер, пока он вращается.
Некоторые люди пробовали схемы, подобные вашей, и добились успеха, потому что планировщик случайно спланировал блоки таким образом, что предположения сработали. Например, было время, когда запускалось столько потоковых блоков, сколько у графического процессора имеется SM, означало, что блоки действительно выполнялись одновременно. Но они были разочарованы, когда изменение драйвера, среды выполнения CUDA или GPU опровергло это предположение, нарушив их код.
Для вашего приложения попытайтесь найти решение, которое не зависит от межблочной синхронизации, потому что (за исключением изменения значения в модели программирования CUDA) это просто невозможно.