问题标签 [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.

0 投票
1 回答
9768 浏览

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 汇编程序)。

...但它仍然没有解释“左漏斗移位”或“右漏斗移位”是什么。

那么,它是什么,在哪里需要它?

0 投票
1 回答
336 浏览

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 逻辑操作orxor, 等仅对大于 8 位的类型进行操作。也就是说,我可以对unsigned intwith进行逻辑运算or.u32 <out>,<in1>,<in2>。但是,由于 C++11bool类型似乎是 8 位,这是否意味着我不能对bools直接从 CPU 复制到 GPU 内存的数组进行操作,因此我需要将boolsfirst 的数组转换为某种类型的 PTX 逻辑操作吗?操作,即u32u16等?

0 投票
1 回答
203 浏览

assembly - PTX“位桶”寄存器

...只是在PTX 手册中提到。没有关于它们有什么好处或如何使用它们的提示。

有人知道更多吗?我只是错过了一个共同的概念吗?

0 投票
2 回答
478 浏览

cuda - 共享内存中的 PTX 可变长度缓冲区

我正在尝试在 PTX 中实现一个全局归约内核,它使用共享内存在线程块内进行归约(就像那里的所有 CUDA C 示例一样)。在 CUDA C 中,可以在共享内存中定义一个可变长度数组

如何在 PTX 中获得等价物?

看起来不合适的是一个固定长度的数组,比如

因为我希望内核可重用于不同的输入数组长度。

我能做的是定义一个变量

并将其用作数组的基地址。希望它是在共享内存开始时分配的。然后我可以访问数组元素

这看起来也有点好笑,因为sdata它被定义为float. 但它实际上是浮点数的地址。从这个意义上说,上述行确实是正确的。但是我不确定这是否保证正确,只要偏移量不大于内核启动时指定的共享内存大小。

PTX 手册没有解释共享内存中的可变长度缓冲区。

任何人都知道如何在 PTX 中实现可变长度缓冲区?

0 投票
1 回答
355 浏览

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.

0 投票
1 回答
754 浏览

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 内核:

0 投票
1 回答
1423 浏览

c - acosf 实现中的 CUDA __float_as_int

CUDA C 的数学函数实现 ( cuda/math_function.h)acosf包含以下段落:

其中at1floatsCUDART_PI_Ffloat先前设置为接近数学常数 Pi 的数值。我试图了解条件(if-clause)正在测试什么以及它的 C 等价物或 function/macro 是什么__float_as_int(a)。我搜索了__float_as_int()但没有成功的实现。这似乎__float_as_int()是 NVIDIA NVCC 的内置宏或函数。查看 NVCC 从上述段落中产生的 PTX:

很明显,这不是__float_as_int()四舍五入。(这将产生一个。)相反,它将作为位副本()分配给(注意:是类型(无符号整数)!!),然后将其作为(有符号整数,混淆!!)与(谁的价值是)。floatintcvt.s32.f32float %f1b32%r1%r1u32%r1s32%r20

对我来说,这看起来有点奇怪。但显然它是正确的。

有人可以解释发生了什么,特别是解释__float_as_int()在 if 子句测试是否定的(<0)的上下文中正在做的事情吗?.. 并提供与 if 子句和/或__float_as_int()marco 等效的 C 语言?

0 投票
1 回答
579 浏览

cuda - CUDA PTX 代码 %envreg<32> 特殊寄存器

我尝试使用 CUDA 驱动程序 API 运行由 .cl 内核生成的 PTX 汇编代码。我采取的步骤是这些(标准的opencl程序):

1) 加载 .cl 内核

2) JIT 编译

3) 获取编译好的ptx代码并保存。

到现在为止还挺好。

我注意到 ptx 程序集内的一些特殊寄存器,%envreg3,%envreg6 等。问题是当我尝试使用驱动程序 API。所以代码陷入了无限循环,无法正确运行。但是,如果我手动设置这些值(我将 %envreg6 替换为 ptx 内的块大小),代码正在执行并且我得到正确的结果(与 cpu 结果相比是正确的)。

有谁知道我们如何为这些寄存器设置值,或者如果我遗漏了什么?即 cuLaunchKernel 上的一个标志,它为这些寄存器设置值?

0 投票
1 回答
193 浏览

java - PTX 到 OpenCl 中的目标翻译

在 OpenCL 中,“PTX(就像 java 中的字节码)到目标转换器”是一个解释器(就像我们在 java 中的字节码一样)还是一个提前的汇编器?

0 投票
1 回答
1889 浏览

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 页列出了一些约束字母)。所以我的问题是:

问题

  1. 是否有任何类型的任何 CUDA 内联 PTX 约束字母:

    • 布尔值
    • 无符号 8 位整数
    • 或 evtl 8 位二进制变量
  2. 如果没有,我该怎么办(在介绍中解释)?-这里简短讨论的参数“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 位寄存器中。