如何在C#中抽象Vector256<T<的逻辑以支持不同的硬件配置?

How can I abstract the logic of Vector256<T< in C# to support different hardware configurations?

提问人:user22782688 提问时间:11/10/2023 最后编辑:Useruser22782688 更新时间:11/12/2023 访问量:88

问:

C# 中的矢量化通过 Vector 类工作。有不同大小的向量,如 Vector64/Vector128/Vector256。但是我该如何使用它们呢?我已经用 编写了一个 for 循环,但如果设备不支持此向量,我想回退到 或 。我该如何回退到那个位置。我是否缺少某种通用接口?我需要复制和粘贴每种大小的 Vector 的整个内容吗?Vector256<T>Vector128<T>Vector64<T>IVector<T>

非常感谢

C# .NET 矢量 矢量化 SIMD

评论

0赞 harold 11/10/2023
中有一个长度通用的 ..但它还有其他缺点。Vector<T>System.Numerics

答:

3赞 dragon 11/10/2023 #1

这听起来可能很烦人,但目前使用的处理方法是实际上只是复制粘贴您的矢量化循环,并分别替换为 和。确保从最高向量开始,然后向最低向量努力。 Microsoft实际上应该考虑一个将这些方法抽象出来的接口。使用新的静态抽象方法,这当然是可能的,但现在你必须坚持复制粘贴Vector256Vector128Vector64IVector<T>

评论

1赞 harold 11/10/2023
它通常行不通。只有当代码相同时,编写长度泛型代码才有意义,但这通常不是它的工作方式。众所周知,AVX2 由于这个原因而升级到 AVX2 很烦人。
0赞 dragon 11/10/2023
是的,但是像添加这样的高级操作可以变得更平易近人。
1赞 harold 11/12/2023
它们一直是一个非常不完整的向量 API,但它可以做一些不依赖于特定向量大小的更高层次的事情System.Numerics.Vector
0赞 dragon 11/14/2023
是的,但几乎没有。此类型实现了固定大小的 Vector 所具有的一小部分方法。