CUDA 和 MSVC 的编译错误:来自<atomic>未定义的标识符

Compilation Errors with CUDA and MSVC: Identifiers from <atomic> Undefined

提问人:user725757 提问时间:11/13/2023 更新时间:11/14/2023 访问量:29

问:

我正在使用 cl 作为主机编译器(Visual Studio 2019、MSVC v14.29.30133)进行 CUDA 项目。我遇到了与 CUDA 标准库中的 C++11 标头相关的错误。输入是<atomic>atomic_prelude.h

$ mingw32-make -f Makefile
D:/za/mingw/mingw64/bin/mingw32-make -f Makefile.Release
mingw32-make[1]: Entering directory 'D:/za/conformal_flow/flo/flo'
"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.3/bin/nvcc" -ccbin "C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl" -arch=sm_61 -Xptxas -O3 --use_fast_math --restrict --expt-relaxed-constexpr --expt-extended-lambda -DUNICODE -D_UNICODE -DWIN32 -DMINGW_HAS_SECURE_API=1 -DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_CUDA  -Xcudafe --display_error_number -Xcudafe --diag_suppress=2906 -Xcudafe --diag_suppress=186  -ID:/za/conformal_flow/flo/dep/eigen -ID:/za/conformal_flow/flo/dep/libigl/include -ID:/za/conformal_flow/flo/flo/include -I"D:/za/conformal_flow/flo/dep/cusplibrary" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.3/include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.3/include/cuda"  src/flo/device/adjacency_matrix_indices.cu -o cudaobj/adjacency_matrix_indices.o -L"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.3/lib/x64" -lcudart -lcurand -licudata -lcudart_static -lcudadevrt -lcusparse -lcusolver -dc

这是我遇到的错误:

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.3\include\cuda\std\detail\libcxx\include\__cuda/atomic_prelude.h(21): error: identifier "ATOMIC_**XXX**_LOCK_FREE" is undefined
      static_assert(ATOMIC_**XXX**_LOCK_FREE == 2, "");
                    ^
C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.3/include\cub/util_device.cuh(237): error: namespace "std" has no member "atomic"
          std::atomic<DeviceEntryStatus> flag;
               ^
C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.3/include\cub/util_device.cuh(237): error: this declaration has no storage class or type specifier
          std::atomic<DeviceEntryStatus> flag;
          ^

C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.3/include\cub/util_device.cuh(237): error: expected a ";"
          std::atomic<DeviceEntryStatus> flag;
                     ^

C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.3/include\cub/util_device.cuh(266): error: class "cub::CUB_200200_610_NS::PerDeviceAttributeCache::DeviceEntry" has no member "flag"
          auto& flag    = entry.flag;
                                ^

其中 XXX 代表 BOOL、CHAR、CHAR16_T......

该文件包含 <atomic>,我可以确认此标头存在于 MSVC include 路径中。 有趣的是,该行没有报告任何错误,而只是在后续使用中的内容时报告错误。编译器似乎找到并包含标头,但无法识别其中的定义。atomic_prelude.hC:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include#include <atomic><atomic>

任何关于这些错误发生的原因以及如何解决这些错误的任何见解将不胜感激!

我尝试了“Xcompiler -std=c++11”但没有效果。

编译器错误 cuda atomic nvcc stdatomic

评论


答:

1赞 user725757 11/14/2023 #1

我添加到INCLUDEPATH中,问题已解决。CUDA 有自己的 std 库,而不是 c++ std 库。NVIDIA GPU Computing Toolkit\CUDA\v12.3\include\cuda\std\detail\libcxx\include