С точки зрения общей памяти __syncthreads()
просто сильнее, чем __threadfence()
. Что касается глобальной памяти - это две разные вещи.
__threadfence_block()
останавливает текущий поток, пока все записи в общую память не будут видны другим потокам из того же блока. Это предотвращает оптимизацию компилятора путем кэширования записей в общую память в регистрах. не синхронизирует потоки, и не обязательно, чтобы все потоки фактически достигли этой инструкции.
__threadfence()
останавливает текущий поток, пока все записи в общую и глобальную память не будут видны всем другим потокам.
__syncthreads()
должен быть достигнут всеми потоками из блока (например, без расходящихся if
операторов) и обеспечивает выполнение кода, предшествующего инструкции до инструкций, следующих за ней, для всех потоков в блок.
В вашем конкретном случае инструкция __threadfence()
используется, чтобы убедиться, что записи в глобальный массив result
видны всем. __syncthreads()
будет просто синхронизировать потоки только в текущем блоке, без принудительной записи в глобальную память для другого блока. Более того, в тот момент кода, который находится внутри ветви if
, только один поток выполняет этот код; использование __syncthreads()
приведет к неопределенному поведению графического процессора, что, скорее всего, приведет к полной десинхронизации ядра.
Ознакомьтесь со следующими главами Руководства по программированию в CUDA C:
- 3.2.2 «Общая память» - пример умножения матриц
- 5.4.3 «Инструкция по синхронизации»
- B.2.5 "летучий"
- B.5 «Функции забора памяти»