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

问题描述 投票:0回答:1

我正在开发一个使用 cl 作为主机编译器的 CUDA 项目(Visual Studio 2019,MSVC v14.29.30133)。我遇到了与 CUDA 标准库

<atomic>
中的 C++11
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_prelude.h
包含,我可以确认该标头存在于
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include
处的MSVC包含路径中。 有趣的是,
#include <atomic>
行上没有报告错误,但仅在随后使用
<atomic>
中的内容时报告错误。编译器似乎找到并包含了标头,但无法识别其中的定义。

任何关于为什么会发生这些错误以及如何解决这些错误的见解将不胜感激!

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

compiler-errors cuda atomic nvcc stdatomic
1个回答
0
投票

我将

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

© www.soinside.com 2019 - 2024. All rights reserved.