首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CUDA内核中调用内核

在CUDA内核中调用内核
EN

Stack Overflow用户
提问于 2020-10-24 17:26:44
回答 2查看 1.9K关注 0票数 1

我试着做这样的事情:

代码语言:javascript
复制
__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\NVIDIA GPU计算”Toolkit\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 \NVIDIA GPU计算工具包\CUDA\v11.0\bin/crt”-L"C:\Program \NVIDIA计算工具包\CUDA\v11.0\lib\x64“cudadevrt.lib cudart.lib cudart_static.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib winspool.lib uuid.lib 32.lib 32.lib 32.lib oleauto32.lib uuid.lib odbc32.lib odbcc32.lib -gencode=arch=compute_50,code=sm_50 -G --机器64 x64\Debug\CrimsonNet.cu.obj x64\Debug\kernel.cu.obj“与代码1一起退出。

编辑2:我继续调查,问题似乎发生在链接文件时,我不完全理解它是如何使用rdc的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-26 20:33:30

我仍然不知道是什么导致了这个问题,但是在删除了与Nvidia相关的所有内容之后,除了驱动程序,然后通过CUDA安装程序重新安装了所有的东西,错误消失了,现在运行良好。

票数 0
EN

Stack Overflow用户

发布于 2020-10-26 03:27:40

使用MS VS 2019和CUDA 11.0,以下步骤允许我创建一个动态并行(CDP)示例:

  1. 创建一个新的CUDA运行时项目
  2. 在生成的kernel.cu文件中,修改内核如下: __global__ void child_kernel() {printf("hello\n");} __global__ void addKernel(int *c,const int *a,const int *b) { child_kernel << <1,1 >> > ();
  3. 在Project...Properties...CUDA C++...Common set中,生成可释放的设备代码以“是”
  4. 在Project...Properties...CUDA Linker...General中将cudadevrt.lib添加到附加依赖项
  5. 构建或重新构建项目时,您应该会看到如下输出: 重建所有已启动的:项目: test23,配置: Debug x64 - 1>Compiling CUDA源文件kernel.cu.1> 1>C:\Users\Robert Crovella\source\repos\test23>"C:\Program \NVIDIA计算Toolkit\CUDA\v11.0\bin\nvcc.exe“-gencode=arch=compute_52,code=\"sm_52,机器64 -编译-cudart静态-g -DWIN32 -DWIN64 -D_DEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Fdx64\Debug\vc142.pdb /FS /Zi /RTC1 /MDd“/MDd C:\Users\Robert en21 en23#”C:\Program\NVIDIA GPU计算工具包\CUDA\v 11.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 \NVIDIA GPU计算工具包\CUDA\v11.0\bin/crt“-L"C:\Program \NVIDIA GPU计算工具包\CUDA\v11.0\x64”cudadevrt.lib cudart_static.lib kernel32.lib user32.lib gdi32.lib winspool“。uuid.lib odblg32.lib odbccp32.lib cudart.lib -gencode=arch=compute_52,Crovella\source\repos\test23\x64\Debug\test23.lib -G --机器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>ole32.lib 1>uuid.lib 1>odbc32.lib and code=sm_52 C:\Users\Robert和object C:\Users\Robert en22#。vcxproj Crovella\source\repos\test23\x64\Debug\test23.exe C:\ -> \Robert-> ==========重新构建All: 1成功,0失败,0跳过==========

备注:

  1. CUDA 11.0 (及更高)只针对支持CDP的设备。对于早期版本,您可能需要设置设备代码生成目标,以匹配支持CDP的GPU (例如compute_35,sm_35)。
  2. 在MS中,MSB3721错误本身并不那么有用。它只是表示“出了问题”。要从Visual获得更多有用的信息,您应该增加控制台输出的详细性。这样做的确切方法将因VS版本而异,但您可以通过搜索(如 )找到说明。目标是增加详细的内容,因此VS将在出现错误时向您显示nvcc生成的实际输出。
  3. 对于CUDA 11.0/ is 2019,添加cudadevrt.lib是不必要的,因为它已经包含在项目中。对于其他/旧版本,这可能是必要的。

如果你仍然有困难,我建议你增加详细,以更好地了解确切的问题。您还应该尝试上面列出的步骤,以确保您理解它们(即从一个新项目开始)。如果仍然有问题,请在增加详细内容后,在实际代码以及控制台编译输出中发布一个新问题。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64516177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档