CUDA:如何使用 -arch 和 -code 以及 SM 与 COMPUTE

2023-11-25

我仍然不确定在使用 nvcc 构建时如何正确指定代码生成的体系结构。我知道我的二进制文件中嵌入了机器代码和 PTX 代码,并且可以通过控制器开关进行控制-code and -arch(或两者的组合使用-gencode).

现在,根据this除了两个编译器标志之外,还有两种指定体系结构的方法:sm_XX and compute_XX, where compute_XX指的是虚拟和sm_XX到一个真正的建筑。旗帜-arch仅采用虚拟架构的标识符(例如compute_XX)而-codeflag 接受真实架构和虚拟架构的标识符。

该文档指出-arch指定为其编译输入文件的虚拟体系结构。然而,这个 PTX 代码不会自动编译为机器代码,而是一个“预处理步骤”。

Now, -code应该指定 PTX 代码针对哪些架构进行汇编和优化。

但是,尚不清楚二进制文件中将嵌入哪种 PTX 或二进制代码。如果我指定例如-arch=compute_30 -code=sm_52,这是否意味着我的代码将首先编译为功能级别 3.0 PTX,然后从中创建功能级别 5.2 的机器代码?以及将嵌入什么?

如果我只是指定-code=sm_52那么会发生什么?仅嵌入由 V5.2 PTX 代码创建的 V5.2 机器代码?有什么区别-code=compute_52?


一些相关的问题/答案是here and here.

我仍然不确定在使用 nvcc 构建时如何正确指定代码生成的体系结构。

完整的描述有些复杂,但旨在提供相对简单、易于记忆的规范用法。针对代表您希望定位的 GPU 的架构(虚拟和真实)进行编译。一个相当简单的形式是:

-gencode arch=compute_XX,code=sm_XX

其中 XX 是您希望定位的 GPU 的两位数计算能力。如果您希望定位多个 GPU,只需对每个 XX 目标重复整个序列即可。这大约是 CUDA 示例代码项目所采用的方法。 (如果您想在可执行文件中包含 PTX,请包含一个额外的-gencodecode选项指定相同的 PTX 虚拟架构arch选项)。

另一种相当简单的形式,当仅针对单个 GPU 时,只需使用:

-arch=sm_XX 

与 XX 的描述相同。该表单将包括指定架构的 SASS 和 PTX。

现在,根据此,除了两个编译器标志之外,还有两种指定体系结构的方法:sm_XX 和compute_XX,其中compute_XX 指虚拟体系结构,sm_XX 指真实体系结构。标志 -arch 仅采用虚拟架构的标识符(例如compute_XX),而 -code 标志同时采用真实架构和虚拟架构的标识符。

arch and code用作子开关内-gencode切换,或者如果两者一起使用,如您所描述的独立。但是,例如,当-arch单独使用(没有-code),它代表另一种“速记”符号,在这种情况下,你可以传递一个真实的架构,例如-arch=sm_52

但是,尚不清楚二进制文件中将嵌入哪种 PTX 或二进制代码。例如,如果我指定 -arch=compute_30 -code=sm_52,这是否意味着我的代码将首先编译为功能级别 3.0 PTX,然后从中创建功能级别 5.2 的机器代码?以及将嵌入什么?

嵌入内容的确切定义因使用形式而异。但对于这个例子:

-gencode arch=compute_30,code=sm_52

或者对于您确定的同等情况:

-arch=compute_30 -code=sm_52

那么是的,这意味着:

  1. 将从您的源代码生成临时 PTX 代码,它将使用 cc3.0 PTX。
  2. 从该 PTX 中,ptxas工具将生成符合 cc5.2 的 SASS 代码。
  3. SASS 代码将嵌入到您的可执行文件中。
  4. PTX 代码将被丢弃。

(我不确定为什么你实际上会指定这样的组合,但它是合法的。)

如果我只指定 -code=sm_52 那么会发生什么?仅嵌入由 V5.2 PTX 代码创建的 V5.2 机器代码?与 -code=compute_52 有什么区别?

-code=sm_52将从中间 PTX 代码生成 cc5.2 SASS 代码。 SASS 代码将被嵌入,PTX 将被丢弃。请注意,以这种形式单独指定该选项,没有-arch选项,将是非法的。 (1)

