MSVC如何避免SSE与AVX指令混合使用?含单函数混用场景
关于MSVC混合SSE与AVX Intrinsics的性能规避处理
混合SSE与AVX编码会触发公认的性能惩罚,要规避这个问题,有两种可靠方法:
- 统一使用AVX编码处理所有操作(哪怕是128位操作)
- 在所有SSE编码执行前插入
vzeroupper指令
对于常规编译器行为:当启用AVX编译选项时,编译器会默认生成AVX编码,并且会在所有可外部调用的函数末尾自动插入vzeroupper指令,确保函数退出时AVX状态处于干净状态。
而MSVC有个特殊行为:它允许开发者在未启用AVX编译选项的情况下,直接通过AVX intrinsics生成AVX代码——这和其他需要先开启AVX编译选项才能使用AVX intrinsics的编译器不同。
当单个函数中同时混用SSE和AVX intrinsics时,MSVC不会自动做规避处理:它不会把SSE intrinsics自动替换为AVX版本的128位操作,也不会自动插入vzeroupper指令。此时需要开发者手动介入:要么将所有SSE intrinsics替换为对应的AVX版本128位操作,要么在执行SSE代码前手动调用_mm256_vzeroupper() intrinsic,以此避免AVX与SSE状态切换带来的性能惩罚。
内容的提问来源于stack exchange,提问作者Alex Guteniev
相关产品推荐
相关产品推荐

