C++ 铿锵osx march=本地速度约为未优化速度的1/3

C++ 铿锵osx march=本地速度约为未优化速度的1/3,c++,c++11,C++,C++11,我有一个项目,速度是最重要的,所以我尝试使用编译器标志来获得一些免费的性能。我有两个完全相同的版本,除了版本2中的附加标志march=native 为确保完整性,标志为: A) -std=c++14-g-fno省略帧指针-O3 B) -std=c++14-g-fno省略帧指针-O3-march native 在这些构建上运行基准测试会产生令人困惑的结果: A) 61s B) 160年代 这里可能会发生什么?参数-march=native使clang优化当前CPU的代码。在这种情况下,clang使

我有一个项目,速度是最重要的,所以我尝试使用编译器标志来获得一些免费的性能。我有两个完全相同的版本,除了版本2中的附加标志march=native

为确保完整性,标志为:

A) -std=c++14-g-fno省略帧指针-O3

B) -std=c++14-g-fno省略帧指针-O3-march native

在这些构建上运行基准测试会产生令人困惑的结果:

A) 61s

B) 160年代


这里可能会发生什么?

参数
-march=native
使clang优化当前CPU的代码。在这种情况下,clang使用尽可能多的优化,使用它可能会破坏与其他CPU的兼容性,例如,不支持某些指令集,如AVX2、SSSE3等

你可以跑

echo | clang -E - -O3 -###


获取两种情况下激活的功能列表。

参数
-march=native
使clang优化当前CPU的代码。在这种情况下,clang使用尽可能多的优化,使用它可能会破坏与其他CPU的兼容性,例如,不支持某些指令集,如AVX2、SSSE3等

你可以跑

echo | clang -E - -O3 -###


获取两种情况下激活的功能列表。

使用
-march=native
优化当前cpu的代码。大多数情况下,它会提高执行速度。有时,它可能无法生成尽可能快的代码,因为它启用某些CPU指令

echo | clang -E - -march=native -###

将显示通过
-march=native
启用的clang。最可能的罪魁祸首是
CMOV
,它由
-march=native
启用。你可以在这个问题的答案中看到一个解释,解释为什么这可能会减慢速度:

使用
-march=native
优化当前cpu的代码。大多数情况下,它会提高执行速度。有时,它可能无法生成尽可能快的代码,因为它启用某些CPU指令

echo | clang -E - -march=native -###

将显示通过
-march=native
启用的clang。最可能的罪魁祸首是
CMOV
,它由
-march=native
启用。你可以在这个问题的答案中看到一个解释,解释为什么这可能会减慢速度:

编译器不是魔法。有时它们会生成错误代码(有bug),所以这是一种常见的现象?叮当声中的bug恶化了本地优化代码我不是说这很常见。我只是说,你不应该盲目地相信更高的优化级别或为“你的CPU”生成代码的开关来生成更好的代码。和往常一样,您必须测试和分析。好的,这些基准测试是测试和分析的结果。我有更细粒度的数据,但不是很有启发性。有什么好的资源可以进一步了解这些特性并理解我为什么会看到这种行为?好吧,你可以提供一个。编译器不是魔术。有时它们会生成错误代码(有bug),所以这是一种常见的现象?叮当声中的bug恶化了本地优化代码我不是说这很常见。我只是说,你不应该盲目地相信更高的优化级别或为“你的CPU”生成代码的开关来生成更好的代码。和往常一样,您必须测试和分析。好的,这些基准测试是测试和分析的结果。我有更细粒度的数据,但不是很有启发性。有什么好的资源可以进一步了解这些特性并理解我为什么会看到这种行为?好吧,您可以提供一个。