CUDA __threadfence()

Я прошел через многие руководства по форуму и nvidia, но я не мог понять, что  __threadfence() и его использование?

Спасибо.

Ответы

Ответ 1

Обычно нет гарантии, что если один блок что-то пишет в глобальную память, другой блок "увидит" его. Также нет гарантии относительно порядка записи в глобальную память, за исключением блока, который его выпустил.

Есть два исключения:

  • атомные операции - они всегда видны другими блоками
  • threadfence

Представьте, что один блок создает некоторые данные, а затем использует атомную операцию для отметки флага, что данные есть. Но возможно, что другой блок увидит флаг, но будет читать неправильные или неполные данные.

__threadfence функция останавливает текущий поток до тех пор, пока его запись в глобальную память не будет гарантирована для всех остальных потоков в сетке. Итак, если вы сделаете что-то вроде:

  • сохранить ваши данные
  • __threadfence()
  • атомно отметить флаг

гарантируется, что если другой блок увидит флаг, он также увидит данные.

Дополнительная литература: Руководство по программированию Cuda, главы B.2.4 и B.5