我认为ARMv8现在支持来自 128 bits to 2048 bits
(scalable vector extension SVE
)的可变长度向量寄存器。
具有更大的寄存器宽度以实现数据级并行性总是好的。但是在什么基础上我们需要从128位到2048位选择寄存器的大小以实现最大性能?
例如,我想在1920 X 1080 Y图像上使用3x3蒙版进行Sobel滤波。我需要选择什么寄存器宽度?
答案 0 :(得分:2)
可伸缩矢量扩展是aarch64执行状态的一个模块,它扩展了A64指令集,专注于高性能计算,而不是媒体,因为你拥有NEON。
寄存器宽度将由硬件设计人员/制造商决定,具体取决于实现尝试解决/执行的操作。可能的向量长度为:128 256 384 512 640 768 896 1024 1152 1280 1408 1536 1664 1792 1920 2048。
从程序员的角度来看,编程模型是Vector Length Agnostic,这意味着相同的应用程序将适用于具有不同寄存器宽度(矢量长度)的实现。
规范已经完成,但是,SVE没有可用的硬件。目前,您可以使用ARM Instruction Emulator(armie)来运行程序。
回答你的问题,除非你正在制造硬件,否则你不需要选择任何特定的矢量长度,因为从一个实现到另一个实现会有所不同。 现在,如果您正在使用armie进行测试,那么您可以根据需要选择。
答案 1 :(得分:1)
SVE本质上基于硬件定义的矢量宽度为您隐式地增加循环索引,因此您不必担心。
在https://www.rico.cat/files/ICS18-gem5-sve-tutorial.pdf处查看已完成的Daxpy
示例,以了解更详细的含义以及该minimal runnable example with an assertion。