CUDA有向量操作内置函数吗?

4

我认为由于CUDA可以进行64位和128位的加载/存储,它可能具有一些类似于float3的矢量类型的加法/减法等内置函数,可以用较少的指令完成,就像SSE一样。

CUDA是否有这样的功能?


取决于您所寻找的向量操作级别(您提到了内部函数)。一些64位操作和向量操作可以直接在C/C++中使用(例如复制向量类型或对64位类型进行算术运算,但还有一些其他操作),这些操作被转换为32位PTX/SASS指令。(答案中提到了一些现有的向量操作。)此外,您还可以将张量核心称为向量操作:一方面,它可以通过一个命令在每个线程上执行多个计算,另一方面,整个warp都参与其中。 - Sebastian
2个回答

1
不,它不能。每个线程(从Kepler开始)一次只能运行一个单精度浮点运算,除了FMA之外-可以在一条指令中执行1个乘法和1个加法(z = a*x + y)。

7
不完全正确:有一些所谓的SIMD视频指令,可以操作两个16位或四个8位字。如果我没记错的话,它们是在Kepler架构中引入的,详见:http://docs.nvidia.com/cuda/pdf/ptx_isa_3.2.pdf 第178页。 - kunzmi
5
要使用这些“向量化视频指令”的即用包装函数,请访问:https://devtalk.nvidia.com/default/topic/535684/announcements/release-1-1-of-simd-in-a-word-functions-posted/ - njuffa

1
实际上,现在CUDA确实有一些“向量操作内嵌函数”。至少对于半精度浮点值是这样的。
以下是PTX中最明显的向量内嵌函数示例:使用2个半精度浮点值进行向量加法。

// put some floats in half-precision registers
cvt.rn.f16.f32 h0, f0;
cvt.rn.f16.f32 h1, f1;
cvt.rn.f16.f32 h2, f2;
cvt.rn.f16.f32 h3, f3;

mov.b32  p1, {h0, h1};   // pack two f16 to 32bit f16x2
mov.b32  p2, {h2, h3};   // pack two f16 to 32bit f16x2
add.f16x2  p3, p1, p2;   // SIMD f16x2 addition

请看PTX ISA指南相关章节
现在,虽然我已经在PTX级别上演示了这一点,但是如果NVIDIA还没有提供适当的C++ CUDA内置函数,则将PTX汇编指令包装成几乎一行的函数就可以了。请参见此处的示例,针对@kunzmi提到的“SIMD视频指令”(它是我的cuda-kat库的一部分)。

这些是PTX指令。问题要求内部函数,即类似于C函数的东西,它们将它们包装起来。(例如Intel的 _tzcnt_u32(x),或者GNU C的 __builtin_popcount(x) 这些都是针对特定汇编指令或许多CPU提供但ISO C忽略的操作的众所周知的内部函数示例。)最好提到实际的内部函数,我假设它们将采用unsignedint参数,除非有一个typedef。 - Peter Cordes
@PeterCordes:就像我说的一样-内置函数几乎是PTX指令的一行包装器。有时NVIDIA会提供它们,有时您需要自己编写它们,例如我为我的cuda-kat库中的“视频指令”编写的这里 - einpoklum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接