我可以在 Raspberry Pi 4 上使用 .NET SIMD 吗?

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)

Soo*_*nts 5

尽管 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 进行测试。