CUDA编译过程

2023-11-10

流程

  1. 将test.cu代码进行分离,利用cudafe.exe 去分离CPU代码和GPU代码,我们可以在生成的中间文件可以看到test.cudafe1.cpp和test.cudafe1.gpu
  2. cicc.exe 将根据编译选项-arch=compute_xx将GPU代码编译成对应架构的test.ptx文件
  3. ptxas.exe 编译 test.ptx 到test.cubin,这个是根据编译选项-code=sm_xx定义的,比如test.sm_30.cubin.(这一步叫做PTX离线编译,主要的目的是为了将代码编译成一个确定的计算能力和SM版本,对应的版本信息保存在cubin中)
  4. fatbin.exe 编译test .cubin 和test. ptx到 text.fatbin.c 。 (这一步叫PTX在线编译,是将cubin和ptx中的版本信息保存在fatbin中)
  5. 调用系统的gcc/g++将host代码(test.cudafe1.cpp)和fatbin(text.fatbin.c)编译成对应的目标文件test.o 和test._dlink.o。
  6. 用c++编译器将目标文件链接起来生成可执行文件。

实验

nvcc --cuda test.cu --keep --dryrun

细节

  • -arch=compute_XX, -code=sm_XX, 如果写两个的话必须这样来写,也就说compute_必须对应的是arch, code必须对应的是sm_,arch代表的是目标机器(vitural),而code代表的是真实机器(real),下面是具体的例子:

nvcc -o test test.cu -arch=compute_35 -code=sm_70 --keep --verbose

具体小步骤
  1. cicc *** -arch compute_35 -o test.ptx// 可以看出ptx是根据arch来设定的
  2. ptxas -arch=sm_70 -m64 “test.ptx” -o “test.cubin”//本地二进制文件是根据sm_70来设定,至于为用的是arch,这就是nvcc瞎写
  3. fatbinary --create=“test.fatbin” -64 “–image=profile=sm_70,file=test.cubin” --embedded-fatbin=“test.fatbin.c” --cuda(这里面没有将ptx放进去不知道什么情况,当只有arch一个参数的时候ptx和cubin都会放入fatbin.c里面)

使用

一般都是只使用一个-arch, 这样默认你的arch和code是同一个架构算力,比如-arch=sm_70,这个在nvcc -help中可以看到,就是为了方便而已,等效于-arch=compute_70, -code=sm_70, 感觉英伟达这搞得一点也不规范。

思考

  • 经常可以看到说cuda的即时编译,可是我是没见到运行的时候出现编译过程,难道是我使用姿势不对?

fatbinary机制。exe二进制文件中会包含一个或多个体系结构的二进制代码以及PTX代码来完全避免JIT成本。CUDA运行时会在二进制文件中查找当前GPU架构的代码,并在找到时运行它。如果找不到二进制代码,但PTX可用,则驱动程序将编译PTX代码。这样,部署的CUDA应用程序可以在新GPU出现时支持它们。nvcc x.cu -arch=compute_10 -code=compute_10,sm_10,sm_13,比如这一段程序,编译出来的代码就会有10,13两个二进制,实际遇到了这类GPU就直接使用,否则就把compute_10.ptx运行时编译一波。

  • 难道我一份exe每次在新机器A上重复使用时每次都要即时编译吗?这也太蠢了吧

缓存机制。 如果在code中没有指示出来实际运行的GPU, 理论来说你在A这个GPU上运行的时候,每次都要JIT,为此cuda做了一个优化,就是将它第一次接触过得GPU卡即时编译后缓存一起,也就是说第一次在A卡编译后,下次再运行就直接可以调用缓存里面的二进制了,理论上来说就是放在-code=sm_10, A,sm_20,不过A是在遇到A之后才编译的

注意

-arch 的配置一定要低于-code ,想想看,你一个-arch=compute_70的 **.ptx很难去编译出一个code=sm_30的二进制代码,因为很多架构是70的机器上的特性,在30的机器上压根都没有,比如tensorcore什么的,所以这个要注意。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CUDA编译过程 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • 如何使用 C# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现

