问题标签 [ryujit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - 是否可以将 RyuJIT 与 4.6 之前的框架一起使用?
我的问题很抱歉,如果它很傻,但是是否可以将 RyuJIT 与 4.6 之前的框架一起使用?
c# - Ngen vs RyuJIT - (预)启动时最快的 x64 运行代码无关紧要
Ngen 和 RyuJIT 在 .NET 4.6 下是两个完全不相关的东西吗(尤其是使用不同的优化技术和算法)?
如果我们不关心 jitting 本身和/或冷/暖启动时间的成本,什么会产生最快(更好优化)的 x64 本机代码?
我们正在运行一个长时间运行的服务器应用程序。连续运行阶段在性能方面非常重要。(预)启动阶段对我们来说并不重要。到目前为止,我们一直在使用 .NET 4.5,并且总是由 Ngen 生成本机图像。我们现在正在升级到 .NET 4.6,我们希望确保这不会降低我们连续运行阶段的性能。我已经阅读了一些信息,说 RyuJIT 是改善 JITing 时间的绝佳选择,但与 Ngen 相比,jited 代码的优化程度可能较低 - 参见例如关于其中一个 RyuJIT 错误的 github 评论。
c# - 在 64 位下执行缓慢。可能的 RyuJIT 错误?
我有以下 C# 代码试图在发布模式下进行基准测试:
我在 64 位机器上并安装了 VS 2015。当我在 32 位下运行代码时,它每次迭代运行大约0.6 秒,并打印到控制台。当我在 64 位下运行它时,每次迭代的持续时间只会跳到4 秒!我在只安装了 VS 2013 的同事计算机上尝试了示例代码。32 位和 64 位版本的运行时间都在0.6 秒左右。
除此之外,如果我们只删除 try catch 块,它在 64 位的 VS 2015 中也能在0.6 秒内运行。
当有一个 try catch 块时,这看起来像是一个严重的 RyuJIT 回归。我对么 ?
c# - 使用 SIMD 内在函数时,这些额外的反汇编指令是什么?
我正在测试通过 RyuJIT 使用 SIMD 指令可以获得什么样的加速,我看到了一些我没想到的反汇编指令。我将代码基于RyuJIT 团队的 Kevin Frei 的这篇博客文章以及此处的相关文章。这是功能:
我正在查询的反汇编部分将数组值复制到Vector<float>
. 大部分反汇编与 Kevin 和 Sasha 的帖子中的类似,但我强调了一些额外的说明(以及我混淆的注释),这些说明没有出现在他们的反汇编中:
请注意,循环范围检查符合预期:
所以我不知道为什么会有额外的比较eax
。谁能解释为什么我会看到这些额外的说明,以及是否有可能摆脱它们。
如果它与项目设置有关,我有一个非常相似的项目,它在 github 上显示了相同的问题(请参阅FloatSimdProcessor.HwAcceleratedSumInPlace()
或UShortSimdProcessor.HwAcceleratedSumInPlaceUnchecked()
)。
c# - 包装 System.Numerics.VectorX 的成本很高 - 为什么?
TL;DR:为什么包装 System.Numerics.Vectors 类型很昂贵,我能做些什么吗?
考虑以下代码:
这会将 JIT 转换为 (x64):
和 x86:
现在,如果我将它包装在一个结构中,例如
和改变GetIt
,例如
JITted 结果仍然与直接使用本机类型时完全相同AddThem
( , 和SomeWrapper
重载的运算符和构造函数都是内联的)。正如预期的那样。
现在,如果我尝试使用支持 SIMD 的类型,例如System.Numerics.Vector4
:
它被 JITted 成:
但是,如果我将 包装Vector4
在一个结构中(类似于第一个示例):
我的代码现在被 JITted 变成了更多:
看起来 JIT 现在出于某种原因决定它不能只使用寄存器,而是使用临时变量,但我不明白为什么。首先我认为这可能是一个对齐问题,但后来我不明白为什么它首先将两者都加载到 xmm0 然后决定往返内存。
这里发生了什么?更重要的是,我可以修复它吗?
我想像这样包装结构的原因是我有很多使用 API 的遗留代码,其实现将受益于 SIMD 的一些优点。
编辑:因此,在对coreclr 源代码进行了一些挖掘之后,我发现 System.Numerics 类实际上并没有什么特别之处。我只需要将System.Numerics.JitIntrinsic
属性添加到我的方法中。然后,JIT 将用它自己的实现替换我的实现。JitIntrinsic
是私人的吗?没问题,只需复制+粘贴即可。不过,最初的问题仍然存在(即使我现在有解决方法)。
c# - RyuJIT 没有充分利用 SIMD 内部函数
我正在运行一些使用的 C# 代码,System.Numerics.Vector<T>
但据我所知,我没有获得 SIMD 内在函数的全部好处。我正在使用带有 Update 1 的 Visual Studio Community 2015,而我的 clrjit.dll 是 v4.6.1063.1。
我在Intel Core i5-3337U Processor上运行,它实现了 AVX 指令集扩展。因此,我认为,我应该能够在 256 位寄存器上执行大多数 SIMD 指令。例如,反汇编应该包含像vmovups
, vmovupd
, vaddups
, 等等这样的指令,并且Vector<float>.Count
应该返回 8,Vector<double>.Count
应该是 4 等等......但这不是我所看到的。
相反,我的反汇编包含指令,如movups
, movupd
,addups
等......以及以下代码:
产生:
我哪里错了?要查看所有项目设置等,该项目可在此处获得。
.net - .NET JIT 编译器在什么条件下执行自动矢量化?
新的 RyuJIT 编译器是否生成矢量 (SIMD) CPU 指令,何时生成?
旁注:System.Numerics 命名空间包含允许显式使用 Vector 操作的类型,这些操作可能会或可能不会生成 SIMD 指令,具体取决于 CPU、CLR 版本、JITer 版本,是否直接编译为本机代码。这个问题特别是关于非向量代码(例如在 C# 或 F# 中)何时会产生 SIMD 指令。
.net - RyuJIT 和 Roslyn 有什么区别?
我知道 RyuJIT 是一个比 JIT 更快的编译器。但它是 .NET 4.6 的新标准还是 Roslyn?
还是在编译过程中需要暴露API的时候用到了Roslyn?
我对他们的目的和他们将在哪些框架中找到它们感到困惑。有人可以解释一下区别以及什么时候你想要一个而不是另一个,好吗?
c# - RyuJIT - 带有 ushort 和 Equals 覆盖的错误(64 位)
在将 32 位托管应用程序移植到 64 位时,我观察到结构中的 Equals() 覆盖的奇怪行为。
你可以在github找到一个 repro 。
要重现该错误,您应该编译带有“优化”标志的库。这是发布配置的默认设置。使用的 TestApp 必须在没有任何优化的情况下编译。必须禁用首选 32 位才能以 64 位应用程序启动。见 github 上的注释!
该库包含一个实现 IEquatable 接口的结构,该接口通过简单的代码行实现。
此代码调用 ushort/UInt16 类型的 Equals 方法。如果您使用建议的配置构建解决方案,则所有高于 32767 的值都将失败。您在 32768 的 ushort 值上调用 Equal 并且“其他”的值也是 32768。但是 Equals() 将为高于 32767 的所有值返回 false。
如果您将方法更改为使用“==”运算符,则代码将起作用。此外,如果您将类型从 struct 更改为 class,代码将按预期运行。
我认为这是 RyuJIT 编译器中的一个错误。如果我使用旧版 JIT 编译器,则代码可以正常工作。
在不同的 Windows 版本上使用 Visual Studio 2015 和 TargetFramework 4.6.2 进行了测试。
c# - System.Numerics.Vectors IsHardwareAccelerated 返回 false
我目前正在从事一个从 MathNet.Numerics 库切换到 System.Numerics.Vectors 库的项目。我想利用 SIMD 硬件支持。
应用程序的目标框架是 .NET 4.6.1,因此 RyuJIT 应该是默认的 JIT 编译器。UseRyuJIT在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework中设置为 1 。
但该System.Numerics.Vector.IsHardwareAccelerated
属性仍然返回 false。
该应用程序在发布模式下运行,未选中 Prefer 32-Bit,平台目标是 AnyCPU(尽管我也尝试过 x64),启用本机代码调试已选中,当我从 Visual Studio 运行它并观看 Debug -> Windows -> Modules窗口我可以在列表中看到clrjit.dll。没有protojit.dll(我认为这是 CTP 版本名称)或compatjit.dll处于活动状态。
此外,在应用配置中没有设置useLegacyJit enabled="1" ,也没有在 regedit 中设置COMPLUS_useLegacyJit环境变量或useLegacyJit标志。
系统信息:
视窗 7 专业版
视觉工作室专业版 2013
System.Numerics.Vectors v4.1.2.0
英特尔酷睿 i7 3740QM