Iva*_*lev 3 c# arm simd neon raspberry-pi
我正在编写代码,将减去两个数组中的相应字节并计算超过给定阈值的结果字节数。AFAIU,它真的会从 .NET SIMD 中受益,但是System.Numerics.Vector.IsHardwareAccelerated当我在 Raspberry Pi 4 上编译 C# 时返回 false。
我的dotnet版本是 3.1.406,我已经添加了
<PropertyGroup>
<Optimize>true</Optimize>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
到 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
Run Code Online (Sandbox Code Playgroud)
我使用的是 32 位 Raspbian(Debian 衍生版),是否有可能需要 64 位版本才能运行?
PS 为了澄清,在普通的 C# 中,算法看起来像这样:
<PropertyGroup>
<Optimize>true</Optimize>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
尽管 API 已经完成甚至记录在案,但缺少实现。看一看。8 字节 SIMD 向量几十年来一直是 NEON ISA 的重要组成部分(于 2005 年推出),但 .NET 运行时仅在为 ARM64(于 2013 年发布)编译时才实现它们。
我不为 Microsoft 工作,也不知道他们是如何编译二进制文件的,但是源代码告诉他们在为 ARM64 目标构建时至少对 NEON 有一些支持。如果您想要 .NET 中的这些内在函数,您可以尝试 64 位操作系统。
有一个解决方法——用 C++ 实现你的性能关键部分,为 Linux 编译一个共享库,然后用于[DllImport]从 .NET 使用这些函数。我已经以这种方式构建了非平凡的 Linux 软件(示例),使用以下 gcc 标志来构建 DLL:-march=native -mfpu=neon-fp16 -mfp16-format=ieee -ffast-math -O3 -fPIC这样它将适用于 32 位操作系统,并且不需要任何特殊的 .NET 运行时,我已经使用 .NET Core 2.1 进行测试。
| 归档时间: |
|
| 查看次数: |
179 次 |
| 最近记录: |