-code=compute_52将(仅)生成 cc5.x PTX 代码并将该 PTX 嵌入到可执行文件/二进制文件中。请注意,以这种形式单独指定该选项,没有-arch选项,将是非法的。 (1)

The cuobjdump tool可用于识别给定二进制文件中到底包含哪些组件。

(1) 当没有-gencode使用开关,并且没有-arch使用开关,nvcc假设默认值-arch=sm_20附加到您的编译命令(这是针对 CUDA 7.5,默认值-arch设置可能因 CUDA 版本而异)。sm_20 is a real架构,并且指定一个是不合法的real建筑学上的-arch当一个选项-code还提供了选项。

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

CUDA:如何使用 -arch 和 -code 以及 SM 与 COMPUTE 的相关文章

  • Cuda 6.5 找不到 - libGLU。 (在 ubuntu 14.04 64 位上)

    我已经在我的ubuntu上安装了cuda 6 5 我的显卡是 GTX titan 当我想要制作 cuda 样本之一时 模拟 粒子 我收到这条消息 gt gt gt WARNING libGLU so not found refer to C
  • 有没有一种有效的方法来优化我的序列化代码?

    这个问题缺乏细节 因此 我决定创建另一个问题而不是编辑这个问题 新问题在这里 我可以并行化我的代码吗 还是不值得 https stackoverflow com questions 17937438 can i parallelize my
  • cuda中内核的并行执行

    可以说我有三个全局数组 它们已使用 cudaMemcpy 复制到 GPU 中 但 c 中的这些全局数组尚未使用 cudaHostAlloc 分配 以便分配页面锁定的内存 而不是简单的全局分配 int a 100 b 100 c 100 cu
  • __device__ __constant__ 常量

    有什么区别吗 在 CUDA 程序中定义设备常量的最佳方法是什么 在 C 主机 设备程序中 如果我想将常量定义在设备常量内存中 我可以这样做 device constant float a 5 constant float a 5 问题 1
  • 如何为 CUDA 内核选择网格和块尺寸?

    这是一个关于如何确定CUDA网格 块和线程大小的问题 这是对已发布问题的附加问题here https stackoverflow com a 5643838 1292251 通过此链接 talonmies 的答案包含一个代码片段 见下文 我
  • 最小化 MC 模拟期间存储的 cuRAND 状态数量

    我目前正在 CUDA 中编写蒙特卡罗模拟 因此 我需要生成lots使用随机数cuRAND图书馆 每个线程处理一个巨大的元素floatarray 示例中省略 并在每次内核调用时生成 1 或 2 个随机数 通常的方法 参见下面的示例 似乎是为每
  • PyInstaller 是否包含 CUDA

    我正在开发一个Python脚本 我使用Python 3 7 3 它使用tensorflow gpu 1 14 0 并使用PyInstaller 3 5将此脚本转换为可执行文件 我使用的是 CUDA 10 0 和 cuDNN 7 6 1 我的
  • 云或烟雾的粒子系统

    我正在尝试使用 OpenGL 和 CUDA 制作一个简单的用于云和烟雾模拟的粒子系统 如何使粒子系统中的粒子表现得像真正的云或烟雾在低湍流风中的表现 我现在遇到的一些问题是 颗粒聚集成一个大球 粒子扩散到无限远 粒子突然弹射离开 我已经完成
  • 为什么 cuCtxCreate 返回旧上下文?

    我已经安装了 CUDA SDK 4 2 64 CUDA工具包4 2 64 CUDA 驱动程序 4 2 64 我检查了 windows 中的每个 nvcuda dll 所有这些都是 4 2 版本 但是当我使用驱动程序 api 创建上下文并使用
  • 用于计算邻居列表的最佳 GPU 算法

    给定 3D 中数千个点的集合 我需要获取落在某个截止值 以欧几里得距离而言 内的每个粒子的邻居列表 并且如果可能的话 从最近到最远排序 在 CUDA 或 OpenCL 语言中 哪种 GPU 算法最快 我所知道的最快的 GPU MD 代码之一
  • 如何在CUDA应用程序中正确应用线程同步?

    一般来说 我在应用程序中偶尔会使用线程同步 因为我并不经常需要此功能 我并不是真正的高级 C C 程序员 但我也不是初学者 我开始学习 CUDA C 对当今 GPU 与 CPU 的能力相比感到兴奋 我意识到 CUDA 编程主要是关于并行线程
  • 使用 GPU 进行 Matlab 卷积

    我用gpuArray尝试了matlab的卷积函数conv2 convn 例如 convn gpuArray rand 100 100 10 single gpuArray rand 5 single 并将其与 cpu 版本 convn ra
  • CUDA-Kernel 应该根据块大小动态崩溃

    我想做稀疏矩阵 密集向量乘法 假设用于压缩矩阵中条目的唯一存储格式是压缩行存储 CRS 我的内核如下所示 global void krnlSpMVmul1 float data mat int num nonzeroes unsigned
  • 完全禁用 NVCC 优化

    我正在尝试测量 GPU 上的峰值单精度触发器 为此我正在修改 PTX 文件以在寄存器上执行连续的 MAD 指令 不幸的是 编译器正在删除所有代码 因为它实际上没有做任何有用的事情 因为我没有执行任何数据的加载 存储 是否有编译器标志或编译指
  • 如何从C++头文件调用CUDA文件?

    我知道从 c 文件调用 cu 文件的方法 但现在我想从 C 头文件调用 cu 文件 有可能做到吗 如果是这样 我应该如何设置我的项目 请帮忙 这是一个有效的例子 file1 h int hello file2 h include
  • CUDA 代码会损坏 GPU 吗?

    在测试包含内存错误的 CUDA 时 我的屏幕被冻结了 重新启动后我无法再检测到显卡 我的代码是否有可能物理损坏该卡 这发生在 Ubuntu 14 04 下 我不知道该卡的型号 因为我无法检测到它 但我记得它是一张相当新的卡 感谢所有的评论我
  • 为什么使用 boost::none 无法通过 nvcc 编译?

    我正在尝试编译以下代码 include
  • 如何降级cuda版本

    我目前使用的是 cuda 版本 4 2 但我需要将其更改为 3 1 是否可以卸载当前版本 4 2 版 然后安装以前的版本 3 1 版 编辑 请参阅我的操作系统是linux ubuntu 10 04 64位 编辑 我找到了如何获取 3 1 版
  • 为什么 CUDA 内存复制速度会这样,有一些恒定的驱动程序开销?

    在我的旧 GeForce 8800GT 上使用 CUDA 内存时 我总是会遇到奇怪的 0 04 毫秒开销 我需要将 1 2K 传输到设备的常量内存中 处理其中的数据并从设备中仅获取一个浮点值 我有一个使用 GPU 计算的典型代码 alloc
  • 如何使用 Visual Studio 2008 调试 CUDA 内核代码?

    嘿 我正在使用带有 CUDA 3 2 的 Visual Studio 2008 我正在尝试调试具有此签名的函数 MatrixMultiplication Kernel lt lt