随机推荐

  • 2023校招4399面试

    4399效率很高 笔试完第二天就面试了 腾讯会议面试的 表现比较拉跨 1 自我介绍 2 为什么做这个web服务器这个项目 当时说的是想学以致用一下 现在想想说具体什么作用更好吧 3 项目中一些难点 线程池 4 几种io多路复用的实现方式以及
  • JS,统计图表大全--二、柱形图(柱状图及条形图)Bar

    二 柱状图 Bar
  • An Introduction to Compressive Sensing 压缩感知教材

    rice大学压缩感知的书 想系统性学习CS的可以看看这本书 下载地址 http cnx org exports f70b6ba0 b9f0 460f 8828 e8fc6179e65f 5 12 pdf an introduction to
  • 利用commands模块执行Linux shell命令

    利用commands模块执行Linux shell命令 用Python写运维脚本时 经常需要执行linux shell的命令 Python中的commands模块专门用于调用Linux shell命令 并返回状态和结果 下面是command
  • umask命令

    命令格式 umask 模式 说明 创建文件或目录时的掩码 文件创建的权限默认为666 umask 而目录创建的权限是用777 umask 为什么文件和目录创建时候指定的权限不一样 因为666是777减去了文件的执行权限 也就是用777 11
  • IO网络编程面试题(2022)

    IO 网络编程 1 什么是 IO IO的定义 IO用于实现对数据的输入和输出操作 流是从起源到接受的有序数据 2 常用的 IO 类有哪些 1 字节流 FileInputStream FileOutputStream 2 字符流 FileRe
  • 解决pip install --upgrade pip 升级不成功

    问题描述 使用pip安装第三方模块的时候 提示我pip版本过低WARNING You are using pip version 21 0 1 however version 21 1 1 is available You should c
  • Nvidia TX2 刷机教程 JetPack-L4T-3.0-linux-x64.run

    前言 本教程特别针对刷机被墙的朋友 如果没有被墙 其实按照官方文档一步一步操作就行 这期间我参考了特别多的网页 也去nvidia官方论坛问过 其实截止到2019年2月16日 jetpack3 3 是可以很轻松的被装上的 主要是3 0被墙 而
  • 1. Python的特性和语法

    千里之行始于足下 大家好 我是茶桁 这里是我们 AI秘籍 的第一节 让我们先从Python来开始好好的打好基础 第一堂课 我们先从最基础的Python特性开始 当然 还有一些基本语法 上来就开始讲特性和语法 说明我们将会遗弃惯用的 环境搭建
  • java 获取linux mac_java工具类,在Windows,Linux系统获取电脑的MAC地址、本地IP、电脑名...

    packagecom cloudssaas util importjava io BufferedReader importjava io IOException importjava io InputStreamReader import
  • abc计算机机房建设标准,ABC级数据中心机房建设要求

    ABC级数据中心机房建设要求 由会员分享 可在线阅读 更多相关 ABC级数据中心机房建设要求 7页珍藏版 请在人人文库网上搜索 1 ABC级数据中心机房建设要求一 根据数据中心机房最新设计规范GB50174 2008电子信息系统机房设计规范
  • 图像处理之高斯混合模型

    一 高斯混合模型 现有的图像中目标的分类常用深度学习模型处理 但是深度学习需要大量模型处理 对于明显提取的目标 常常有几个明显特征 利用这几个明显特征使用少量图片便可以完成图像目标分类工作 这里介绍使用高斯混合模型GMM处理图像 二 步骤
  • Python数据分析学习路径图 #CSDN博文精选# #IT技术# #学习路线# #系统化学习# #python#

    大家好 我是小C 又见面啦 文章过滤器 精选大咖干货 助力学习之路 5天20篇CSDN精选博文带你掌握系统化学习方法 专栏将挑选有关 系统化学习方法 的20篇优质文章 帮助大家掌握更加科学的学习方法 在这里 你将收获 快速掌握系统化学习的理
  • springboot框架在页面和postman访问可以debug进入方法,但是接收方接收到是404的问题

    重要性 在使用注解开发的过程中 如果遇到接口能够debug进去 但是接收方接到的是404 导致这种结果的原因是 restController 和 Conroller 这两个注解的导致的 RestController注解相当于 Respons
  • python 第三方库之openpyxl

    一次偶然的机会知道这个第三方库 然后看官方文档 在此记录下我的学习笔记 1 openpyxl openpyxl 是一个第三方库 可以读写excel 文件 2 安装 pip3 install openpyxl 3 如果你的excel文件中包含
  • 命令行程序选项解析函数—getopt

    转载请注明出处 http blog csdn net zhangyang0402 archive 2010 06 14 5671410 aspx 命令行工具下的参数选项有两种 长选项和短选项 短选项以 开头 后面跟单个字母 长选项以 开头
  • LeetCode 160. 相交链表

    题目链接 https leetcode cn problems intersection of two linked lists 思路如下 如果把这两个链表拼接在一起 那么拼接后的两个总链表长度相同 初始 让 pA 指向 headA pB
  • python 离群值_python:删除离群值操作(每一行为一类数据)

    删除有多行字符串的json文件中的离群值 def processhold eachsubject directory newfile filename cmudatacol hold subject 0 json format eachsu
  • 在Unity 5中如何控制检视面板上的属性是否显示?

    当脚本中有大量属性或字段需要在检视面板中调整时 检视面板会变得杂乱无章 有没有什么办法可以自己来管理这些属性是否显示呢 本文就为大家介绍无需自定义检视面板来管理属性显示的方法 首先介绍HeaderAttributes的用法 让大家对控制检视
  • CUDA编译过程

    流程 将test cu代码进行分离 利用cudafe exe 去分离CPU代码和GPU代码 我们可以在生成的中间文件可以看到test cudafe1 cpp和test cudafe1 gpu cicc exe 将根据编译选项 arch co