C#System.Numerics
Vector<T>
通用SIMD不会公开所有的混洗和其他特定于ISA的东西,如x86 movmskps
.如果您可以使用通用API公开的公共功能子集高效地完成工作,我认为这将是一个很好的 Select ,并且仍然编译为您所不能执行的指令.
但是你提到的函数使用Sse.Shuffle
(shufps
)或AdvSimd.Arm64.FusedMultiplyAddBySelectedScalar
(?)来广播和mul+加法.如果ARM64真的可以在一条指令中做到这一点(向量乘法的标量广播源),那就相当酷了.AVX-512的前身可以做到这一点,KNC在早期的Xeon Phi中有新的指令,但即使是AVX-512也需要洗牌和单独的FMA.(除非操作数来自内存:AVX-512可以使用广播内存源操作数.)
我在你链接的System.Numerics
的文档中根本看不到任何混洗,只有纯垂直SIMD,所以这对于一个4x4矩阵乘积来说并不是很有用,因 for each row[i]
都需要乘以broadcast(col[i])
个向量.
所以System.Numerics
看起来比C和C++中的GNU C native vectors更残缺,在C和C++中至少有__builtin_shuffle
,但仍然错过了特殊的洗牌,以及像x86 movmskps
这样的东西来获得SIMD比较结果的标量位图.(AMD和ARM64对此没有直接的对应关系.)