CUDA在编译期间无法识别nvcuda名称空间

irr*_*rom 1 cuda compiler-errors compilation

我正在关注使用V100张量核心的CUDA 教程.我的MWE代码:

$ cat src/wmma.cu
#include <cuda_runtime_api.h>
#include <mma.h>
using namespace nvcuda;
int main(void){
    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

用CUDA 9.0编译它,

$ nvcc src/wmma.cu
src/wmma.cu(10): error: name must be a namespace name

1 error detected in the compilation of "/gpfs0/scratch/1430008/tmpxft_0002054c_00000000-8_wmma.cpp1.ii".
Run Code Online (Sandbox Code Playgroud)

如果我添加选项--gpu-architecture=compute_62,我仍然会得到相同的错误. CPATH设置为/opt/cuda/9.0/include:,所以我相信我没有找到头文件的困难.

当我注释掉using namespace nvcuda它时,它会按预期编译并执行.

题:

  1. 为什么我对这个琐碎代码的编译失败了?

tal*_*ies 5

为什么我对这个琐碎代码的编译失败了?

因为您必须指定支持这些功能的编译体系结构,否则它们是未定义的:

$ cat nvnvnv.cu 
#include <cuda_runtime_api.h>
#include <mma.h>
using namespace nvcuda;
int main(void){
    return 0;
} 


$ nvcc nvnvnv.cu 
nvnvnv.cu(3): error: name must be a namespace name

1 error detected in the compilation of "/tmp/tmpxft_00005444_00000000-8_nvnvnv.cpp1.ii".
Run Code Online (Sandbox Code Playgroud)

默认编译架构sm_30在我正在使用的编译器上(CUDA 9.2).指定正确的体系结构会使错误消失:

$ nvcc -arch=sm_70 nvnvnv.cu 

$
Run Code Online (Sandbox Code Playgroud)

引用你的(非常有用的)CUDA 标签wiki:

如果您在编译设备代码时发现CUDA关键字出现语法错误,请确保使用nvcc进行编译,并确保源文件具有预期的.cu扩展名.如果您发现未找到CUDA设备函数或功能命名空间(原子函数,warp投票函数,半精度算术,协作组等),请确保显式传递编译参数,以启用体系结构设置支持这些功能.