本文分享可伸缩的矢量多媒体优化,内容包括矢量多媒体的历史、ARM 可伸缩矢量扩展、RISC-V 矢量,以及相关问答。
历史
单指令多数据流 SIMD
以上对 SIMD 的发展历史做了简要的阐述。
矢量长度
常见的矢量长度为 128 位或是 512 位。在 ARM 和 RISC-V 中,即使矢量长度是可变的,它也至少有 128 位,并且为了便于计算,通常是 2 的幂。因此,理论上,在语法层面或在指令编码层面,RISC-V 有最高 16 位的权力。
声明
在做矢量链接之前,应该做一个有价值的矢量链接 CMD 或者矢量处理。首先,必须使用声明,这对于矢量来说在可变的电子场景中非常普遍。这并不是一个全新的概念,AVX 中也有声明。但在可变向量链接中,它是非常重要的,因为对 ARM 和 RISC 来说,这基本上是可变电子的编程模型。
它仅仅指定了在给定的指令中,我们要加载、修改或存储哪些值。如果它是一个加载指令,它在内存中将有很多值,并覆盖到寄存器中;如果它是一个存储指令,它会决定内存中的哪些值将被覆盖,哪些值将保持原样;如果它是一个向量到向量的计算指令,那么它则会告诉你,它会影响哪些结果并存储到寄存器中,而哪些结果会被丢弃。
展开
声明并不适用于所有的矢量链接。在一些情况下,由于在设计或算法中自然地存在某种并行性,无法展开。但在矢量处理中,有更高的延迟和更大的矢量,这最终导致了更高的吞吐量,我们实际上不应该需要注册。另一件需要记住的有趣的事情是,不存在对齐问题。CMD 指令集的一个常见问题是加载和存储指令需要过度对齐的数据,当你从 c++ 代码中操作时,这是非常不方便的,因为它通常接收到的 c++ 分配器只会在ABR指定的任何地方分配对齐,在 arm V8 中,栈是 16 字节,而堆是 8 字节。
ARM 可伸缩矢量扩展
SVE 是在 2016 年底宣布的.它对多媒体来说几乎是无用的。但是,它可以被用于其他领域,如科学应用或工程建模一类。
你只需使用一个 while 指令,然后提供声明,选择元素的大小,最后有一组新的分支条件。
RISC-V 矢量
以上指令为在循环开始时配置向量的指令。在这种情况下,我们有一定数量的输入元素,我们想要得到输出元素的数量以及 CPU 在迭代中要处理的元素的数量。然后我们必须以位表示元素的大小(例如 16 位)。
在 RISC-V 中,浮点寄存器与矢量是分开的,所以如果你在标量和向量之间进行各种计算,你就有更多可用的寄存器。
Q & A
- Q:假设您在写一个矢量化的字符串搜索操作,当您在执行一些诸如解码 JPEG 这样的操作时,您可以在这些 API 块中执行这些操作。它们有某种接近的入口,有固定的大小,斌且根据矢量大小,您必须要么把它们分开,要么同时处理多个。
- A:所以,问题是当你遇到一个固定大小的数据输入块时,你想要处理块应该怎么做。一种方法是检查 CPU 的向量大小是否足够大。如果数据集比向量大,就会出现问题,在 RISC-V 中,它会变得很复杂。你可以使用组乘法器来处理这个问题,它允许你将多个向量作为一个向量使用。
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。