gpt4 book ai didi

cuda - CUDA内核有矢量指令吗?

转载 作者:行者123 更新时间:2023-12-01 05:08:07 26 4
gpt4 key购买 nike

根据大多数NVidia文档,CUDA内核是标量处理器,应仅执行标量运算,这些运算将矢量化为32分量SIMT扭曲。

但是OpenCL具有像uchar8这样的向量类型,它的大小与ulong(64位)相同,可以由单个标量内核处理。如果我在uchar8向量上进行操作(例如,按组件进行加法运算),这还会映射到单个内核上的指令吗?

如果一个块(工作组)中有1024个工作项,并且每个工作项都处理一个uchar8,这是否可以有效地并行处理8120 uchar

编辑:
我的问题是,在专门用于CUDA架构(独立于OpenCL)上,“标量”内核中是否有一些矢量指令可用。因为如果内核已经能够处理32位类型,则合理的是,例如它也可以处理32位uchar4的加法运算,尤其是因为矢量运算通常用于计算机图形学中。

最佳答案

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

这些作为典型结构公开,因此您可以引用例如.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中适当的整数单元)中执行的一系列操作。由于NVIDIA GPU硬件不对单个内核/时钟/指令内的8路uchar添加提供任何直接支持,因此,OpenCL(如在NVIDIA GPU上实现的)确实没有太大不同。从底层来看,底层的机器代码将是一系列操作,而不是一条指令。

顺便说一句,CUDA(或PTX或CUDA内部函数)的确在单个内核/线程/指令内提供了有限数量的向量运算。例如:


有限的一组“本机” "video" SIMD instructions。这些指令是每个线程的,因此,如果必须使用,它们必须允许每个线程最多“原生”支持4x32 = 128(8位)个操作数,尽管这些操作数必须正确地打包到32位寄存器中。您可以通过一组内置的 intrinsics从C ++直接访问它们。 (CUDA warp是一组32个线程,是在具有CUDA功能的GPU上锁步并行执行和调度的基本单位。)
向量(SIMD)乘累加运算,它不能直接转换为单个特定的逐元素运算重载,即所谓的int8 dp2a和dp4a指令。这里的int8有点误导。它不是指int8向量类型,而是指单个32位字/寄存器中4个8位整数数量的压缩排列。同样,可以通过 intrinsics访问它们。
对于某些操作,本机通过cc 5.3和更高版本的GPU中的 half2向量类型支持16位浮点。
新的Volta tensorCore有点像SIMD-per-thread操作,但它在一组16x16输入矩阵上(全范围)运行,从而产生16x16矩阵结果。


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

在CUDA中,您可以为某些操作和向量类型提供自己的重载,这些重载可以用一条指令大致表示。例如,可以使用 __vadd4() intrinsic“本地”执行 uchar4加法(可能包括在操作符重载的实现中。)同样,如果您编写自己的操作符重载,我认为这并不困难使用两个 uchar8指令执行 __vadd4()按元素矢量相加。

关于cuda - CUDA内核有矢量指令吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48345049/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com