问题描述
我正在尝试做类似的事情:
__global__ void foo()
{
// do stuff
}
__global__ void boo()
{
foo<<<m,n>>>();
}
但是我收到错误消息“从__device__或__global__函数启动内核需要单独的编译模式”
我尝试使用谷歌搜索找到答案,并看到一些有关“动态并行性”的结果,它说它要求我具备3或更高的计算能力(GTX 750 Ti计算能力5)。
我还这样,我需要打开“ rdc”标志,尽管它确实使错误消失了,但无论如何,它都会使编译失败(即使我注释了所有内容)
那我该如何实现我的目标,或者可能是什么问题?
(使用cuda 11.0)
我还添加了“ cudadevrt.lib; cudart.lib;”。在项目属性的链接器中输入
编辑:
当rdc设置为true时出现的错误:
错误MSB3721命令““ C:\ Program Files \ NVIDIA GPU计算工具包\ CUDA \ v11.0 \ bin \ nvcc.exe” -dlink -o“ x64 \ Debug \ crimson cuda.device-link.obj” -Xcompiler“ / EHsc / W3 / nologo / Od / Zi /Fdx64\Debug\vc142.pdb / RTC1 / MDd” -L“ C:\ Program Files \ NVIDIA GPU Computing Toolkit \ CUDA \ v11.0 \ bin / crt” -L“ C:\ Program Files \ NVIDIA GPU计算工具包\ CUDA \ v11.0 \ lib \ x64” cudadevrt.lib cudart.lib cudart_static.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32。 lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib -gencode = arch = compute_50,code = sm_50 -G --machine 64 x64 \ Debug \ CrimsonNet.cu.obj x64 \ Debug \ kernel。 cu.obj”以代码1退出。
编辑2: 我继续进行调查,似乎在链接文件时出现问题,而我在使用rdc时并不完全了解它的工作原理。
解决方法
使用MS VS 2019和CUDA 11.0,以下步骤使我可以创建动态并行(CDP)示例:
-
创建一个新的CUDA运行时项目
-
在生成的kernel.cu文件中,如下修改内核:
__global__ void child_kernel() {printf("hello\n");} __global__ void addKernel(int *c,const int *a,const int *b) { child_kernel << <1,1 >> > (); int i = threadIdx.x; c[i] = a[i] + b[i]; }
-
在项目中...属性... CUDA C ++ ...通用设置生成可重定位设备代码为“是”
-
在项目中...属性... CUDA链接器...常规将
cudadevrt.lib
添加到其他依赖项 -
构建或重建项目,然后应该看到如下输出:
1>------ Rebuild All started: Project: test23,Configuration: Debug x64 ------ 1>Compiling CUDA source file kernel.cu... 1> 1>C:\Users\Robert Crovella\source\repos\test23>"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\bin\nvcc.exe" -gencode=arch=compute_52,code=\"sm_52,compute_52\" --use-local-env -ccbin "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.20.27508\bin\HostX86\x64" -x cu -rdc=true -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\include" -G --keep-dir x64\Debug -maxrregcount=0 --machine 64 --compile -cudart static -g -DWIN32 -DWIN64 -D_DEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Fdx64\Debug\vc142.pdb /FS /Zi /RTC1 /MDd " -o x64\Debug\kernel.cu.obj "C:\Users\Robert Crovella\source\repos\test23\kernel.cu" 1>kernel.cu 1> 1>C:\Users\Robert Crovella\source\repos\test23>"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\bin\nvcc.exe" -dlink -o x64\Debug\test23.device-link.obj -Xcompiler "/EHsc /W3 /nologo /Od /Zi /Fdx64\Debug\vc142.pdb /RTC1 /MDd " -L"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\bin/crt" -L"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\lib\x64" cudadevrt.lib cudart_static.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib cudart.lib -gencode=arch=compute_52,code=sm_52 -G --machine 64 x64\Debug\kernel.cu.obj 1>cudadevrt.lib 1>cudart_static.lib 1>kernel32.lib 1>user32.lib 1>gdi32.lib 1>winspool.lib 1>comdlg32.lib 1>advapi32.lib 1>shell32.lib 1>ole32.lib 1>oleaut32.lib 1>uuid.lib 1>odbc32.lib 1>odbccp32.lib 1>cudart.lib 1>kernel.cu.obj 1> Creating library C:\Users\Robert Crovella\source\repos\test23\x64\Debug\test23.lib and object C:\Users\Robert Crovella\source\repos\test23\x64\Debug\test23.exp 1>test23.vcxproj -> C:\Users\Robert Crovella\source\repos\test23\x64\Debug\test23.exe ========== Rebuild All: 1 succeeded,0 failed,0 skipped ==========
注意:
-
CUDA 11.0(及更高版本)仅定位将支持CDP的设备。对于早期版本,您可能需要设置设备代码生成目标以匹配支持CDP的GPU(例如
compute_35,sm_35
) -
在MS VS中,MSB3721错误本身并没有太大用处。它只是表明“出了点问题”。为了从Visual Studio获得更多有用的信息,您应该增加控制台输出的详细程度。确切的方法会因VS版本而异,但是您可以通过搜索this来找到说明。目的是增加详细程度,以便VS在出现错误时向您显示
nvcc
生成的实际输出。 -
对于CUDA 11.0 / VS2019,不需要添加
cudadevrt.lib
,因为它已经包含在项目中。对于其他/旧版本,可能有必要。
如果您仍然遇到问题,建议您增加详细程度,以更好地了解确切的问题。您还应该严格按照上面列出的步骤操作,以确保您理解它们(例如,从一个新项目开始)。如果您仍然遇到问题,请在增加详细程度之后,使用实际代码以及控制台编译输出来发布新问题。
,我仍然不知道是什么原因引起的,但是在删除了与Nvidia有关的所有内容(驱动程序除外),然后通过CUDA安装程序重新安装了所有内容之后,该错误消失了,现在可以正常使用了。