C/C++:-msse 和 -msse2 标志对二进制文件没有任何影响
C/C++: -msse and -msse2 Flags do not have any effect on the binaries?
我只是在玩gcc(g ++)和编译器标志-msse和-msse2。我有一个看起来像这样的小测试程序:
#include <iostream>
int main(int argc, char **argv) {
float a = 12558.5688;
float b = 6.5585;
float result = 0.0;
result = a * b;
std::cout << "Result: " << result << std::endl;
return 0;
}
当我使用以下语句编译它时:
/usr/local/bin/g++-4.9 -W -msse main.cpp -o testsse
和
/usr/local/bin/g++-4.9 -W -msse2 main.cpp -o testsse2
输出文件二进制相等。但是由于SMID标志的原因,我预计它们并不相同。
所以我的问题是,这些编译器标志对二进制文件没有任何影响吗?我已经在OS X 10.10.3和Fedora 21上测试过它。
感谢您的帮助。
亲切问候
法比安
在你的代码中,涉及非常基本的浮点数学。我敢打赌,如果你打开优化(即使是-O1
),它也会被优化出来,因为这些值是常量表达式,因此可以在编译时计算。
使用SSE(movss
,mulss
),因为它是浮点演算的阈值,如果我们愿意的话。SSE2 在这里没有范围。
为了为 SSE2 找到空间,您需要包含更复杂的微积分,这些微积分可能会也可能不会利用 SSE2 中可用的一些指令;你可以查找一些做了什么,做他们的等效工作,看看编译器是否可以利用它们。
您需要知道的第一件事是 SSE2 和 SSE 默认启用并用于 64 位代码。对于 32 位代码,默认值为 x87 指令。
您需要知道的第二件事是双浮点数需要 SSE2,因此如果您想在示例中查看 SSE 和 SSE2 之间的区别,您应该将双精度与浮点数进行比较。
你需要知道的第三件事是如何说服你的编译器不要优化你的计算。一种方法是将代码包装在如下函数中:
//foo.cpp
float foof(float x, float y) {
return x*y;
}
double food(double x, double y) {
return x*y;
}
然后g++ -O3 -S foo.cpp
显示foof
使用mulss
而food
使用mulsd
。如果你想确保它得到正确的结果,你可以像这样链接它
//main.cpp
#include <iostream>
extern float foof(float, float);
extern double food(double, double);
int main(void) {
float af = 12558.5688;
float bf = 6.5585;
float resultf = 0.0;
double ad = af;
double bd = bf;
double resultd = 0.0;
resultf = foof(af, bf);
resultd = food(ad, bd);
std::cout << "Resultf: " << resultf << " Resultd: " << resultd << std::endl;
}
然后做g++ -O3 -c foo.cpp
然后g++ -O3 main.cpp foo.o
.
如果要禁用 SSE 指令,请使用 -mfpmath=387
或以 32 位模式编译 -m32
.
- 正在读取二进制文件(is_open)
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 保存/加载大量短数组到二进制文件
- 从二进制文件中读取整数数组
- Android 在编译二进制文件时重建静态库
- 在 C++ 中将双精度变量写入二进制文件
- clang 的 libFuzzer 可以在同一二进制文件中测试超过 1 个 API 吗?
- C++:实际上不是从二进制文件中读取
- 如何从二进制文件中的给定符号中获取调用程序图
- 将内部带有矢量的结构保存/读取到二进制文件中
- 编译多个C++文件.调用二进制文件以运行代码
- 如何使用位字段将数据从二进制文件复制到结构中?
- uint8_t同一二进制文件的不同十进制值
- C++单个生成文件多个二进制文件
- 尝试将数字写入二进制文件时引发异常
- C++中读/写二进制文件
- 如何忽略某些二进制文件的执行?
- Microsoft如何保护SQL Server二进制文件免受反向工程的影响
- C/C++:-msse 和 -msse2 标志对二进制文件没有任何影响