CUDA PTX 代码和寄存器内存的混淆

2023-11-22

:) 当我尝试管理内核资源时,我决定研究一下 PTX,但有一些事情我不明白。这是我编写的一个非常简单的内核:

__global__
void foo(float* out, float* in, uint32_t n)
{
    uint32_t idx = blockIdx.x * blockDim.x + threadIdx.x;
    uint32_t one = 5;
    out[idx] = in[idx]+one;
}

然后我使用以下方法编译它:nvcc --ptxas-options=-v -keep main.cu我在控制台上得到了这个输出:

ptxas info    : 0 bytes gmem
ptxas info    : Compiling entry function '_Z3fooPfS_j' for 'sm_10'
ptxas info    : Used 2 registers, 36 bytes smem

得到的 ptx 如下:

    .entry _Z3fooPfS_j (
            .param .u64 __cudaparm__Z3fooPfS_j_out,
            .param .u64 __cudaparm__Z3fooPfS_j_in,
            .param .u32 __cudaparm__Z3fooPfS_j_n)
    {
    .reg .u16 %rh<4>;
    .reg .u32 %r<5>;
    .reg .u64 %rd<8>;
    .reg .f32 %f<5>;
    .loc    15  17  0
$LDWbegin__Z3fooPfS_j:
    .loc    15  21  0
    mov.u16     %rh1, %ctaid.x;
    mov.u16     %rh2, %ntid.x;
    mul.wide.u16    %r1, %rh1, %rh2;
    cvt.u32.u16     %r2, %tid.x;
    add.u32     %r3, %r2, %r1;
    cvt.u64.u32     %rd1, %r3;
    mul.wide.u32    %rd2, %r3, 4;
    ld.param.u64    %rd3, [__cudaparm__Z3fooPfS_j_in];
    add.u64     %rd4, %rd3, %rd2;
    ld.global.f32   %f1, [%rd4+0];
    mov.f32     %f2, 0f40a00000;        // 5
    add.f32     %f3, %f1, %f2;
    ld.param.u64    %rd5, [__cudaparm__Z3fooPfS_j_out];
    add.u64     %rd6, %rd5, %rd2;
    st.global.f32   [%rd6+0], %f3;
    .loc    15  22  0
    exit;
$LDWend__Z3fooPfS_j:
    } // _Z3fooPfS_j

现在有些事情我不明白:

  • 根据ptx汇编,使用了4+5+8+5=22个寄存器。那为什么它说used 2 registers编译期间?
  • 查看程序集,我意识到 threadId、blockId 等的数据类型是u16。这是CUDA规范中定义的吗?或者不同版本的 CUDA 驱动程序之间可能会有所不同?
  • 有人可以向我解释一下这一行:mul.wide.u16 %r1, %rh1, %rh2;? %r1 is u32, why wide代替u32用来?
  • 寄存器的名称是如何选择的?在我的花瓶里我明白%r部分但我不明白h,(null),d部分。是根据数据类型长度来选择的吗? IE:h16 位为空,32 位为空,d对于64位?
  • 如果我用这个替换内核的最后两行out[idx] = in[idx];,然后当我编译程序时它说使用了3个寄存器!现在怎么可能使用更多的寄存器呢?

请忽略我的测试内核不检查数组索引是否越界的事实。

非常感谢。


PTX 是一种中间语言,旨在跨多个 GPU 架构进行移植。它由编译器组件 PTXAS 编译为最终的机器代码,也称为 SASS,适用于特定的体系结构。 NVCC 选项-Xptxas -v使 PTXAS 报告有关生成的机器代码的各种统计信息,包括机器代码中使用的物理寄存器的数量。您可以通过反汇编来检查机器代码cuobjdump --dump-sass.

