C 中 -mno-sse 标志和 gettimeofday() 错误
-
02-10-2019 - |
题
使用 gettimeofday() 的简单 C 程序在没有任何标志 (gcc-4.5.1) 的情况下编译时工作正常,但在使用标志 -mno-sse 编译时不会给出输出。
#include <stdio.h>
#include <stdlib.h>
int main()
{
struct timeval s,e;
float time;
int i;
gettimeofday(&s, NULL);
for( i=0; i< 10000; i++);
gettimeofday(&e, NULL);
time = e.tv_sec - s.tv_sec + e.tv_usec - s.tv_usec;
printf("%f\n", time);
return 0;
}
我有cflags = -march =本机-mtune =天然有人可以解释为什么会发生这种情况吗?该程序通常会返回正确的值,但在启用 -mno-sse 的情况下编译时会打印“0”。
解决方案
旗帜 -mno-sse
引起浮点参数在堆栈上传递,而通常的X86_64 ABI指定应通过SSE寄存器通过。
自从 printf()
在您的C库中编译了 没有 -mno-sse
, ,预计将根据ABI传递浮点论点。这就是为什么您的代码失败的原因。它与 gettimeofday()
.
如果您想使用 printf()
从您的代码中编译 -mno-sse
并传递浮点参数,您将需要使用该选项重新编译C库,并链接到该版本。
其他提示
看来您正在使用一个循环,该循环无助于观察时间差。问题是,编译器可以完全优化此循环。问题可能不在 -mno-sse
本身,但可能是允许优化删除循环,从而每次运行时都会同时为您提供同时。
我建议尝试将某些内容放入无法优化的循环中(例如,递增您在最后打印出的数字)。看看您是否仍然得到相同的行为。如果没有,我建议您查看生成的汇编器 gcc -S
并查看代码差异是什么。
数据架构TV_USEC和TV_SEC通常是渴望的。将变量“时间”重新分配为长整数解决了问题。
以下链接解决了问题。http://gcc.gnu.org/ml/gcc-patches/2006-10/msg00525.html工作代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
struct timeval s,e;
long time;
int i;
gettimeofday(&s, NULL);
for( i=0; i< 10000; i++);
gettimeofday(&e, NULL);
time = e.tv_sec - s.tv_sec + e.tv_usec - s.tv_usec;
printf("%ld\n", time);
return 0;
}
感谢您的及时答复。希望这可以帮助。
你是什么意思 doesn't give output
?
0(零)是一个完全合理的预期输出。
编辑:尝试编译为汇编程序(gcc -S ...
)并查看正常版本和无 sse 版本之间的差异。