CUDA atomicAdd_block не определен
Согласно Руководству по программированию CUDA , «атомарные функции являются атомарными только по отношению к другим операциям, выполняемым потоками определенного набора ... атомарность всего блока: атомарность для всех потоков CUDA в текущей программе, выполняемых в том же блоке потока, что и текущая. поток. Они имеют суффикс _block, например "
Однако я не могу использовать
atomicAdd_block
в то время как мой код отлично скомпилирован с
atomicAdd
. Есть ли какой-нибудь заголовок или библиотека, которую я должен добавить или связать?
2 ответа
atomicAdd()
давно поддерживается более ранними версиями CUDA и более старыми микроархитектурами. Тем не мение,
atomicAdd_system()
а также
atomicAdd_block
были представлены IIANM с микроархитектурой Pascal в 2016 году. Минимальная вычислительная мощность, при которой они поддерживаются, составляет 6.0 . Если вы ориентируетесь на CC 5.2 или более раннюю версию или если вашей версии CUDA несколько лет, они могут быть вам недоступны.
На самом деле это действительно так, поскольку даже для текущей версии CUDA nvcc по умолчанию будет использовать Compute Capability 5.2, если другое значение не указано с
-gencode
или
-arch
(например, если вы запустите
nvcc -o out my_file.cu
).
Как сказал Роберт, решение состоит в том, чтобы добавить
-arch=sm_70
в компиляции или для тех, кто использует CMake - добавить
set(CMAKE_CUDA_ARCHITECTURES 70)
в их CMakeLists.txt