Обычно нет гарантии, что если один блок что-то записывает в глобальную память, другой блок «увидит» это. Также нет гарантии относительно порядка записи в глобальную память, за исключением блока, который его выдал.
Есть два исключения:
- атомарные операции - они всегда видны другим блокам
- threadfence
Представьте, что один блок производит некоторые данные, а затем использует атомарную операцию, чтобы пометить флаг, что данные есть. Но возможно, что другой блок увидит флаг, но прочитает неверные или неполные данные.
__threadfence
функция останавливает текущий поток, пока его записи в глобальную память не будут гарантированно видны всем другим потокам в сетке. Итак, если вы делаете что-то вроде:
- сохранить ваши данные
__threadfence()
- атомно пометить флаг
гарантируется, что если другой блок увидит флаг, он также увидит данные.
Дополнительная литература: Руководство по программированию Cuda, главы B.2.4 и B.5