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