在linux上用sublime text 3上写完CUDA代码和c++代码后,想用code::blocks去一并编译,就像visual studio那样一键编译运行,但发现在code::blocks上设定自定义编译器为nvcc时比较麻烦,所以想到了用NVRTC。

NVRTC中的RTC是runtime compile的意思,在visual studio(VS)里的一键编译其实是vs编译器替你干了很多底层的脏活,但到了linux,这些脏活就都得程序员来做了。。。

一、这些脏活都是什么呢?

1)vs把你的所有代码整理起来,并分类,用于在GPU里执行的device设备端代码,送往nvcc.exe里进行编译;用于在CPU里执行的host端代码,用vs自家的cl.exe编译

2)在最后的链接过程,vs把上面两个部分编译出的二进制代码融在一起成为一个exe。

二、那NVRTC能干啥呢?

1)NVRTC可以将原始的c++语法的CUDA代码,编译成PTX文件,PTX就是Parallel Thread eXecution的缩写,一个PTX文件其实就跟txt差不多,用windows自带的记事本就能打开,打开之后会看到一堆类似汇编语法格式的东西,这个就是NVRTC根据我们的CUDA源文件编译出的能在GPU上执行的代码,但是PTX代码和真正的GPU汇编还是有轻微的区别,但是区别很小,程序员可以通过查看编译出的PTX文件,窥知NVRTC编译器在编译的时候为我们的源码做了什么优化(举个简单的例子:比如浮点数a,b,c,当计算a*b+c这种线性运算的时候,一般都是先算a*b,再把结果与c相加,但是在PTX代码里会发现编译器直接用一个fmad指令,一次用硬件完成了浮点数的乘加操作)。

2)将上述过程产生的PTX文件,通过N卡driver API送入显卡直接执行。

三、为啥要用NVRTC?上面的NVCC不就够用了吗?

1)因为在linux里设定NVCC编译环境比较麻烦,有坑,而通过上面的对于NVRTC的叙述,我们发现整个编译过程如果利用NVRTC的话会很简单,坑少。

2)而且不用我们在编译器里设定NVCC编译环境了。

四、前提条件:

1)首先,要装一块N卡。(这句好像是废话......)

2)为这块显卡装合适的驱动。

(PS:linux装显卡驱动很麻烦,最好是一装完系统就装显卡驱动,然后再安装其它的那些软件,我一开始没经验,装了ubuntu后直接开装一堆软件,到最后想起要装显卡驱动的时候各种报错,实在没办法了只能重装系统,重装系统的时候选择不安装默认的nouveau显卡驱动。还有就是显卡驱动不要装太新版本的,装完一遍之后更新的时候也要小心,以免搞坏了连登录界面都进不去......)

3)装完显卡驱动后,再安装CUDA Toolkit,这里的坑没有上面多,但也要小心。

五、过程:

1)在一般的文本编辑器上写完c++和配套的CUDA代码后,利用NVRTC将GPU代码编译成PTX。

2)利用GCC或者MinGW(其它的也行)把在CPU端的代码编译成obj,链接成exe。(CPU端的代码里自然就会有利用driver API加载PTX代码的东西,以及一些kernel核函数调用时参数设置的东西)

3)测试你的程序是不是运行正常。

六、结果:

我在自己的机器上试了试上面的过程,能跑通,而且经上面的步骤,GPU代码也支持CUDA纹理对象(cuda_texture_object),可以对cudaTextureObject_t类型的对象进行纹理寻址。

七、存在的疑问:

1)六中,我测试了一下随机显存访问的性能,一个利用纹理对象,另一个利用平时的显存访问,结果显存访问比纹理拾取反而要快一倍(前者9us,后者16us),暂时不知道这是为啥。

2)网上有人说利用NVRTC编译出的PTX代码要比用NVCC编译器编译出的代码效率低,但是官方文档上是这么写的:

  上面图片的意思是说NVRTC可以提供静态编译(NVCC)所不能提供的代码优化,也就是说官网上暗示NVRTC要比NVCC要快。

  具体哪个对我现在暂时没做过实验。

最新文章

  1. spring + myBatis 常见错误:SQL语法错误
  2. Nginx 笔记与总结(4)配置 server 访问日志
  3. 详解DHV:怎么具体展示高价值
  4. $parse , $interpolate ,$complie , $destroy
  5. C# 客户端发送http请求代码 (c/s)
  6. NET-A-PORTER为何难以模仿?_全文显示_生活福布斯中文网
  7. .net简单的静态页生成
  8. FPGA上如何求32个输入的最大值和次大值:分治
  9. 网络流24题 ——运输问题 luogu 4015
  10. C# 生成小于Int数值绝对值的随机数
  11. Java ,python面向对象的继承及其区别
  12. javascript使用误区(switch、this)
  13. 【洛谷p1313】计算系数
  14. adr adrl ldr mov总结整理
  15. GG配置ggmgr进程
  16. Tensorflow一些常用基本概念与函数(三)
  17. Linux Expect 简介和使用实例
  18. spss C# 二次开发 学习笔记(五)——Spss系统集成模式
  19. 编写shell时,遇到let: not found错误及解决办法
  20. STL 中的map 与 hash_map的理解

热门文章

  1. Delphi中SendMessage使用说明(所有消息说明) good
  2. 在mac上安装gradle(超详细,直接按步骤操作即可轻松搞定)
  3. 【bug】Android版QQ浏览器广告过滤
  4. Flask的闪现(message) 请求扩展 中间件 蓝图
  5. [HNOI2005]星际贸易
  6. JSP-Runood:Eclipse JSP/Servlet 环境搭建
  7. 2008提权之突破系统权限安装shift后门
  8. 国外知名IT网站(转载)
  9. yii int
  10. P1044 栈