前言
今天试着在windows 10 VS2017上编译并运行CUDA-C中动态并行技术的简单程序,想看看该技术的运行效率,但是编译就出错了,这里记录下解决过程。
问题描述及分析
动态并行程序的HelloWorld示例编写好后,编译程序时,出现如下错误:从错误提示中可知,设备函数需要单独的编译模式,结合参考书中介绍的编译命令,需要将 -rdc=true, 即强制生成可重定位的设备代码,这是动态并行的一个要求。基于这个知识,在编译动态并行的程序时需要设置 “-rdc=true”,在VS2017项目属性面板可设置: 重新编译后,上面的问题没有了,但是报如下错误:
分析错误提示信息后,应该是缺少相应的库,所以没有找到该函数符号,只要添加上对应的库就可以。搜索CUDA 动态并行编译命令后,发现,CUDA的动态并行技术是需要设备运行时库支持的,即cudadevrt.lib, 因此,需要在VS2017项目属性页面添加该运行库: 重新编译后,完美通过,Perfect!!!
动态并行实例程序
#include <iostream>
#include <cuda.h>
#include <cuda_runtime.h>
#include <device_launch_parameters.h>
#include <device_functions.h>
__global__ void nestedHelloWorld(int const iSize, int iDepth)
{
int tid = threadIdx.x;
printf("Recursion=%d: Hello World from thread %d block %d\n", iDepth, tid, blockIdx.x);
if (iSize == 1)
return;
int nThreads = iSize >> 1;
if (tid == 0 && nThreads > 0)
{
nestedHelloWorld << <1, nThreads >> > (nThreads, ++iDepth);
printf("--------> nested execution depth: %d\n", iDepth);
}
}
int main()
{
nestedHelloWorld << <1, 8 >> > (8, 0);
cudaDeviceSynchronize();
system("pause");
return 0;
}
动态并行程序运行结果
总结
动手编程是检验程序学习的唯一标准,读后感觉完全理解,动手编程后往往就会出现很多问题,这时候我们就要学会分析并解决问题,加深我们的理解。
参考资料
《CUDA-C编程权威指南》
|