Visual c++ MSVC 2017是否支持自动CPU调度?

Visual c++ MSVC 2017是否支持自动CPU调度?,visual-c++,compiler-optimization,cpu-architecture,avx,auto-vectorization,Visual C++,Compiler Optimization,Cpu Architecture,Avx,Auto Vectorization,我在一些网站上读到,当使用SSE2架构并检测AVX支持运行时,MSVC实际上可以发出AVX指令。这是真的吗 我测试了各种循环,它们肯定会从AVX/AVX2支持中受益,但在调试器中运行时,我找不到任何AVX指令 当使用/arch:AVX时,它会发出AVX指令,但它当然会在不支持它的CPU上崩溃(已测试),因此也没有运行时检测。我可以使用AVX内部函数,它可以成功地从中创建AVX指令。有什么想法吗?我已经联系了VC++团队,答案是“没有”。问题注释中链接的bug报告仅显示正常bug,而不是自动分派代

我在一些网站上读到,当使用SSE2架构并检测AVX支持运行时,MSVC实际上可以发出AVX指令。这是真的吗

我测试了各种循环,它们肯定会从AVX/AVX2支持中受益,但在调试器中运行时,我找不到任何AVX指令


当使用/arch:AVX时,它会发出AVX指令,但它当然会在不支持它的CPU上崩溃(已测试),因此也没有运行时检测。我可以使用AVX内部函数,它可以成功地从中创建AVX指令。有什么想法吗?

我已经联系了VC++团队,答案是“没有”。问题注释中链接的bug报告仅显示正常bug,而不是自动分派代码生成器中的bug


因此,如果指定了/arch:SSE2(默认情况下),VC++只能自动分派到SSE4。这是目前唯一支持的自动分派形式。换句话说,VC++无法自动分派到AVX/AVX2。

上次我检查时,在MSVC中,对编译单元使用不带
/arch:AVX
的AVX内部函数是个坏主意。您可以获得导致SSE/AVX转换惩罚的代码,因为它将对任何指令使用非VEX编码,即使在具有VEX指令的函数中也是如此。我用的是VZEROUPPER。无论如何,这不是问题-我最感兴趣的是MSVC是否能在运行时检查实际上在/ARCH中编译C++循环(和更高的指令集)代码:SSE2。我的意思是,没有
/arch:AVX
的MSVC可以在单个函数中混合使用SSE和VEX。例如,考虑用<代码> My256x ExpTf128Pys进行一个水平求和,到一个<代码> y12M128,因此,您使用的是128位实体,如<代码>这些将使用非VEX编码,并且将这些与VEX编码混洗(如
vpermilps
)或更多的
\u mm256\u add\u ps
)混合将对Haswell的性能造成灾难性影响。一开始。。。无论如何,通常我实际上是用/arch:AVX编译它,并手动检测AVX支持。但再一次,这不是这里的问题。。。“我最感兴趣的是MSVC是否可以在运行时检查中在/ARC:SSE2中编译C++循环到AVX(和更高的指令集)代码。”我还认为,只要需要,就足够聪明地将高YMM RGs归零。如果首先检查是否支持SSE2,则不检查是否支持了AVX2,如果没有,则不检查。它将求助于好的ol'
cmp/jne
。但我认为微软已经在汇编中实现了它们。有几个bug报告(,)显示MSVC在不检查支持情况下生成AVX。