总结
豆包 AI 助手文章总结

.NET9 PreView6硬件内部生成和浮点SMID运算

看不見的法師
发布: 2025-04-25 15:48:28
原创
683人浏览过

.net9 preview6硬件内部生成和浮点smid运算

请注意,.NET9 PreView6并没有对AOT进行重大更新。在.NET9 PreView2中曾经对AOT进行了自举模式,参考:.NET9 AOT ILC的重大变化。

硬件内部生成的大多数硬件内部都有其相应的优化,而应用层级只需要传递相应的参数即可。比如一些硬件希望用户为硬件内部的API的某些参数传递常量,这些常量可以直接编码到硬件内部底层的指令中,不需要加载到寄存器或内存中,然后进行访问。如果没有提供常量,则会有相同逻辑但速度较慢的实现。

例如:

static byte Test1(){
    Vector128<byte> v = Vector128<byte>.Zero;
    byte size = 1;
    v = Sse2.ShiftRightLogical128BitLane(v, size);
    return Sse41.Extract(v, 0);
}
登录后复制

v是Vector128初始化的128个0,Sse2.ShiftRightLogical128BitLane把v向右移动size位,返回结果。Sse41.Extract则是返回v里面的某个索引项。比如以下返回3:

Vector128<int> vector = Vector128.Create(1, 2, 3, 4);
int extractedValue = Sse41.Extract(vector, 2);
登录后复制

在调用Sse2.ShiftRightLogical128BitLane的时候,JIT可以用常量替代,JIT具备这种优化。但是在确定生成加速代码还是等逻辑慢实现的时候,如果JIT检测到参数变量而不是常量,于是很早就确定了不对其进行优化形式的调用。

之前的代码:

; Method Program:Test1():ubyte (FullOpts)
G_M000_IG01:                ;; offset=0x0000
       sub      rsp, 72
G_M000_IG02:                ;; offset=0x0004
       vxorps   xmm0, xmm0, xmm0
       vmovaps  xmmword ptr [rsp+0x20], xmm0
       lea      rdx, [rsp+0x20]
       lea      rcx, [rsp+0x30]
       mov      r8d, 1
       call     [System.Runtime.Intrinsics.X86.Sse2:ShiftRightLogical128BitLane(System.Runtime.Intrinsics.Vector128`1[ubyte],ubyte):System.Runtime.Intrinsics.Vector128`1[ubyte]]
       vmovaps  xmm0, xmmword ptr [rsp+0x30]
       vpextrb  eax, xmm0, 0
G_M000_IG03:                ;; offset=0x0030
       add      rsp, 72
       ret
; Total bytes of code: 53
登录后复制

RyuJIT 现在可以识别更多像这个例子这样的情况,并用其常量值替换变量参数,从而生成加速代码,而不会过早地确定不优化。下面是上述示例的新代码生成所示:

; Method Program:Test1():ubyte (FullOpts)
G_M11031_IG01:  ;; offset=0x0000
G_M11031_IG02:  ;; offset=0x0000
       vxorps   xmm0, xmm0, xmm0
       vpsrldq  xmm0, xmm0, 1
       vpextrb  eax, xmm0, 0
G_M11031_IG03:  ;; offset=0x000F
       ret
; Total bytes of code: 16
登录后复制

用于浮点和 SIMD 运算的恒定折叠是 RyuJIT 中现有的优化,其中可以在编译时计算的表达式被替换为它们计算的常量,从而消除了运行时的计算。许多新功能的示例:

浮点二进制运算,其中一个操作数是一个常量:x + NaN现在折叠成 NaN,x * 1.0现在折叠成 x,x + -0现在折叠成 x。例如,硬件内部函数假设是:Vector,x + Vector.Zero现在折叠成 x,x & Vector.Zero现在折叠成 Vector.Zero,x & Vector.AllBitsSet现在折叠成 x。查看 dotnet/runtime #103206 和 dotnet/runtime #103143 进行更深入的了解。

以上就是.NET9 PreView6硬件内部生成和浮点SMID运算的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
相关标签:
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
豆包 AI 助手文章总结
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号