CUDA __threadfence () - PullRequest
       5

CUDA __threadfence ()

18 голосов
/ 08 марта 2011

Я просмотрел много постов на форуме и документацию NVIDIA, но я не мог понять, что делает __threadfence() и как его использовать.Может ли кто-нибудь объяснить, какова цель этого внутреннего?

1 Ответ

43 голосов
/ 08 марта 2011

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

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

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

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

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

  1. сохранить ваши данные
  2. __threadfence()
  3. атомно пометить флаг

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...