因此,PTX 代码中使用的寄存器数量没有任何意义,因为这些是虚拟寄存器。 CUDA 编译器以所谓的 SSA 形式生成 PTX 代码(静态单赋值,请参阅http://en.wikipedia.org/wiki/Static_single_assignment_form)。这基本上意味着写入的每个新结果都会分配一个新寄存器。

指令mul.widePTX 规范中对此进行了描述,您可以在此处找到其当前版本 (3.1):http://docs.nvidia.com/cuda/parallel-thread-execution/index.html。在您的示例代码中,后缀.u16意味着它将两个无符号 16 位量相乘并返回无符号 32 位结果,即它计算源操作数的完整双角乘积。

PTX 中的虚拟寄存器是有类型的,但它们的名称可以自由选择,与类型无关。 CUDA 编译器似乎遵循某些约定(据我所知)没有记录,因为它们是内部实现工件。查看一堆 PTX 代码,可以清楚地看到当前生成的寄存器名称编码类型信息,这样做可能是为了便于调试:p<num>用于谓词,r<num>对于 32 位整数,rd<num>对于 64 位整数,f<num>对于 32 位浮点数,以及fd<num>对于 64 位双精度数。您可以通过查看以下内容轻松地亲眼看到这一点.regPTX 代码中创建这些虚拟寄存器的指令。

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

CUDA PTX 代码和寄存器内存的混淆 的相关文章

  • 将 GPUJPEG 项目移植到 Windows

    我目前正在尝试移植 GPUJPEG 在 Sourceforge 上 http sourceforge net projects gpujpeg 库 基于 CUDA 从 Unix 到 Windows 现在我被卡住了 我不知道发生了什么或为什么
  • 如何在 CUDA 应用程序中构建数据以获得最佳速度

    我正在尝试编写一个简单的粒子系统 利用 CUDA 来更新粒子位置 现在 我定义的粒子有一个对象 该对象的位置由三个浮点值定义 速度也由三个浮点值定义 更新粒子时 我向速度的 Y 分量添加一个常量值以模拟重力 然后将速度添加到当前位置以得出新
  • 某些子网格未使用 CUDA 动态并行执行

    我正在尝试 CUDA 5 0 GTK 110 中的新动态并行功能 我遇到了一个奇怪的行为 即我的程序没有返回某些配置的预期结果 不仅是意外的 而且每次启动都会出现不同的结果 现在我想我找到了问题的根源 似乎当生成太多子网格时 某些子网格 由
  • 如何用Go语言的cgo编译Cuda源码?

    我用 cuda c 编写了一个简单的程序 它可以在 eclipse nsight 上运行 这是源代码 include
  • 使用 CUDA __device__ 函数时出现链接器错误 2005 和 1169(多重定义的符号)(默认情况下应内联)

    这个问题与以下问题有很大关系 A 如何将CUDA代码分成多个文件 https stackoverflow com questions 2090974 how to separate cuda code into multiple files
  • CUDA:如何在设备上填充动态大小的向量并将其内容返回到另一个设备函数?

    我想知道哪种技术可以填充设备上的动态大小数组 int row 在下面的代码中 然后返回其内容 以供另一个设备函数使用 为了将问题置于上下文中 下面的代码尝试使用在 GPU 上运行的高斯 勒让德求积来跨越勒让德多项式基组中的任意函数 incl
  • libstdc++.so.6 与 cuda 相关的链接器问题

    今天我在链接我编译的 cuda 内容时遇到了问题 我有一个最新的 debian 测试 w 2 6 32 3 amd64 我整天都在写我的代码 不时编译 没有问题 但在进行了较小的代码更改后 我收到以下错误 gcc o pa CUDA o h
  • “计算能力”是什么意思? CUDA?

    我是CUDA编程新手 对此了解不多 您能告诉我 CUDA 计算能力 是什么意思吗 当我在大学服务器上使用以下代码时 它向我显示了以下结果 for device 0 device lt deviceCount device cudaDevic
  • 同时使用 2 个 GPU 调用 cudaMalloc 时性能较差

    我有一个应用程序 可以在用户系统上的 GPU 之间分配处理负载 基本上 每个 GPU 都有一个 CPU 线程来启动一个GPU处理间隔当由主应用程序线程定期触发时 考虑以下图像 使用 NVIDIA 的 CUDA 分析器工具生成 作为示例GPU
  • cuda 共享内存 - 结果不一致

    我正在尝试并行缩减以对 CUDA 中的数组求和 目前我传递一个数组来存储每个块中元素的总和 这是我的代码 include
  • MPI+CUDA 与纯 MPI 相比有何优势?

    加速应用程序的常用方法是使用 MPI 或更高级别的库 例如在幕后使用 MPI 的 PETSc 并行化应用程序 然而 现在每个人似乎都对使用 CUDA 来并行化他们的应用程序或使用 MPI 和 CUDA 的混合来解决更雄心勃勃 更大的问题感兴
  • 加速Cuda程序

    要更改哪一部分来加速此代码 代码到底在做什么 global void mat Matrix a Matrix b int tempData new int 2 tempData 0 threadIdx x tempData 1 blockI
  • 如何在cmake中添加cuda源代码的定义

    我使用的是 Visual Studio 2013 Windows 10 CMake 3 5 1 一切都可以使用标准 C 正确编译 例如 CMakeLists txt project Test add definitions D WINDOW
  • cudaSetDevice() 对 CUDA 设备的上下文堆栈有何作用?

    假设我有一个与设备关联的活动 CUDA 上下文i 我现在打电话cudaSetDevice i 会发生什么 Nothing 主上下文取代了堆栈顶部 主上下文被压入堆栈 事实上 这似乎是不一致的 我编写了这个程序 在具有单个设备的机器上运行 i
  • __device__ __constant__ 常量

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

    这是一个关于如何确定CUDA网格 块和线程大小的问题 这是对已发布问题的附加问题here https stackoverflow com a 5643838 1292251 通过此链接 talonmies 的答案包含一个代码片段 见下文 我
  • 云或烟雾的粒子系统

    我正在尝试使用 OpenGL 和 CUDA 制作一个简单的用于云和烟雾模拟的粒子系统 如何使粒子系统中的粒子表现得像真正的云或烟雾在低湍流风中的表现 我现在遇到的一些问题是 颗粒聚集成一个大球 粒子扩散到无限远 粒子突然弹射离开 我已经完成
  • CUDA NSight 未随 Windows 8 上的 CUDA 5.0 安装文件一起安装? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 据我所知 Nvidia 网站上没有 Nsight Eclipse 的下载链接 它说它将由 CUDA 5 安装本机安装 但并没有随CUDA安装一起安装
  • 为什么 cuCtxCreate 返回旧上下文?

    我已经安装了 CUDA SDK 4 2 64 CUDA工具包4 2 64 CUDA 驱动程序 4 2 64 我检查了 windows 中的每个 nvcuda dll 所有这些都是 4 2 版本 但是当我使用驱动程序 api 创建上下文并使用
  • CUDA计算能力2.0。全局内存访问模式

    CUDA 计算能力 2 0 Fermi 全局内存访问通过 768 KB L2 缓存进行 看起来 开发人员不再关心全局内存库 但全局内存仍然非常慢 因此正确的访问模式很重要 现在的重点是尽可能多地使用 重用 L2 我的问题是 如何 我将感谢一

随机推荐

  • Maven 版本插件:从 Maven 依赖项引用rule.xml?

    我正在使用mvn versions display dependency updates versions display plugin updates检查依赖项或插件更新的目标 我的 Maven 项目是一个多模块项目 如下所示 modul
  • Android 旋转分隔线颜色

    我有一个像这样的旋转器
  • 使用 EQATEC Profiler 分析 ASP.NET 网站

    我正在寻找免费的 ASP NET 分析器 我偶然发现了适用于 NET 的 EQATEC 分析器 但我找不到任何有关如何使用它分析 ASP NET 项目的说明 请发布分步说明或包含足够信息的链接 我使用的是 Visual Studio 200
  • OpenSource .net SMS 库,我似乎根本找不到 C# 的库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我一直在我的项目中使用 GSM 调制解调器发送 接收SMS s 我一直使用内置的串口通信功能 net通过使用标准 AT 命令来完成此操作 现在我必须扩展它的功能 例如 PDU 模式下
  • 如何修复这个非递归奇偶合并排序算法?

    我正在寻找非递归奇偶合并排序算法并找到了 2 个来源 一本书来自塞奇威克 R this 那么问题 两种算法相同但都是错误的 生成的排序网络不是奇偶合并排序网络 这是具有 32 个输入的结果网络的图像 两条水平线之间的垂直线表示将值 a x
  • 如何在 web.config 中设置 ServicePointManager.ServerCertificateValidationCallback

    如何在 web config 文件中设置它 ServicePointManager ServerCertificateValidationCallback sender cert chain sslPolicyErrors gt true
  • 当字段有下划线时 Magic Doctrine2 查找器?

    我使用时遇到问题find Doctrine2 领域时的魔法方法有一个下划线之间 repository gt findByName Hello Works repository gt findByIsEnabled true 实体 Acme
  • 我如何使用 android 的phonegap 调用网络服务

    如何从我的 PhoneGap 应用程序发起 Web 服务调用 我发现了两个 javascript 库 一个来自 IBM 另一个来自 IvanWebServicehttp wiki phonegap com w page 43725416 S
  • 从后台工作线程修改 Qt GUI

    我在 Qt 中工作 当我按下 GO 按钮时 我需要不断地将包发送到网络并使用我收到的信息修改界面 问题是我有一个while 1 在按钮中 因此按钮永远不会完成 因此界面永远不会更新 我想在按钮中创建一个线程并将while 那里有代码 我的问
  • Git 推送到远程存储库上的特定文件夹

    如何推送到远程存储库中的特定文件夹 我的本地 C 驱动器上有以下结构 myfolder git folder1 folder2 folder3 folder4 gitignore 我执行了git init命令在此文件夹中 之后我做了git
  • C:数据结构对齐

    我正在处理结构 并且有几个关于它们的问题 据我了解 结构变量将按顺序放置在内存中 块 字 的长度取决于机器架构 32 位 4 字节 64 位 8 字节 假设我们有 2 个数据结构 struct ST1 char c1 short s cha
  • Java:如何原子地替换映射中的所有值?

    我在多线程环境中有一个有状态 bean 它将其状态保存在映射中 现在我需要一种方法来在一个原子操作中替换该映射的所有值 public final class StatefulBean private final Map
  • WinAPI 和 UTF-8 支持

    关于 UTF 8 支持和各种 Win32 API 的快速问题 在典型的C MFC项目中 MessageBox 是否可以显示UTF 8编码的字符串 谢谢 安德鲁 快速回答 不 更长的答案 如果字符串仅包含常规 ANSI 字符 例如美国英语 则
  • MS Access 中多值字段的替代方案

    相关问题 多值字段是个好主意吗 我知道多值字段类似于多对多关系 在 MS Access 应用程序中替换多值字段的最佳方法是什么 我有一个具有多值字段的应用程序 我不确定如何消除这些并以单值字段的形式实现完全相同的逻辑 当我想将多值关系转变为
  • 在 java.util.logginglogging.properties 文件中,“handlers”和“.handlers”之间有什么区别?

    在LogManager的文档中 Handlers属性的设置如下 财产 处理者 这定义了空格或逗号分隔 要加载和注册的处理程序类的类名列表 根 Logger 上的处理程序 名为 的 Logger 属性 handlers 这定义了一个空格或逗号
  • 从 SqlDependency 获取数据

    我有一个表和一个正在等待新插入的 SqlDependency OnChange 根据我的需要触发 但我不明白是否可以获得导致数据库更改的行 SqlDependency sql命令 SqlCommand cmd new SqlCommand
  • 我的 ASP.NET App_code 更改没有被拾取(或被缓存??)

    帮助 我在 根级别 App Code 目录下有一个 cs 文件 用于检索所请求 URL 的正确模板 它链接到我们自己的内容管理数据库 最初 它工作正常 我可以对其进行更改 并且 Web 应用程序可以正常接收它们 然后发生了一些事情 不知道是
  • 无法使用 MPMoviePlayerController 从视频中获取多个图像。操作系统状态-12433

    我正在尝试使用 MPMoviePlayerController 从选定的视频文件中提取多个图像 下面是我写的代码 movie MPMoviePlayerController alloc initWithContentURL info obj
  • “dlsym”的库在哪里

    我收到此链接器错误 system core libacc tests main cpp 42 error undefined reference to dlsym 你能告诉我 ubuntu 9 10 上包含 dlsym 库的库在哪里吗 谢谢
  • CUDA PTX 代码和寄存器内存的混淆

    当我尝试管理内核资源时 我决定研究一下 PTX 但有一些事情我不明白 这是我编写的一个非常简单的内核 global void foo float out float in uint32 t n uint32 t idx blockIdx x