问题标签 [ptx]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
cuda - 在 Nvidia 的 NVCC 编译器中使用多个“arch”标志的目的是什么?
我最近了解了 NVCC 如何为不同的计算架构编译 CUDA 设备代码。
据我了解,当使用 NVCC 的 -gencode 选项时,“arch”是程序员的应用程序所需的最小计算架构,也是 NVCC 的 JIT 编译器将为其编译 PTX 代码的最小设备计算架构。
我也明白 -gencode 的“代码”参数是 NVCC 完全编译应用程序的计算架构,因此不需要 JIT 编译。
在检查了各种 CUDA 项目 Makefile 之后,我注意到以下情况经常发生:
经过一番阅读,我发现可以在一个二进制文件中编译多个设备架构 - 在本例中为 sm_20、sm_21。
我的问题是为什么需要这么多拱门/代码对?上面是否使用了“arch”的所有值?
那和说有什么区别:
“arch”字段中最早的虚拟架构是自动选择的,还是有其他一些晦涩的行为?
还有其他我应该注意的编译和运行时行为吗?
我已经阅读了手册http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#gpu-compilation,但我仍然不清楚编译或运行时会发生什么。
cuda - PTX - 什么是 CTA?
我正在研究 PTX,但我不明白 CTA(计算线程数组)与 CUDA 块有何不同。
它们是一样的吗?在我看来,现在(我只是在 PTX 文档的开头)它们是一样的
cuda - PTX - .local 和 .param 之间的区别
我正在研究 PTX,但我不明白.param
和.local
状态空间之间的区别。
.local
是线程可见的变量并存储在它们的堆栈中(顺便说一下,线程内存)
.param
是用于对象分配(如果按值传递)、函数参数和返回值以及输入参数的变量,它们也在堆栈上分配
在 PTX 手册上有:
在 PTX 中,可以使用 mov 指令将函数输入参数的地址移动到寄存器中。请注意,如果需要,参数将被复制到堆栈中,因此地址将在
.local
状态空间中,并通过ld.local
和st.local
指令访问。
我不明白:.param
如果.param
==.local
并且所有内容都已经在堆栈上,为什么要将 a 复制到堆栈中?
cuda - PTX - .reg 寄存器在哪里?
当我.reg
用来声明寄存器时......它们在哪里?
我的意思是:如果我.reg
在设备函数内部使用寄存器存储在每个线程拥有的寄存器文件中......但是如果我.reg
在全局范围内的模块中声明一个变量(不是.global
,只是全局范围)怎么办?
cuda - PTX ISA(携带传播)中的错误?
Cuda中有错误吗?我在 GTX580 上运行了以下代码,最后 r1 为零。我希望它是一种由于携带传播?我已经使用 Cuda Toolkit 4.2.9 和 5.5 测试了代码,并使用“nvcc -arch=sm_20 bug.cu -o bug && ./bug”来编译和运行它。
cuda - 在CUDA中将类型转换为unsigned long long?
基本上我想要的是一个像 hiloint2uint64() 这样的函数,只需加入两个 32 位整数并将结果重新解释为 uint64。
我在 CUDA 中找不到任何可以做到这一点的函数,无论如何,是否有任何 ptx 代码可以进行这种类型转换?
cuda - ptx 中的原始数据类型
上面的代码来自这里: CUDA disable L1 cache only for one variable
根据作者的说法,“d”表示浮点数,“r”表示整数。
我想编写一小段内联 asm 代码,我想知道其余原始类型变量的符号(如 unsigned short、unsigned long long、float-32 等),我无法从 ptx isa 中找到它。
我用字母“l”代表unsigned long long,对吗?
cuda - 反汇编的 CUDA 微码中的明显冗余操作
我有以下内核执行全局内存矩阵in
到全局内存矩阵的简单分配out
:
我正在检查由以下内容转储的反汇编微码cuobjdump
:
反汇编代码顶部或旁边的注释是我自己的。
如您所见,有一些明显无用的操作, ???
在注释中标记。本质上,它们是寄存器自身的移动。
然后我有以下两个问题:
- 如果它们没用,我相信它们会无用地消耗计算时间。我可以通过删除它们来优化反汇编的微码吗?
- PTX 文件可以内联在 CUDA 代码中。然而,PTX 只是跨 GPU 的可移植性所需的一种中间语言。我可以以某种方式“内联”优化的反汇编微码吗?
非常感谢您提前。
编辑:在 SM = 2.0 的发布模式下编译的相同代码
编辑:在 SM = 2.1 的发布模式下编译的相同代码
cuda - 如何在运行时生成、编译和运行 CUDA 内核
好吧,我有一个非常微妙的问题:)
让我们从我所拥有的开始:
- 数据,大量数据,复制到 GPU
- 程序,由 CPU(主机)生成,需要针对该数组中的每个数据进行评估
- 程序更改非常频繁,可以生成为 CUDA 字符串、PTX 字符串或其他(?),每次更改后都需要重新评估
我想要什么:基本上只是想让它尽可能有效(快速),例如。避免将 CUDA 编译为 PTX。解决方案甚至可以完全针对特定设备,这里不需要大的兼容性:)
我所知道的:我已经知道函数cuLoadModule,它可以从存储在文件中的 PTX 代码加载和创建内核。但是我认为,必须有其他方法可以直接创建内核,而无需先将其保存到文件中。或者也许可以将其存储为字节码?
我的问题:你会怎么做?您能否发布一个示例或链接到具有类似主题的网站?泰
编辑:现在好了,PTX 内核可以直接从 PTX字符串(字符数组)运行。无论如何,我仍然想知道,有没有更好/更快的解决方案?仍然存在从字符串到某些 PTX 字节码的转换,这应该可以避免。我还怀疑,可能存在一些从 PTX 创建设备特定 Cuda 二进制文件的巧妙方法,这将消除 JIT 编译器滞后(很小,但如果你有大量内核要运行,它可以加起来):)