自 Visual Studio 2022 版本 17.3 以来的 MSVC 后端更新

微软技术分享
优质创作者: 编程框架技术领域
领域专家: 操作系统技术领域
2024-03-06 16:26:18

Visual Studio 2022版本 17.3 以来,我们不断通过新功能以及新的和改进的优化来改进 C++ 后端。以下是我们的一些令人兴奋的改进。

  • 17.9 针对 x86 和 x64 的改进,感谢我们在 Intel 的朋友。
    • 支持带有双精度/浮点参数的标量 FP 内在函数
    • 仅针对 x64通过VINSERTPS替换来改进代码生成VBLENDPS
    • 支持舍入标量函数
  • 17.8 改进
    • 新的/ARM64XFUNCTIONPADMINX64:#标志允许指定 arm64x 映像中 x64 函数的填充字节数
    • 新的/NOFUNCTIONPADSECTION:sec标志允许禁用特定部分中函数的函数填充
    • LTCG 构建更好地利用线程,提高吞吐量。
    • 对 RAO-INT 的支持,感谢英特尔的朋友。
    • 地址消毒剂改进:
      • Address Sanitizer 标志现在与 C++ 模块兼容。
      • 现在,当与不兼容标志结合使用时,编译器将报告错误/fsanitize=address,而不是默默地禁用 ASAN 检查。
      • 现在为 memchr、memcmp 和各种字符串函数中的加载和存储发出 ASAN 检查。
    • 性能改进将有助于每种架构:
      • 改善环路外负载和存储的提升。
    • arm64 的性能改进:
      • 提高arm64 和arm64ec 上的memcmp 性能。
      • 从模拟 x64 代码调用 memcpy、memset、memchr 或 memcmp 时,请消除切换到这些函数的 arm64ec 版本的性能开销。
      • 优化标量立即加载(来自我们 ARM 的朋友)
      • CSET和指令组合ADD成一条指令CINC(来自我们 ARM 的朋友)
    • x86 和 x64 的性能改进,非常感谢英特尔的朋友:
      • 改进 _mm_fmadd_sd 的代码生成。
      • UMWAIT改进和 的代码生成TPAUSE,保留隐式输入寄存器。
      • 通过改进自动矢量化器来改进矢量移位内在函数的代码生成。
      • 调整内部矢量化阈值以改进自动矢量化。
      • 对 std::isnan 之外的 FP 分类进行优化。
      • x64 的性能改进:
        • PSHUFLW当仅使用结果的低 64 位时,为 _mm_set1_epi16生成单个指令。
        • 改进abs() 的代码生成。(感谢AMD的朋友们)
        • LDDQU与 结合时不再生成冗余加载和存储VBROADCAST128
        • 生成PMADDWD而不是PMULLD尽可能。
        • 将两个连续的存储合并为一个未对齐的存储。
        • 即使未使用 /arch:AVX512 进行编译,也可在使用 AVX512 内在函数的函数中使用 32 个向量寄存器。
        • 不要发出不必要的寄存器来注册移动。
      • x86 的性能改进:
        • 改进 expf() 的代码生成。
  • 17.7 改进
    • 新的/jumptablerdata标志将 switch 语句的跳转表放置在 .rdata 部分而不是 .text 部分。
    • 冷文件系统缓存的链接时间现在更快。
    • 缩短 POGO 检测构建的编译时间。
    • 以多种方式加速 LTCG 编译。
    • OpenMP 通过 /openmp:llvm 进行了改进,感谢我们在 Intel 的朋友们:
      • #pragma omp atomic update并且#pragma omp atomic capture不再需要调用运行时,从而提高了性能。
      • 更好地生成 OpenMP 浮点原子代码。
      • 该子句schedule(static)现在适用于有序循环。
    • 所有架构的性能改进:
      • 感谢 AMD 的朋友,复制传播优化现在更加有效。
      • 改进 DeBruijn 表的优化。
      • 完全展开固定大小的循环,即使它们包含函数调用。
      • 改进位优化。
      • 深度嵌套循环现已优化。
    • x86 和 x64 的性能改进和附加功能,非常感谢我们在英特尔的朋友:
      • 支持Intel Sierra Forest指令集(AVX-IFMA、AVX-NE-CONVERT、AVX-VNNI-INT8、CMPCCXADD、附加MSR支持)。
      • 支持Intel Granite Rapids指令集(AMX-COMPLEX)。
      • 支持LOCK_SUB
      • 添加加法、减法和乘法的溢出检测功能。
      • 实现 isunordered、isnan、isnormal、isfinite、isinf、issubnormal、fmax 和 fmin 的内部函数。
      • 减少按位向量运算的代码大小。
      • 改进尾调用优化期间 AVX2 指令的代码生成。
      • 改进浮点指令的代码生成,无需 SSE 版本。
      • 删除不需要的 PAND 指令。
      • 改进 FP16 截断转换的汇编器输出,以使用抑制所有异常而不是嵌入式舍入。
      • 消除从 FP 到 unsigned long long 的不必要的转换提升。
      • x64 的性能改进:
        • 不再发出不必要的MOVSX/MOVZX指令。
        • 更好地对类函数的调用进行去虚拟化。
        • 提高 memmove 的性能。
        • 改进组合模式的代码生成XOR-EXTRACT
    • arm64 的性能改进:
      • 感谢 ARM 的朋友,改进了 NEON BITBIF和指令的目标寄存器着色。BSL
      • 将使用导入地址表的跨二进制间接调用转换为直接调用。
      • 添加_CountTrailingZeros_CountTrailingZeros64 内在函数以计算整数中的尾随零
      • 在更多地方生成BFI指令。
  • 17.6 改进
    • /openmp:llvm标志现在支持(完整详细信息collapse。)#pragma omp loop
    • /d2AsanInstrumentationPerFunctionThreshold:#标志允许关闭会添加超过一定数量的额外 ASAN 调用的函数上的 ASAN 检测。
    • /OTHERARCHEXPORTS选项dumpbin /EXPORTS将转储 arm64x dll 的 x64 导出。
    • 构建时间改进:
      • 提高了 LTCG 构建吞吐量。
      • 减少 LTCG 构建内存使用量。
      • 减少增量链接期间的链接时间。
    • 性能改进将有助于每种架构:
      • 使用最小值、最大值和绝对向量化循环,感谢 ARM 的朋友。
      • 将循环转为a[i] = ((a[i]>>15)&0x10001)*0xffff向量比较。
      • 将数组基数的计算提升(a + constant)[i]到循环之外。
    • arm64 上的性能改进:
      • 将浮点数直接加载到浮点寄存器中,而不是使用整数加载和 FMOV 指令。
      • 改进了 abs() 的代码生成,感谢 ARM 的朋友。
      • 当 NEON 指令可用时,改进向量的代码生成。
      • 生成 CSINC 指令时?感谢我们 ARM 的朋友,运算符将常量 1 作为表达式的可能结果。
      • 使用向量加法指令改进对数组求和的循环的代码生成。
      • 将向量扩展和算术指令组合成单个指令。
      • 删除无关的加法、减法以及与 0 的或运算。
      • 辅助延迟加载 IAT:新的导入地址表,用于调用 arm64x 中的延迟加载 DLL。在运行时,Windows 会修补该表以加快程序执行速度。
    • x86 和 x64 上的性能改进和附加功能,非常感谢英特尔的朋友:
      • 支持 Intel Granite Rapids x64 指令集,特别是TDPFP16PS(AMX-FP16) 和PREFETCHIT0PREFETCHIT1
      • 支持round 和roundf 内在函数的关联舍入。
      • 将小循环减少为向量。
      • 不再生成多余的MOVD/MOVQ指令。
      • 尽可能使用AVX512 上的VBLEND指令而不是速度较慢的VINSERTF128指令。VBLENDPS
      • 使用 /arch:AVX 或更高版本将PCLMULQDQ指令提升到可能的位置。VPCLMULQDQ
      • VEXTRACTI128将提取向量下半部分的指令替换为VMOVDQU指令,感谢 AMD 的朋友们。
      • 支持缺少的 AVX512-FP16 内在函数。
      • 使用正确的 VEX/EVEX 编码为 MASM 中的 VCMPXX 伪操作生成更好的代码。
      • 改进从 64 位整数到浮点的转换。
      • 通过正确的指令调度改进 x64 上的代码生成STMXCSR
  • 17.5 改进
    • 新的/Zc:checkGwOdr 标志允许针对 ODR 违规强制执行 C++ 标准,即使使用 /Gw 进行编译也是如此。
    • 在arm64上将aMOV和aCSEL指令组合成一条指令CSINV
    • x86 和 x64 的性能和代码质量改进,感谢我们在英特尔的朋友:
      • 改进了 x64 上由 2 个 64 位值组成的结构返回的代码生成。
      • 类型转换不再生成不必要的FSTP/FLD指令。
      • 改进对非数字浮点值的检查。
      • 通过位掩码和缩减在自动矢量化器中发出更小的序列。
      • 仅在 /fp:fast 下正确扩展回合以使用 ROUND 指令。
  • 17.4 改进
    • 性能改进将有助于每种架构:
      • 改进有符号整数的 bswap。
      • 通过 memset 调用改进函数的堆栈打包。
    • 改进对 Arm64 的调试支持和性能:
      • 现在可以针对 Arm64 的程序进行编辑并继续。
      • 添加了对armv8 int8矩阵乘法指令的支持。
      • 使用BIC指令代替MVNand AND
      • 在适当的情况下使用BIC_SHIFT说明。
    • x64 和 x86 上的性能和代码质量改进,感谢我们在英特尔的朋友:
      • std::memchr 现在满足一旦找到匹配字节就停止的附加 C++17 要求。
      • 改进 16 位互锁加法的代码生成。
      • 合并 AVX/AVX2 上的寄存器初始化。
      • 改进了返回由 2 个 64 位值组成的结构的代码生成。
      • 改进 _mm_ucomieq_ss 的代码生成。
      • 使用ceil、floor、 trunc 和roundVROUNDXX的说明。
      • 改进对非数字浮点值的检查。
    • 实验性-openmp:llvm开关下对 OpenMP 标准 3.1 的支持扩展为包括子句上的min和运算符。maxreduction
    • 改进复制和移动省略
    • 新的/Qspectre-jmp 标志在无条件跳转指令后添加了一个 int3。

想体验C++后端的新改进吗?请下载最新的 Visual Studio 2022并尝试一下!欢迎任何反馈。您可以通过下面的评论、开发者社区、Twitter ( @VisualC ) 或电子邮件Visualcpp@microsoft.com与我们联系。

请继续关注有关最新 Visual Studio 更新的更多信息。

作者 | Bran Hagger(布兰·哈格)
翻译 | RuiWang
原文 | 原文链接

...全文
559 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

6,590

社区成员

发帖
与我相关
我的任务
社区描述
微软技术社区为中国的开发者们提供一个技术干货传播平台,传递微软全球的技术和产品最新动态,分享各大技术方向的学习资源,同时也涵盖针对不同行业和场景的实践案例,希望可以全方位地帮助你获取更多知识和技能。
windowsmicrosoft 企业社区
社区管理员
  • 微软技术分享
  • 郑子铭
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

微软技术社区为中国的开发者们提供一个技术干货传播平台,传递微软全球的技术和产品最新动态,分享各大技术方向的学习资源,同时也涵盖针对不同行业和场景的实践案例,希望可以全方位地帮助你获取更多知识和技能。

予力众生,成就不凡!微软致力于用技术改变世界,助力企业实现数字化转型。

试试用AI创作助手写篇文章吧