问题标签 [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 - 漏斗转移 - 它是什么?
在阅读 CUDA 5.0 Programming Guide 时,我偶然发现了一个名为“Funnel shift”的功能,该功能存在于 3.5 计算设备中,但不是 3.0。它包含一个注释“参见参考手册”,但是当我在手册中搜索“漏斗移位”术语时,我什么也没找到。
我试着用谷歌搜索它,但只在第 8 章的http://www.cudahandbook.com上找到了提及:
8.2.3 漏斗转移(SM 3.5)
GK110 添加了一个 64 位“漏斗移位”指令,可以使用以下内部函数访问该指令:
__funnelshift_lc():返回左漏斗移位的最高有效 32 位。
__funnelshift_rc():返回右漏斗移位的最低有效 32 位。
这些内在函数在 sm_35_intrinsics.h 中实现为内联设备函数(使用内联 PTX 汇编程序)。
...但它仍然没有解释“左漏斗移位”或“右漏斗移位”是什么。
那么,它是什么,在哪里需要它?
c++ - 从 Nvidia PTX 访问 bool (C++11) 数组的便携式方式
我需要在 CPU 内存(使用 C++11 代码)中创建的布尔数组bool[]
(注意,不是 a std::vector<bool>
)上进行 GPU 计算,然后通过cuMemCpy
或类似方法复制到 GPU。
第一个问题:
sizeof(bool)
报告 1 个字节。这是由 C++11 标准保证的吗?
第二个问题:
true
( )总是false
表示为1
( 0
) (在unsigned char
表示中)还是编译器在这里有自由?(如果需要,它可以使用任何小于 256 的非零整数)
第三个问题(特定于 PTX):
在 PTX 逻辑操作or
中xor
, 等仅对大于 8 位的类型进行操作。也就是说,我可以对unsigned int
with进行逻辑运算or.u32 <out>,<in1>,<in2>
。但是,由于 C++11bool
类型似乎是 8 位,这是否意味着我不能对bools
直接从 CPU 复制到 GPU 内存的数组进行操作,因此我需要将bools
first 的数组转换为某种类型的 PTX 逻辑操作吗?操作,即u32
,u16
等?
assembly - PTX“位桶”寄存器
...只是在PTX 手册中提到。没有关于它们有什么好处或如何使用它们的提示。
有人知道更多吗?我只是错过了一个共同的概念吗?
cuda - 共享内存中的 PTX 可变长度缓冲区
我正在尝试在 PTX 中实现一个全局归约内核,它使用共享内存在线程块内进行归约(就像那里的所有 CUDA C 示例一样)。在 CUDA C 中,可以在共享内存中定义一个可变长度数组
如何在 PTX 中获得等价物?
看起来不合适的是一个固定长度的数组,比如
因为我希望内核可重用于不同的输入数组长度。
我能做的是定义一个变量
并将其用作数组的基地址。希望它是在共享内存开始时分配的。然后我可以访问数组元素
这看起来也有点好笑,因为sdata
它被定义为float
. 但它实际上是浮点数的地址。从这个意义上说,上述行确实是正确的。但是我不确定这是否保证正确,只要偏移量不大于内核启动时指定的共享内存大小。
PTX 手册没有解释共享内存中的可变长度缓冲区。
任何人都知道如何在 PTX 中实现可变长度缓冲区?
arrays - PTX arrays as operands not working
The PTX manual (version 2.3) (http://developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/ptx_isa_2.3.pdf) 6.4.2 states:
Array elements can be accessed using an explicitly calculated byte address, or by indexing into the array using square-bracket notation. The expression within square brackets is either a constant integer, a register variable, or a simple “register with constant offset” expression, where the offset is a constant expression that is either added or subtracted from a register variable. If more complicated indexing is desired, it must be written as an address calculation prior to use.
When I try this I can only get the version pointer plus byte offset to work, i.e. [a+0]
.
This code fails to load:
Whereas this loads fine:
The problem with the byte offset version is that it really is a byte offset. So, one has to take the underlying size of the type into account, i.e. the second element is [a+4]
. Whereas a[1]
is supposed to work this out for you.
Ideas what's going wrong?
EDIT
And there is an even more severe issue here involved: The above text states that a register variable can be used to index the array, like:
where u0
is probably a .reg.u32
or some other compatible integer.
However, with the pointer plus byte offset method this is not possible. It is illegal to do something like:
Now this is a severe limitation. however, one can do another address calculation prior to the load statement. But this complicates things.
c - 只有以 2 为底的对数可用时的自然对数实现
我正在尝试用 PTX 实现自然对数。PTX 本身只提供lg2.approx.f32
实现以 2 为底的对数。因此,应用简单的数学,只需将以 2 为底的对数乘以欧拉数 e 的以 2 为底的对数即可得到自然对数:
log_e(a) = log_2(a) / lg_2(e)
第一个近似值1/lg_2(e)
是0.693147
。所以,我只想乘以这个数字。
我已经nvcc
将函数(来自 CUDA C)编译log
成 PTX(请在下面找到输出)。我可以看到最后与数字常数相乘。但是还有很多事情要做。这很重要吗?有人可以解释为什么会有这么多开销吗?
* 编辑 *
只是为了完整。这里是我编译成上述 PTX 的 CUDA C 内核:
c - acosf 实现中的 CUDA __float_as_int
CUDA C 的数学函数实现 ( cuda/math_function.h
)acosf
包含以下段落:
其中a
和t1
是floats
和CUDART_PI_F
是float
先前设置为接近数学常数 Pi 的数值。我试图了解条件(if-clause)正在测试什么以及它的 C 等价物或 function/macro 是什么__float_as_int(a)
。我搜索了__float_as_int()
但没有成功的实现。这似乎__float_as_int()
是 NVIDIA NVCC 的内置宏或函数。查看 NVCC 从上述段落中产生的 PTX:
很明显,这不是__float_as_int()
四舍五入。(这将产生一个。)相反,它将作为位副本()分配给(注意:是类型(无符号整数)!!),然后将其作为(有符号整数,混淆!!)与(谁的价值是)。float
int
cvt.s32.f32
float %f1
b32
%r1
%r1
u32
%r1
s32
%r2
0
对我来说,这看起来有点奇怪。但显然它是正确的。
有人可以解释发生了什么,特别是解释__float_as_int()
在 if 子句测试是否定的(<0
)的上下文中正在做的事情吗?.. 并提供与 if 子句和/或__float_as_int()
marco 等效的 C 语言?
cuda - CUDA PTX 代码 %envreg<32> 特殊寄存器
我尝试使用 CUDA 驱动程序 API 运行由 .cl 内核生成的 PTX 汇编代码。我采取的步骤是这些(标准的opencl程序):
1) 加载 .cl 内核
2) JIT 编译
3) 获取编译好的ptx代码并保存。
到现在为止还挺好。
我注意到 ptx 程序集内的一些特殊寄存器,%envreg3,%envreg6 等。问题是当我尝试使用驱动程序 API。所以代码陷入了无限循环,无法正确运行。但是,如果我手动设置这些值(我将 %envreg6 替换为 ptx 内的块大小),代码正在执行并且我得到正确的结果(与 cpu 结果相比是正确的)。
有谁知道我们如何为这些寄存器设置值,或者如果我遗漏了什么?即 cuLaunchKernel 上的一个标志,它为这些寄存器设置值?
java - PTX 到 OpenCl 中的目标翻译
在 OpenCL 中,“PTX(就像 java 中的字节码)到目标转换器”是一个解释器(就像我们在 java 中的字节码一样)还是一个提前的汇编器?
cuda - 缺少 8 位变量的 CUDA 内联 PTX 约束字母,以禁用 8 位变量的 L1 缓存(布尔)
介绍
在这个问题中,我们可以学习如何为单个变量禁用 L1 缓存。这是公认的答案:
如上所述,您可以使用内联 PTX,这是一个示例:
您可以通过将 .f64 替换为 .f32 (float) 或 .s32 (int) 等来轻松改变这一点,return_value "=d" 的约束为 "=d" (float) 或 "=r" (int) 等。注意 (addr) 之前的最后一个约束 - “l” - 表示 64 位寻址,如果您使用 32 位寻址,它应该是“r”。
但是,现在我想加载一个布尔值(1 字节)而不是浮点数。所以,我认为我可以做这样的事情(对于架构> = sm_20):
, 在哪里 ”???” 应该是布尔值的适当约束字母,分别是 8 位无符号整数(从这个问题,我推断出这一点,因为注意到对于 >=sm_20,“u8”用于布尔值)。但是,我在 nvidias 文档“ Using inline PTX Assembly in CUDA ”中找不到合适的约束字母(第 6 页列出了一些约束字母)。所以我的问题是:
问题
是否有任何类型的任何 CUDA 内联 PTX 约束字母:
- 布尔值
- 无符号 8 位整数
- 或 evtl 8 位二进制变量
如果没有,我该怎么办(在介绍中解释)?-这里简短讨论的参数“b0”、“b1”等有帮助吗?
非常感谢您提前提供任何帮助或意见!
更新
我还需要一个从 L2 缓存而不是全局内存读取的存储函数 - 即与上述 ld_gbl_cg 函数互补的存储函数(只有拥有此函数后,我才能完全验证 njuffa 的答案是否有效)。根据下面 njuffa 的回答,我的最佳猜测是:
但是,编译器给出警告“参数“addr”已设置但从未使用过”,并且程序在运行时失败并出现“未指定的启动失败”。我也尝试使用 .u16 而不是 .u8,因为我不知道它到底指的是什么。然而结果是一样的。
(附加信息) PTX 3.1 文档中的以下段落似乎对这个问题很重要:
5.2.2 子字大小的限制使用 .u8、.s8 和 .b8 指令类型仅限于 ld、st 和 cvt 指令。.f16 浮点类型仅允许在与 .f32 和 .f64 类型之间进行转换。所有浮点指令仅在 .f32 和 .f64 类型上运行。为方便起见,ld、st 和 cvt 指令允许源和目标数据操作数比指令类型大小更宽,以便可以使用常规宽度寄存器加载、存储和转换窄值。例如,在加载、存储或转换为其他类型和大小时,8 位或 16 位值可以直接保存在 32 位或 64 位寄存器中。