随机推荐

  • 未针对 Windows 配置 DefaultFirebaseOptions

    错误 flutter lib ui ui dart state cc 198 未处理的异常 不受支持的操作 尚未为 Windows 配置 DefaultFirebaseOptions 您可以通过再次运行 FlutterFire CLI 来重
  • 查找并替换字符串

    是否可以在页面加载之前查看页面的源代码 找到某个部分并将其替换为其他内容 我想使用 JavaScript 来完成此操作 以便我可以在 Chrome 扩展中使用它 所以像这样 找到 google com 替换为 yahoo com
  • 如何使用jquery联系叔叔

    div div div div div div 我在 me 我想选择我的叔叔 使用如下内容 me find uncle me next uncle me prev uncle How 你可以使用 parent and prev假设你的叔叔总
  • Visual Studio 2008 插件/加载项开发 - 入门

    和 关联这个计算器问题 我将如何创建自己的 Visual Studio 2008 插件 我查看了 MSDN 上的 Visual Studio 开发人员中心 但信息量巨大 项目类型繁多 我什至不知道从哪里开始 我应该从哪里开始寻找如果我想写一
  • na.locf 但不执行尾随 NA

    我有以下时间序列 gt y lt xts 1 10 Sys Date 1 10 gt y c 1 2 5 9 10 lt NA gt y 1 2011 09 04 NA 2011 09 05 NA 2011 09 06 3 2011 09
  • 如何在 Delphi 中以编程方式创建带有几个组件的表单

    我正在使用 Delphi 7 并尝试以编程方式创建表单 这是我的表单类存根 unit clsTStudentInfoForm interface uses Forms type TStudentInfoForm class TForm en
  • 为什么操作系统在内存足够的情况下却说无法给jvm分配内存

    我正在尝试使用以下命令启动一个新的 jvm java version 但是报错 There is insufficient memory for the Java Runtime Environment to continue Native
  • socket.io 套接字 ID 应该保密吗?

    我正在使用 socket io 开发一个 Web 应用程序 我目前正在使用套接字 ID 作为标识符 该标识符会广播给其他客户端 现在 这引发了安全问题 即该 ID 是否可用于劫持另一个用户会话 不幸的是 在网上很难找到这方面的任何信息 那么
  • 为什么分配给空列表(例如 [] = "")不会出错?

    在 python 3 4 中 我正在输入 并且它工作正常 没有引发异常 虽然当然 不等于 然后 也工作正常 但正如预期的那样引发了异常 但正如预期的那样引发了异常 发生什么了 你不是为了平等而比较 你是指派 Python 允许您分配给多个目
  • iOS模拟器不播放声音[重复]

    这个问题在这里已经有答案了 在 XCode 6 上 设备上一切正常 但在模拟器上 无法播放声音 这是我的快速代码 var url NSURL string http my url com sound mp3 var data NSData
  • 如何在 MySQL 数据库中存储 JSON 字符串

    我使用下面的代码将 JSON 数据存储在 MySQL 表中 如果 JSON 很短 它可以正常工作 但如果文本较长 则会中断 field json 是一个长文本 sql sprintf UPDATE mytable SET field jso
  • C# 获取控件在窗体上的位置

    当控件可能位于其他控件 如面板 内部时 是否有任何方法可以检索控件在表单中的位置 该控件的 Left 和 Top 属性只提供了它在其父控件中的位置 但是如果我的控件位于五个嵌套面板内 并且我需要它在窗体上的位置 该怎么办 快速示例 按钮 b
  • 为什么从 avi 容器解码帧并将其编码为 h264/mp​​4 不起作用?

    我开始使用 ffmpeg 我想将 avi 文件转换为 mp4 h264 文件 我读过很多帖子 包括this 但我找不到任何好的示例如何将帧保存到 mp4 文件 下面的代码是简化的代码 它从 avi 文件中解码帧并将其编码为 H264 mp
  • 内存中 C++ 对象的结构与结构

    如果我有一堂课如下 class Example Class private int x int y public Example Class x 8 y 9 Example Class 和一个结构如下 struct int x int y
  • 如何在Android P上使用apache http

    当我运行我的应用程序时安卓P设备 我收到一些这样的错误 java lang RuntimeException Unable to instantiate application com le android client LeApplica
  • 浮点数学有问题吗?

    考虑以下代码 0 1 0 2 0 3 gt false 0 1 0 2 gt 0 30000000000000004 为什么会出现这些不准确的情况 Binary 浮点数学就是这样 在大多数编程语言中 它基于IEEE 754 标准 问题的关键
  • 在 Angular2 (Typescript) 中实现动态路由 [重复]

    这个问题在这里已经有答案了 RouteConfig 类可用于装饰具有路由功能的组件 RouteConfig 并为该组件定义了某些路由定义 现在 问题是在运行时 动态 注入这些路由定义 原因是 假设我有一个应用程序 其中我必须显示 UI 并定
  • Selenium 元素选择器 - 我认为 xPath 最慢?

    我对一个公共网站进行了一些测试 看看是否可以发现一些不同 Selenium CSS 选择器的性能差异 我运行了一个包含五个节点的集线器 mac chrome local mac safari local mac ff local win7
  • Xcode 4.2 链接错误:libz 问题?

    将项目移至 Xcode 4 2 时 我在 Xcode 4 0 3 中编译和链接正常的项目上遇到了许多 Mach O 链接器未解决的错误 例如 crc32 expf 和 UnwindSjLj Register 我怀疑这可能是 libz 问题
  • CUDA:如何使用 -arch 和 -code 以及 SM 与 COMPUTE

    我仍然不确定在使用 nvcc 构建时如何正确指定代码生成的体系结构 我知道我的二进制文件中嵌入了机器代码和 PTX 代码 并且可以通过控制器开关进行控制 code and arch 或两者的组合使用 gencode 现在 根据this除了两