如果您查看.NET的System.Numerics.Matrix4x4类中乘法和其他函数下的source code,它会执行if判断,以确定硬件是否分别支持:

if (AdvSimd.Arm64.IsSupported) {} else if (Sse.IsSupported) {}

但是通用的System.Numerics.Vector<T> struct 似乎做的都是一样的,有什么不同呢?Vector<T>难道不是简单地在幕后寻找并使用任何可用的软件,然后在没有可用的软件时进行后备吗?

推荐答案

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对此没有直接的对应关系.)

Csharp相关问答推荐

子组件:如何根据另一个组件的状态启用输入

在Dapper中使用IasyncEum重写GetAsyncEum方法

有没有一种方法可以在包含混合文本的标签中嵌入超链接?

使用命令初始化可绑定属性

图形API基于appid列表检索多个应用程序

选取器与.NET Maui MVVM的绑定属性

XUNIT是否使用测试数据的源生成器?

模型绑定RazorPage表单

将轮询与超时同步

从依赖项容器在.NET 8中的Program.cs文件中添加IOC

为什么我可以用硬编码的集合而不是变量来设置没有setter的IList属性的值?

如何使用用于VS代码的.NET Maui扩展在我的iOS/Android设备或模拟器上进行调试?

C#LINQ子字符串

JsonPath在Newtonsoft.Json';S实现中的赋值

将J数组转换为列表,只保留一个嵌套的JToken

如何在.NET Core 8中自定义标识用户模型

WPF如何获取有关从一个视图模型更改另一个视图模型的信息

如何在JSON:API中定义的&过滤查询参数系列&标准的GET请求中传递多个相关参数?

当我在Git中暂存文件更改时,它们会消失

如何查找Span;T&>是否包含相同顺序的其他Span<;T&>