System.Numerics.Vectors IsHardwareAccelerated 返回 false

Posted

技术标签:

【中文标题】System.Numerics.Vectors IsHardwareAccelerated 返回 false【英文标题】:System.Numerics.Vectors IsHardwareAccelerated returns false 【发布时间】:2017-02-22 10:14:37 【问题描述】:

我目前正在从事一个从 MathNet.Numerics 库切换到 System.Numerics.Vectors 库的项目。我想利用 SIMD 硬件支持。

应用程序的目标框架是 .NET 4.6.1,因此 RyuJIT 应该是默认的 JIT 编译器。 UseRyuJITHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework 中设置为 1。

System.Numerics.Vector.IsHardwareAccelerated 属性仍然返回 false。

应用程序在发布模式下运行,未选中首选 32 位,平台目标是 AnyCPU(虽然我也尝试过 x64),启用本机代码调试已选中,当我从 Visual Studio 运行它并观看调试 -> Windows -> 模块窗口 我可以在列表中看到 clrjit.dll。没有 protojit.dll(我认为这是 CTP 版本名称)或 compatjit.dll 处于活动状态。

此外,应用配置中没有设置 useLegacyJit enabled="1",也没有 COMPLUS_useLegacyJit 环境变量或 useLegacyJit 标志注册。

系统信息:

Windows 7 专业版

Visual Studio 专业版 2013

System.Numerics.Vectors v4.1.2.0

英特尔酷睿 i7 3740QM

【问题讨论】:

NuGet 管理器还将 4.3.0 声明为版本。但是当我单击解决方案资源管理器中的引用时,属性表显示 4.1.2.0。 SP1 已安装。 ***.com/a/34898181/17034 我还拥有 Visual Studio 2015。当我在那里设置相同的演示应用程序时,IsHardwareAccelerated 是真的。所以 AVX2 支持似乎与问题无关。不幸的是,不可能将整个应用程序移至 2015 年。 好的。因为我没有 AVX2 支持 SIMD 指令的寄存器大小仍然是 128 位。但是,如果我从 Visual Studio 外部启动 exe,IsHardwareAccelerated 将变为 true,并且测试应用程序性能会提高。无论如何感谢您的想法 【参考方案1】:

当您从 Visual Studio 启动应用程序时,即使对于发布版本,默认设置也会禁用 jit 优化,并且还会禁用 SIMD 代码生成。

您可以在 VS 中更改此设置,方法是导航到工具 |选项 |调试 |常规并取消选中“在模块加载时抑制 JIT 优化(仅限托管)”。

【讨论】:

以上是关于System.Numerics.Vectors IsHardwareAccelerated 返回 false的主要内容,如果未能解决你的问题,请参考以下文章

C# 中带 SIMD 的 2x2 矩阵向量积

i = ++i + ++i

正确理解i=i++ i+=i++ i=i++ + i++

2.3 i++/i--与++i/--i的运算

你真的了解 i++, ++i 和 i+++++i 以及 i+++i++ 吗?

关于++i,--i,i++,i--