当前位置: 首页 > 知识库问答 >
问题:

在什么条件下. NET即时编译器执行自动矢量化?

毋宏茂
2023-03-14

新的RyuJIT编译器是否生成过向量(SIMD)CPU指令,以及何时生成?

旁注:系统。Numerics命名空间包含允许显式使用向量操作的类型,向量操作可能生成也可能不生成SIMD指令,具体取决于CPU、CLR版本、JITer版本,无论是否直接编译为本机代码。这个问题具体是关于非矢量代码(例如C或F中的)何时会生成SIMD指令。

共有1个答案

公羊英达
2023-03-14

RuyJIT中的SIMD代码生成严格限于系统中的类型。数字。向量命名空间。通用SIMD支持将需要对CLR进行非常重要的修订,只有在SIMD变量正确对齐的情况下,这样的代码才能有效。对于SSE2,至少为16;对于AVX2,至少为32;对于即将推出的AVX-512,至少为64。

现在还很遥远,32位CLR只能与4对齐,64位版本只能与8对齐。resp 32位和64位代码的“自然”对齐。所需的更改将影响CLR的每个部分、垃圾收集器和类加载器。对于正在考虑的如此重大的变化,没有任何传言。而且没有迹象表明CoreCLR项目中考虑了它,它将是最明显的目标版本。

如果您想利用系统中当前支持之外的SIMD。数字。然后,Vectors使用C编译器,使用C/CLI或C/CX语言扩展实现互操作。

 类似资料:
  • 我不明白为什么Visual C不能自动矢量化这个循环......有什么想法吗? 我得到: 其中,原因代码1200为: 循环包含阻止矢量化的循环携带的数据依赖项。循环的不同迭代相互干扰,这样对循环进行矢量化将产生错误的答案,而自动矢量器无法向自己证明不存在此类数据依赖关系。 但为什么呢?

  • 我们知道,JVM同时使用解释器和JIT编译器。JIT编译器将重复的字节码转换为机器码并存储在内存中。现在,当解释器逐行翻译字节码并运行它时,它将跳过已转换并存储在内存中的重复代码的翻译部分,但将直接运行它。从而减少了并发冗余翻译。 那么为什么Java在JVM中使用解释器呢?像JIT这样的编译器可以一次性完成将字节码转换为机器码的整个任务吗?

  • 问题内容: 即时编译器和解释器之间有什么区别,.NET和Java JIT编译器之间有什么区别? 问题答案: 即时编译是在执行之前将非本机代码(例如字节码)转换为本机代码。 从维基百科: JIT基于运行时环境中的两个较早的想法:字节码编译和动态编译。它在本地执行代码之前先在运行时将其转换,例如将字节码转换为本地机器代码。 一种解释执行程序。它可能有也可能没有抖动。 同样,来自维基百科: 解释器可能是

  • 在META-INF/Services中,添加了javax.annotation.processing.processor条目,指定自定义注释处理器类。

  • 我已经在我的页面上实现了平滑滚动条,它的工作相当不错,但我也想在滚动内容中添加一些过渡效果。基本上,我想在一个滚动事件上做这件事,但我不知道scrollbar的工作有多流畅,以及在滚动事件上执行什么对象。我检查了#my-scrollbar没有执行此操作: 滚动事件的原因是什么?或者有没有其他的方法可以做一些额外的效果而不检查滚动事件? 编辑:我正在粘贴我的代码(我正在使用react.js)来进行更

  • 问题内容: 考虑以下示例代码 它给出以下输出 方法调用将在运行时解决,并按预期调用正确的重写方法。 后来我了解到,变量访问是在编译时解决的。我期望输出为 因为在派生类中阴影的重新定义是在基类中的。 为什么变量的绑定在编译时而不是在运行时发生?这是仅出于性能原因吗? 问题答案: 原因在Java语言规范的15.11节中的示例中进行了说明,如下所示: … 最后一行表明,实际上,所访问的字段不依赖于所引用