CUDA Scalar 和 SIMD 视频指令的效率
Posted
技术标签:
【中文标题】CUDA Scalar 和 SIMD 视频指令的效率【英文标题】:efficiency of CUDA Scalar and SIMD video instructions 【发布时间】:2014-07-08 14:49:47 【问题描述】:SIMD 指令的吞吐量低于 32 位整数运算。 如果是 SM2.0(仅标量指令版本),则要低 2 倍。 在 SM3.0 的情况下低 6 倍。
什么情况下适合使用?
【问题讨论】:
【参考方案1】:如果您的数据已经打包成由 SIMD 视频指令本地处理的格式,则需要多个步骤才能将其解包,以便可以通过普通指令处理。
此外,与普通算术运算相比,SIMD 视频指令的吞吐量还应乘以实际执行的运算次数。
例如,对于指令vadd4,正在对压缩的 32 位数量(4 字节整数数量)执行 4 次整数加法。为了用普通整数加法复制这种行为,需要相当复杂的指令序列将数据解压缩为 4 个int
数量,执行 4 次整数加法,然后重新打包结果。如果您尝试使用单个整数加法来执行此操作,则从一个结果进行进位可能会破坏下一个结果。 vadd4
还提供了整数加法所不具备的钳位能力和其他行为。
在 SM2.0 的情况下,仅vadd4
执行的 4 次操作与解压缩数据所需的 4 次整数相加的比率就会使其具有吸引力。在 SM3.0 的情况下,当解包和打包添加到普通整数添加例程中时,vadd4
看起来很有吸引力。情况变得更有吸引力with cc 5.0。
【讨论】:
在大多数情况下,例如图像过滤器,从 8 位输入开始,需要对超过 8 位的数据进行多次操作(通常最多 16 位)。从我的角度来看, vadd4 仅在此类过程结束时才有用。最常用的是 vadd2。此外,如果中间值不超过 16 位并且可以为正,则可以在普通算术中执行“类似 SIMD”的加法或移位。另外可能有用multibyte arithmetic 对于某些用例,您可能需要稍微重构计算以充分利用 SIMD 指令。以下论文展示了将四路字节方式 SIMD 操作应用于计算生物学中的关键计算,从而显着提高速度:biomedcentral.com/1471-2105/14/117 NVIDIA 还向注册开发者a set of inline PTX SIMD functions 提供了在 Kepler 上进行硬件加速的开发人员,这可能对那些考虑 SIMD 视频指令的人感兴趣。 @Robert Crovella:实际上这些 SIMD 设备功能现在是 CUDA 的一部分,请参阅 docs.nvidia.com/cuda/cuda-math-api/… 我没有看到拆包的问题?这不是一个位字段。您可以从uint32_t *
到uint8_t *
执行reinterpret_cast
,然后无需移位即可轻松访问每个字节,不是吗? “cc 5.0 更有吸引力。”,我没看到?不是“多重指示”。意味着吞吐量变得更慢,甚至不再指定,它会有多慢?以上是关于CUDA Scalar 和 SIMD 视频指令的效率的主要内容,如果未能解决你的问题,请参考以下文章
DSP视频教程DSP视频教程第10期:DSP运算加速的精髓,含SIMD指令,饱和运算指令和浮点以及定点的MAC乘累加指令