在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)简记的更多相关文章

  1. (转载)JAVA动态编译--字节代码的操纵

    在一般的Java应用开发过程中,开发人员使用Java的方式比较简单.打开惯用的IDE,编写Java源代码,再利用IDE提供的功能直接运行Java 程序就可以了.这种开发模式背后的过程是:开发人员编写的 ...

  2. ZKWeb网站框架的动态编译的实现原理

    ZKWeb网站框架是一个自主开发的网页框架,实现了动态插件和自动编译功能. ZKWeb把一个文件夹当成是一个插件,无需使用csproj或xproj等形式的项目文件管理,并且支持修改插件代码后自动重新编 ...

  3. java动态编译笔记

    1 前言 Java的动态编译知识,真真在实际开发中并不是经常遇到.但是学习java动态编译有助于我们从更深一层次去了解java.对掌握jdk的动态代理模式,这样我们在学习其他一些开源框架的时候就能够知 ...

  4. c#动态编译并动态生成dll

    /// <summary> /// 动态编译并执行代码 /// </summary> /// <param name="code">代码< ...

  5. Java动态编译

    程序产生过程 下图展示了从源代码到可运行程序的过程,正常情况下先编译(明文源码到字节码),后执行(JVM加载字节码,获得类模板,实例化,方法使用).本文来探索下当程序已经开始执行,但在.class甚至 ...

  6. Java_动态编译总结

    不多说直接上代码: 动态编译的主类: package com.lkb.autoCode.util; import com.lkb.autoCode.constant.AutoCodeConstant; ...

  7. 重写代码生成器支持模板(多层架构,MVC),多语言c#,java;支持mysql和sqlserver,动态编译

    多年前用过李天平前辈的,自己改过,后来李老师做动软了,不给源码,修改不是很方便.加上我目前需要转java方向,于是决定自己搞.到目前为止花了整整一个星期了,看看目前的成果. 最后是代码工程文件,用c# ...

  8. 浅谈VB.Net 程序的编译和动态编译

    ---恢复内容开始--- 一般,我们都是通过Visual Studio(下面简称vs)来编写和编译vb.net应用程序的,但是,不少的人并不知道vs是通过何种方式编译程序的.今天,我们就来探讨一下编译 ...

  9. .NET中的动态编译

    代码的动态编译并执行是一个.NET平台提供给我们的很强大的工具用以灵活扩展(当然是面对内部开发人员)复杂而无法估算的逻辑,并通过一些额外的代码来扩展我们已有 的应用程序.这在很大程度上给我们提供了另外 ...

随机推荐

  1. node.js 在函数内获取当前函数

    js 如何在函数体内部知道 自己在哪个函数内运行呢? 打比方: function a() { // 我想在这里知道我的函数名a和函数function a () {...} } 使用Error的调用栈可 ...

  2. SpringMVC_2

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=" ...

  3. C#计算运行时间

    using System.Diagnostics; private Stopwatch stw = new Stopwatch(); stw.Start(); stw.Stop(); MessageB ...

  4. Swift-AES之加密解密

    什么是AES 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代 ...

  5. codeforces 965E Trie+multiset

    E. Short Code time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  6. 21. Ext中表格自适应高度

    转自:https://blog.csdn.net/happy492/article/details/6401099 1. 下面的代码中width和height的初始值为tab的开始大小,当浏览器窗口变 ...

  7. P2700逐个击破(并查集/树形dp)

    P2700 逐个击破 题目背景 三大战役的平津战场上,傅作义集团在以北平.天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜.为了就地歼敌不让其逃走,老毛同志 ...

  8. [App Store Connect帮助]六、测试 Beta 版本(2)输入测试信息以供外部测试

    如果您向外部测试员分发您的 App,您需要输入关于您 App 的额外 TestFlight 测试信息以供“Beta 版 App 审核”.您可以在添加 App 至您的帐户时,或在您邀请外部测试员时输入此 ...

  9. python自动化测试学习笔记-6excel操作xlwt、xlrd、xlutils模块

    python中通过xlwt.xlrd和xlutils操作xls xlwt模块用于在内存中生成一个xls/xlsx对象,增加表格数据,并把内存中的xls对象保存为本地磁盘xls文件; xlrd模块用于把 ...

  10. 关于Android皮肤更换分享

    http://www.eoeandroid.com/forum.php?mod=viewthread&tid=264902&highlight=%E6%8D%A2%E8%82%A4&a ...