如何用与gcc的-O2和-O3完全相同的语言编写c程序

如何用与gcc的-O2和-O3完全相同的语言编写c程序,gcc,optimization,x86,clang,intrinsics,Gcc,Optimization,X86,Clang,Intrinsics,我想评估一个用c-intrinsics编写的AVX2程序,使用gcc5.4.0和clang3.8编译并使用perf,valgrind和IACA进行评估和分析。我完全想要相同的优化方法,所以我阅读了这个相关问题和gcc的这一页,但我仍然怀疑 gcc-O2和gcc-O3是我的基础,我希望在clang中使用相同的方法,因为clang在-O2中进行自动矢量化,我不希望在将结果与gcc-O2进行比较时使用它,我希望在gcc中启用-O3时使用它。所以问题是我应该在clang中使用与gcc中的这些命令相对应的

我想评估一个用
c-intrinsics
编写的AVX2程序,使用
gcc5.4.0
clang3.8
编译并使用
perf
valgrind
IACA
进行评估和分析。我完全想要相同的优化方法,所以我阅读了这个相关问题和gcc的这一页,但我仍然怀疑

gcc-O2
gcc-O3
是我的基础,我希望在clang中使用相同的方法,因为clang在
-O2
中进行自动矢量化,我不希望在将结果与
gcc-O2
进行比较时使用它,我希望在
gcc
中启用
-O3
时使用它。所以问题是我应该在clang中使用与gcc中的这些命令相对应的命令:

第一:

汇编:
gcc-Wall-O2-march=native-masm=intel-c-S“%f”

建造:
gcc-Wall-O2-mavx2-o“%e”“%f”

第二: 汇编:
gcc-Wall-O3-march=native-masm=intel-c-S“%f”

建造:
gcc-Wall-O3-mavx2-o“%e”“%f”
。但有时编译器很笨,会尝试自动矢量化标量清理循环或其他东西。因此,我建议对gcc和clang使用
-O3-fno树矢量化
来禁用自动矢量化,如果这是您想要的。谢谢@PeterCordes,我应该在clang中使用
-mllvm
选项吗?@PeterCordes,程序正在添加到矩阵中:这有什么意义吗?我想我们错过了一些东西。gcc:
gcc-Wall-mavx2-O3-fno树矢量化-o“%e”“%f”
448X448矩阵铿锵的最佳时间为10001次重复中的0.000100秒:
铿锵“%f”-o“%e”-mavx2-O3-fno树矢量化
448X448矩阵的最佳时间为10001次重复中的0.000067秒表示
-mllvm
本身没有用处。这只是为了将其他低级参数传递到clang本机无法处理的llvm后端。我不知道clang是否支持LLVM以外的任何后端。
-Os
还设置了优化选项,以支持较小的代码大小。它可以使用DIV而不是模乘逆进行常数除法。如果您查看编译器输出的手动矢量化代码,编译器通常无法在此基础上自动矢量化。但有时编译器很笨,会尝试自动矢量化标量清理循环或其他东西。因此,我建议对gcc和clang使用
-O3-fno树矢量化
来禁用自动矢量化,如果这是您想要的。谢谢@PeterCordes,我应该在clang中使用
-mllvm
选项吗?@PeterCordes,程序正在添加到矩阵中:这有什么意义吗?我想我们错过了一些东西。gcc:
gcc-Wall-mavx2-O3-fno树矢量化-o“%e”“%f”
448X448矩阵铿锵的最佳时间为10001次重复中的0.000100秒:
铿锵“%f”-o“%e”-mavx2-O3-fno树矢量化
448X448矩阵的最佳时间为10001次重复中的0.000067秒表示
-mllvm
本身没有用处。这只是为了将其他低级参数传递到clang本机无法处理的llvm后端。我不知道clang是否支持LLVM以外的任何后端。
-Os
还设置了优化选项,以支持较小的代码大小。它可以做一些事情,比如用DIV代替模乘逆除以常数。