根据大多数基准测试,英特尔的Clear Linux比其他发行版更快,主要得益于名为Function Multi-Versioning的gcc功能.现在他们使用的方法是编译代码,分析哪个函数包含向量化循环,然后使用FMV属性修补代码并再次编译.
gcc自动完成它有多可行?例如,通过传递-mmultiarch=sandybridge,skylake(或类似-m选项列出CPU扩展,如AVX和AVX2).
现在我对两种使用场景感兴趣:
是否有任何选项(/ O2除外)来改进Visual C++代码输出?在这方面,MSDN文档非常糟糕.请注意,我不是在询问项目范围的设置(链接时优化等).我只对这个特殊的例子感兴趣.
相当简单的C++ 11代码如下所示:
#include <vector>
int main() {
std::vector<int> v = {1, 2, 3, 4};
int sum = 0;
for(int i = 0; i < v.size(); i++) {
sum += v[i];
}
return sum;
}
Run Code Online (Sandbox Code Playgroud)
Clang的libc ++输出非常紧凑:
main: # @main
mov eax, 10
ret
Run Code Online (Sandbox Code Playgroud)
另一方面,Visual C++输出是一个多页面的混乱.我在这里遗漏了什么,还是VS真的很糟糕?
编译器资源管理器链接:https: //godbolt.org/g/GJYHjE
我在使用 cmake/gcc/Linux 时遇到问题。
无论我尝试什么,我都无法摆脱链接器行上的 CMAKE_CXX_FLAGS。CMake 在链接模式下调用 g++ 时不断传递它们。
我的 CMAKE_CXX_FLAGS 中有 -fopenmp 并且它不能出现在链接线上,所以 g++ 不会链接到 gomp(我使用的是 Intel 的 iomp5)。
编辑:我在 CMakeLists.txt 的开头尝试了以下内容,但没有帮助:
set(CMAKE_CXX_LINK_EXECUTABLE
"<CMAKE_CXX_COMPILER> <FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
Run Code Online (Sandbox Code Playgroud)
谢谢