使用 cl.exe 为多个架构生成数据

Posted

技术标签:

【中文标题】使用 cl.exe 为多个架构生成数据【英文标题】:generate data for multiple architectures with cl.exe 【发布时间】:2016-02-25 06:19:00 【问题描述】:

我正在将一些 MatLab 代码导出到 C 并使用 Visual Studio 2013 (cl.exe) 对其进行编译。如果有帮助,我可以切换到 VS2015。矢量化对我来说非常重要。如果我使用 /O2 它会生成 SSE2 代码以及一些备用代码,以防它在非 SSE2 CPU 上执行。如果我将架构更改为 AVX2 的参数,它会生成该代码和 AVX 代码以及 SSE2 代码和回退代码吗?这就是我想要的——在任何 CPU 上尽可能快地运行。或者如果 CPU 不支持 AVX2 会直接进入 fallback 代码吗?

【问题讨论】:

我不记得听说过任何编译器通过运行时 CPU 调度进行自动矢量化以选择当前 CPU 的最佳版本。编译器可以做到这一点,但比通常的自动矢量化更难。在运行 init 函数方面,可能需要源代码的一些合作。如果它自动向量化很多函数,还有一个问题是阻止编译器过度使用和进行过多的间接调用(通过函数指针)。 无论如何,您可以手动设置运行时 CPU 分派到由相同代码构建但具有不同编译器设置的不同二进制文件。另请注意,SSE2 是 AMD64 的基准。如果比 AVX 没有任何显着的加速,那么您不需要 SSE4.1 版本或其他任何版本,只需将 SSE2 基线调度到某些 AVX 版本即可。 (如果它是 FP 代码,那么 AVX2 可能不会比 AVX1 获得任何好处。所以你不需要单独的 SnB/IvB 版本,它只有 AVX1。但是 AMD Bulldozer 系列在 AVX 上可能会更糟,部分原因是解码瓶颈。 ) 彼得和所有,英特尔编译器执行“自动矢量化与运行时 CPU 分派以选择当前 CPU 的最佳版本”。使用 -axcode 系列编译标志,如 -axAVX。例如。 for -axAVX 编译器将生成“默认 SSE 代码路径”和辅助“AVX”代码路径。 【参考方案1】:

根据Visual C++ Team Blog,编译器不会做任何事情:

编译器将生成包含 AVX2 和 FMA 指令的代码。生成的二进制文件只能在支持这些指令的 PC 上运行。如果您在旧 PC 上运行二进制文件,程序将崩溃,并显示如下弹出窗口:

【讨论】:

以上是关于使用 cl.exe 为多个架构生成数据的主要内容,如果未能解决你的问题,请参考以下文章

vs2010生成解决方案时,报错:tracker已停止工作,: error MSB6006: “CL.exe”已退出,代码为 -1073741819

error C1041: 无法打开程序数据库“xxxvc140.pdb”;如果要将多个 CL.EXE 写入同一个 .PDB 文件

如何在 azure app 服务中使用 cl.exe 编译 c++ 代码并生成可执行文件

区分 cl.exe 生成的 32 位和 64 位 PE 对象文件(Visual Studio C++)

windows系统中的c/c++设计——cl与link的进阶(生成静态库并调用)

Clang如何处理MSVC的编译参数