我正在编写代码,该代码将减去两个数组中的相应字节,并对超过给定阈值的结果字节数进行计数。AFAIU,它将真正受益于.NET SIMD,但是System.Numerics.Vector.IsHardwareAccelerated
当我在Raspberry Pi 4上编译C#时返回false。
我的dotnet
版本是3.1.406,我已经添加了
<PropertyGroup>
<Optimize>true</Optimize>
</PropertyGroup>
到csproj并运行release
配置。
有什么方法可以在Raspberry Pi 4上利用.NET中的SIMD支持吗?也许使用.NET 5?
更新我安装了.NET 5并尝试了.NET Intrinsics,但是不支持:
Console.WriteLine(System.Runtime.Intrinsics.Arm.AdvSimd.IsSupported); //false
Console.WriteLine(System.Runtime.Intrinsics.Arm.Aes.IsSupported); //false
Console.WriteLine(System.Runtime.Intrinsics.Arm.ArmBase.IsSupported); //false
Console.WriteLine(System.Runtime.Intrinsics.Arm.Crc32.IsSupported); //false
Console.WriteLine(System.Runtime.Intrinsics.Arm.Dp.IsSupported); //false
Console.WriteLine(System.Runtime.Intrinsics.Arm.Rdm.IsSupported); //false
Console.WriteLine(System.Runtime.Intrinsics.Arm.Sha1.IsSupported); //false
Console.WriteLine(System.Runtime.Intrinsics.Arm.Sha256.IsSupported); //false
我使用的是32位Raspbian(Debian衍生产品),是否有可能需要64位版本才能正常工作?
尽管完成了API甚至记录了API,但是缺少实现。看一看。8字节的SIMD向量已经成为NEON ISA数十年来必不可少的部分(于2005年引入),但是.NET运行时仅在为ARM64编译时才实现它们(于2013年发布)。
我不在Microsoft工作,也不知道它们如何精确地编译二进制文件,但是源代码告诉他们在为ARM64目标构建时它们至少对NEON有所支持。如果要在.NET中使用这些内在函数,则可以尝试使用64位OS。
有一种解决方法-用C ++实现对性能至关重要的部分,为Linux编译一个共享库,然后使用[DllImport]
.NET来使用这些功能。我使用以下gcc标志来构建DLL,从而构建了非平凡的Linux软件(示例):-march=native -mfpu=neon-fp16 -mfp16-format=ieee -ffast-math -O3 -fPIC
这样,它将适用于32位OS,并且.NET运行时不需要任何特殊功能,我已经.NET Core 2.1进行了测试。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句