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