CUDA 动态编译(NVRTC)简记
在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要快。
具体哪个对我现在暂时没做过实验。
CUDA 动态编译(NVRTC)简记的更多相关文章
- (转载)JAVA动态编译--字节代码的操纵
在一般的Java应用开发过程中,开发人员使用Java的方式比较简单.打开惯用的IDE,编写Java源代码,再利用IDE提供的功能直接运行Java 程序就可以了.这种开发模式背后的过程是:开发人员编写的 ...
- ZKWeb网站框架的动态编译的实现原理
ZKWeb网站框架是一个自主开发的网页框架,实现了动态插件和自动编译功能. ZKWeb把一个文件夹当成是一个插件,无需使用csproj或xproj等形式的项目文件管理,并且支持修改插件代码后自动重新编 ...
- java动态编译笔记
1 前言 Java的动态编译知识,真真在实际开发中并不是经常遇到.但是学习java动态编译有助于我们从更深一层次去了解java.对掌握jdk的动态代理模式,这样我们在学习其他一些开源框架的时候就能够知 ...
- c#动态编译并动态生成dll
/// <summary> /// 动态编译并执行代码 /// </summary> /// <param name="code">代码< ...
- Java动态编译
程序产生过程 下图展示了从源代码到可运行程序的过程,正常情况下先编译(明文源码到字节码),后执行(JVM加载字节码,获得类模板,实例化,方法使用).本文来探索下当程序已经开始执行,但在.class甚至 ...
- Java_动态编译总结
不多说直接上代码: 动态编译的主类: package com.lkb.autoCode.util; import com.lkb.autoCode.constant.AutoCodeConstant; ...
- 重写代码生成器支持模板(多层架构,MVC),多语言c#,java;支持mysql和sqlserver,动态编译
多年前用过李天平前辈的,自己改过,后来李老师做动软了,不给源码,修改不是很方便.加上我目前需要转java方向,于是决定自己搞.到目前为止花了整整一个星期了,看看目前的成果. 最后是代码工程文件,用c# ...
- 浅谈VB.Net 程序的编译和动态编译
---恢复内容开始--- 一般,我们都是通过Visual Studio(下面简称vs)来编写和编译vb.net应用程序的,但是,不少的人并不知道vs是通过何种方式编译程序的.今天,我们就来探讨一下编译 ...
- .NET中的动态编译
代码的动态编译并执行是一个.NET平台提供给我们的很强大的工具用以灵活扩展(当然是面对内部开发人员)复杂而无法估算的逻辑,并通过一些额外的代码来扩展我们已有 的应用程序.这在很大程度上给我们提供了另外 ...
随机推荐
- Oracle 11g密码过期问题及解决方案
问题: 在自用的一个系统里,连接的是本地自建的一个数据库.用sqldeveloper登录数据库.提示如下图: 提示:密码过期 解决方案: 密码过期一般存在两种可能: 由于Oracle中默认在defau ...
- 利用JFreeChart生成折线图 (4) (转自 JSP开发技术大全)
利用JFreeChart生成折线图 (4) (转自 JSP开发技术大全) 14.4 利用JFreeChart生成折线图 通过JFreeChart插件,既可以生成普通效果的折线图,也可以生成3D效果的折 ...
- dpdpdpdp~~~!!!
dpdpdpdpdpdp D你妹个P! 妈的劳资就不信征服不了你!!哼!!
- web filter用spring注入对象
tomcat容器初始化顺序监听器–>过滤器–>servlet,因此springMVCservlet初始化之前,过滤器就已经初始化过了,如果在过滤器中需要注入spring容器管理的bean是 ...
- SPOJ OTOCI 动态树 LCT
SPOJ OTOCI 裸的动态树问题. 回顾一下我们对树的认识. 最初,它是一个连通的无向的无环的图,然后我们发现由一个根出发进行BFS 会出现层次分明的树状图形. 然后根据树的递归和层次性质,我们得 ...
- Java 泛型 五:泛型与数组
简介 上一篇文章介绍了泛型的基本用法以及类型擦除的问题,现在来看看泛型和数组的关系.数组相比于Java 类库中的容器类是比较特殊的,主要体现在三个方面: 数组创建后大小便固定,但效率更高 数组能追踪它 ...
- Java多线程系列六——Map实现类
参考资料: https://crunchify.com/hashmap-vs-concurrenthashmap-vs-synchronizedmap-how-a-hashmap-can-be-syn ...
- Linux中的LVM
逻辑卷管理器,通过将另外一个硬盘上的分区加到已有文件系统,来动态地向已有文件系统添加空间的方法. 逻辑卷管理的核心是处理安装在系统上的硬盘分区.在逻辑卷管理的世界里,硬盘称作物理卷(Physical ...
- bzoj 1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列【hash】
我%&&--&()&%????? 双模hashWA,unsigned long longAC,而且必须判断hash出来的数不能为0???? 我可能学了假的hash 这个 ...
- web自动化测试—selenium游览器多窗口操作
# coding=utf-8'''web游览器多窗口操作: 获取当前窗口句柄 current_window_handle 获取所有窗口句柄 window_handles 切换窗口 switch_to_ ...