如何在多个CUDA版本之间自由切换,编译程序

如何在多个CUDA版本之间自由切换,编译程序,第1张

首先创建一个soTest的文件夹,里面有两个文件deviceQuerycpp, tcpp。

1

2

3

4

5

6

7

8

deviceQuerycpp的代码可以参考CUDASDK tcpp的源代码如下:

#include int cudev(int argc, char argv);

int main(int argc, char argv)

{

cudev(argc,argv);

return 0;

}

然后在当前目录下输下命令

我写过一个Makefile,统一用nvcc编译和链接就可以了,nvcc是兼容gcc和g++的。具体的可以模仿Nsight的编译和链接选项,你在Nsight IDE里面build你的工程试试,terminal里面会打印出IDE的编译和链接选项的,都是用的nvcc,依葫芦画瓢搬到你的Makefile里面就行了

cuda环境搭建必须要有nvidia(gpu)显卡。

CUDA主要是面向Nvidia的GPU的。Nvidia也推出了CUDA X86,使duCUDA代码可以由X86处理器执行,尽管这只是提高了CUDA的代码兼容性而已。Intel和AMD的显示芯片都不能进行CUDA编程。

想要让cuda环境搭建在Windows81下搭建能利用GPU并行运算,必须有支持GPU并行运算的Nvidia显卡,且要安装CUDA,千万不要电脑上是Intel或AMD的显卡,却要编写CUDA。

扩展资料

CUDA(Compute Unified Device Architecture),显卡厂商NVidia推出的运算平台。 CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。

它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。 开发人员现在可以使用C语言来为CUDA™架构编写程序,C语言是应用最广泛的一种高级编程语言。

所编写出的程序于是就可以在支持CUDA™的处理器上以超高性能运行。 将来还会支持其它语言,包括FORTRAN以及C++。

基于A跟N的竞争关系,A是肯定得不到专利授权的。

参考资料来源:百度百科-NVIDIA

由于CUDA调试工具的不完善、CUDA调试工具上手难度较高,并行思想本身就难调试等因素,CUDA调试一直都是一件很蛋疼的事情。写CUDA也有三四年了,前段时间在群里见别人问CUDA调试的问题,突然有想法写个CUDA调试的博客。自己经验尚浅,希望各位大大看过后能够在评论里指点一二,共同完善这篇博客。

本博客只针对逻辑bug。

1  定位bug

出现bug的第一想法自然是定位bug。cuda比较奇特的地方在于,有时报错bug在500行,但500行出的代码没有错误,而是在1000行的地方逻辑错了,十分头疼。

下面介绍三种我总结的定位bug方法:

11  二分法

一半一半的注释代码,定位bug。比较笨拙和麻烦,但是十分好用。

12  输出定位法

将整体代码分为几个模块,正常的CUDA代码大概可以分为数据初始化,内存申请,内存拷贝,核函数执行,结果拷贝等模块。在每个模块结束后输出标志,示例如图1。这样在调试时就可以根据输出快速定位bug大约在什么位置。如下图:

13  调试工具

对于部分bug,可以用调试工具更快速的定位。

在linux下,对于访存越界等问题,cuda gdb可以直接定位在崩溃那一行。

win下是Nsight,我不熟悉nsight,求大神补充。

2  解决bug

比较简单的bug,定位后基本就一眼就解决了。但对于复杂的bug,还是比较费劲的。

21  调试工具

单步调试,打断点。无论是cuda gdb还是Nsight,都可以定位到某一个线程上进行调试,可以说是非常强大。cuda gdb和nsight都有英文官方文档,建议大家都学一学,熟练后调试事半功倍。

但因为大量线程随机并行执行,有时并不知道该定位到哪个线程上;线程调试不容易控制;定位到单线程调试比较费劲,费时间;教程少(虽然有官方文档),上手难度较大一些。这些都是CUDA调试工具没有被广泛接受的原因。

22  缩小数据量或线程数并在核函数中打印

大量线程并行是导致CUDA调试难度大的最大原因,尽量的减少并行量是一个非常好的降低调试难度的办法。“小并行”甚至“串行”能够大大方便调试。

在Fermi以后的架构中,可以在核函数中使用printf。

在合理范围内缩小数据量,进而减少线程数,比如输入图像大小改为1616。或者修改线程为<<<1,1>>>,printf打印,看是否与预期结果相同。

3  预防bug

每一个写CUDAer大概都有花几个小时甚至几天调一个bug的经历。既然bug这么难调,那么预防bug就显得尤其重要了。

31  写代码前一定要完全构思好架构

社会快速发展,人的心也变得着急了。写CUDA代码之前,一定要沉得住气,多花点时间在纸上构思代码,将代码模块化,哪里容易出问题,哪里该写输出,哪里该检查。

32  函数返回结果检查

函数返回结果检查能够非常好的定位bug,是基本的编程意识。

虽然代码可能看起来会比较冗余,示例如下,也可以参考cuda sample里的代码。

33  函数输入检查

在调用比较重要的函数时,建议用assert检查输入参数与预期值是否相同。

34  核函数内检查

举个例子,遇到的情况是在拷贝shred memory时,拷贝逻辑比较复杂。此时可以写一个检查函数,以保证拷贝的正确性。

核函数内代码如下:

首先创建一个soTest的文件夹,里面有两个文件deviceQuerycpp, tcpp。

deviceQuerycpp的代码可以参考CUDASDK tcpp的源代码如下:

 

#include int cudev(int argc, char argv);

int main(int argc, char  argv)

{

   cudev(argc,argv); 

   return 0;

}

然后在当前目录下输下命令

以上就是关于如何在多个CUDA版本之间自由切换,编译程序全部的内容,包括:如何在多个CUDA版本之间自由切换,编译程序、linux下CUDA程序一般怎么编译、cuda环境搭建必须要有nvidia(gpu)显卡吗,intel或者ati显卡可以吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9760865.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存