CUDA内核有矢量指令吗?

CUDA内核有矢量指令吗?,cuda,opencl,gpu,nvidia,gpgpu,Cuda,Opencl,Gpu,Nvidia,Gpgpu,根据大多数NVidia文档,CUDA内核是标量处理器,应该只执行标量操作,这将矢量化为32个组件SIMT扭曲 但是OpenCL有向量类型,例如uchar8。它的大小与ulong(64位)相同,可以由单个标量核处理。如果我在uchar8向量上执行操作(例如组件式加法),这是否也会映射到单个内核上的指令 如果一个块(工作组)中有1024个工作项,并且每个工作项处理一个uchar8,那么这会有效地并行处理8120uchar 编辑: 我的问题是,在CUDA体系结构上(独立于OpenCL),是否有一些向量

根据大多数NVidia文档,CUDA内核是标量处理器,应该只执行标量操作,这将矢量化为32个组件SIMT扭曲

但是OpenCL有向量类型,例如
uchar8
。它的大小与
ulong
(64位)相同,可以由单个标量核处理。如果我在
uchar8
向量上执行操作(例如组件式加法),这是否也会映射到单个内核上的指令

如果一个块(工作组)中有1024个工作项,并且每个工作项处理一个
uchar8
,那么这会有效地并行处理8120
uchar

编辑: 我的问题是,在CUDA体系结构上(独立于OpenCL),是否有一些向量指令可以在“标量”内核中使用。因为如果核心已经能够处理32位类型,那么如果它也能够处理32位
uchar4
的添加,这将是合理的,特别是因为向量运算通常用于计算机图形学

如果我在uchar8向量上执行操作(例如组件式加法),这是否也会映射到单个内核上的指令

当然,它总是在一个单核上(来自单个内核/工作项的指令不会跨核,但特殊指令(如屏障)除外),但它可能不止一条指令。这取决于硬件是否本机支持uchar8上的操作。如果没有,则uchar8将被分解为所需的任意多个片段,并且每个片段将使用单独的指令进行处理

OpenCL非常“通用”,因为它支持许多不同的向量类型/大小组合,但现实世界的硬件通常只实现一些向量类型/大小组合。您可以查询OpenCL设备的“首选向量大小”,它应该告诉您该硬件最有效的是什么。

CUDA具有“内置”(即预定义)向量类型,对于4字节数量(例如
int4
)最大为4,对于8字节数量(例如
double2
)最大为2。CUDA线程的最大读/写事务大小为16个字节,因此这些特定的大小选择往往与

它们作为典型结构公开,因此您可以引用例如
.x
来访问向量类型的第一个元素

与OpenCL不同,CUDA不为基本算术提供内置操作(“重载”),例如,对于这些向量类型上的元素操作,
+
-
,等等。没有特别的理由你不能自己提供这样的重载。同样,如果需要
uchar8
,可以轻松地为此类对象以及任何所需的运算符重载提供结构定义。这些可能可以像普通C++代码一样实现。 那么,一个潜在的问题可能是,CUDA和OpenCL在这方面的实现有什么不同?如果我在
uchar8
上操作,例如

uchar8 v1 = {...};
uchar8 v2 = {...};
uchar8 r = v1 + v2;
OpenCL和CUDA在机器性能(或低级代码生成)方面有什么不同

对于CUDA功能的GPU来说,可能不会太多。CUDA核心(即底层ALU)在这种代码操作上没有直接的本地支持,它在 UCHAR8中,而且,如果您编写了自己的C++兼容的重载,那么您可能会使用C++语言来进行语义,这将本质上是串行的:

r.x = v1.x + v2.x;
r.y = v1.y + v2.y;
...
因此,这将分解为在CUDA内核(或CUDA SM中的适当整数单元)上执行的一系列操作。由于英伟达GPU硬件不提供任何支持直接在一个核心/时钟/指令的8路UCHAR添加,所以实际上没有办法OpenCL(如在NVIDIA GPU上实现)可能有很大不同。在较低的层次上,底层机器代码将是一系列操作,而不是一条指令

另一方面,CUDA(或PTX,或CUDA intrinsics)在单个内核/线程/指令中提供了有限数量的向量操作。例如:

  • 一组有限的“本机”。这些指令是每个线程的,因此如果使用,它们允许“本机”支持每个扭曲最多4x32=128(8位)操作数,尽管操作数必须正确打包到32位寄存器中。您可以直接通过C++内置的一组访问这些。(CUDA warp是一组32个线程,是支持CUDA的GPU上lockstep并行执行和调度的基本单元。)

  • 一种向量(SIMD)乘法累加操作,不能直接转换为单个特定的元素操作重载,即所谓的int8 dp2a和dp4a指令。int8在这里有些误导。它不是指int8向量类型,而是指单个32位字/寄存器中4个8位整数量的压缩排列。同样,这些都可以通过

  • 对于某些操作,16位浮点通过cc 5.3和更高GPU中的
    half2
    向量类型本机支持

  • 新的Volta tensorCore有点像SIMD每线程操作,但它对一组16x16输入矩阵进行操作(扭曲范围),产生16x16矩阵结果

  • 即使有一个智能OpenCL编译器可以将某些向量操作映射到硬件“本机”支持的各种操作中,它也不能完全覆盖。在单个指令中,单个核/线程上的8宽向量(例如
    uchar8
    )没有操作支持,仅举一个例子。因此,一些序列化是必要的。实际上,我认为NVIDIA的OpenCL编译器没有那么聪明,所以我的期望是,如果您研究机器代码,您会发现这样的每线程向量操作完全序列化

    在库达