使用动态并行性(CUDA)编译.cu文件

9

我切换了一个支持动态并行的cc 5.2显卡GeForce GTX 980。但是,我无法编译一段简单的代码(来自编程指南)。这里不需要提供代码(只是全局内核调用另一个全局内核)。

1) 我使用VS2013进行编码。在属性页->CUDA C/C++->设备中,我将代码生成属性更改为compute_35,sm_35,以下是输出结果:

1>------ Build started: Project: testCublas3, Configuration: Debug Win32 ------
1>  Compiling CUDA source file kernel.cu...
1>  
1>  C:\programs\misha\cuda\Projects\test projects\testCublas3\testCublas3>"C:\Program      Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\bin\nvcc.exe" -gencode=arch=compute_35,code=\"sm_35,compute_35\" --use-local-env --cl-version 2013 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin"  -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\include"  -G   --keep-dir Debug -maxrregcount=0  --machine 32 --compile -cudart static  -g   -DWIN32 -D_DEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Zi /RTC1 /MDd  " -o Debug\kernel.cu.obj "C:\programs\misha\cuda\Projects\test projects\testCublas3\testCublas3\kernel.cu" 
1>C:/programs/misha/cuda/Projects/test projects/testCublas3/testCublas3/kernel.cu(13): error : kernel launch from __device__ or __global__ functions requires separate compilation mode
1>  kernel.cu
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\BuildCustomizations\CUDA 6.5.targets(593,9): error MSB3721: The command ""C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\bin\nvcc.exe" -gencode=arch=compute_35,code=\"sm_35,compute_35\" --use-local-env --cl-version 2013 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin"  -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\include"  -G   --keep-dir Debug -maxrregcount=0  --machine 32 --compile -cudart static  -g   -DWIN32 -D_DEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Zi /RTC1 /MDd  " -o Debug\kernel.cu.obj "C:\programs\misha\cuda\Projects\test projects\testCublas3\testCublas3\kernel.cu"" exited with code 2.

我猜我需要为这个编译添加另一个选项:-rdc=true,但是我没有找到在VS2013中可以设置它的地方。
2)当我将代码生成属性设置为compute_52,sm_52时,会出现错误:不支持的gpu架构“compute_52”。但是我的cc是5.2,所以我最多只能编译3.5 cc的代码?
谢谢

2
关于不支持的架构消息,CUDA 6.5提供了更新以支持cc5.2。您可以在此处下载:https://developer.nvidia.com/cuda-downloads-geforce-gtx9xx。如果您安装了该更新,特定的错误应该会消失。 - Robert Crovella
谢谢,已经在下载了。第一个问题呢?我是否必须以某种方式包含选项 -rdc=true? - Mikhail Genkin
1
是的,您需要启用单独编译和链接,并且还需要包含一些额外的库。也许您应该查看其中一个CUDA示例中的VS项目文件,比如设备cublas示例 - Robert Crovella
1个回答

9
关于第一项,CUDA动态并行性需要单独的编译和链接-rdc=true),以及链接设备CUDART库(-lcudadevrt)。同时使用CUBLAS的动态并行性还需要链接设备CUBLAS库(-lcublas_device)。在Visual Studio项目中定义它们的最简单方法可能是从设备CUBLAS示例开始查看。
关于第二项,你的GTX 980计算能力5.2未被识别的原因是你需要CUDA 6.5工具包的最新更新,可以在这里获取。
(请注意,最近版本的CUDA已经移除了cublas_device功能。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接