C中的-mno sse标志和gettimeofday()出错
使用gettimeofday()的简单C程序在没有任何标志(gcc-4.5.1)的情况下编译时工作正常,但在使用标志-mno-sse编译时不提供输出C中的-mno sse标志和gettimeofday()出错,c,gcc,gettimeofday,C,Gcc,Gettimeofday,使用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;
#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;
}
#包括
#包括
int main()
{
结构时间值s,e;
浮动时间;
int i;
gettimeofday(&s,NULL);
对于(i=0;i<10000;i++);
gettimeofday(&e,NULL);
时间=e.tv_秒-s.tv_秒+e.tv_秒-s.tv_秒;
printf(“%f\n”,时间);
返回0;
}
我有CFLAGS=-march=native-mtune=native
有人能解释一下为什么会这样吗?
程序通常返回正确的值,但在启用-mno sse的情况下编译时打印“0”。什么意思
不提供输出
0(零)是一个完全合理的输出
编辑:尝试编译到汇编程序(gcc-S…
)并查看正常版本和非sse版本之间的差异。似乎您正在使用一个不执行任何操作的循环来观察时间差。问题是,编译器可能会完全优化这个循环。问题可能不在于-mno sse
本身,而在于它允许进行优化,从而消除循环,从而在每次运行时为您提供相同的时间
我建议尝试在循环中加入一些无法优化的内容(比如增加最后打印出来的数字)。看看你是否还有同样的行为。如果没有,我建议查看生成的汇编器gcc-S
,看看代码的区别是什么。数据结构tv\u usec和tv\u sec通常是长的。
将变量“time”重新声明为长整数解决了这个问题
下面的链接解决了这个问题。
工作代码:
#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;
}
#包括
#包括
int main()
{
结构时间值s,e;
长时间;
int i;
gettimeofday(&s,NULL);
对于(i=0;i<10000;i++);
gettimeofday(&e,NULL);
时间=e.tv_秒-s.tv_秒+e.tv_秒-s.tv_秒;
printf(“%ld\n”,时间);
返回0;
}
谢谢你的及时回复。希望这会有所帮助。标志-mno sse
会导致浮点参数在堆栈上传递,而通常的x86_64 ABI指定它们应该通过sse寄存器传递
由于C库中的printf()
是在没有-mno sse
的情况下编译的,因此它希望根据ABI传递浮点参数。这就是代码失败的原因。它与gettimeofday()
无关
如果您希望从使用-mno sse
编译的代码中使用printf()
,并将浮点参数传递给它,则需要使用该选项重新编译您的C库,并针对该版本进行链接。我刚刚将其用作示例。不管循环如何,问题仍然存在。对不起,我的意思是它没有提供有意义的输出。它不应该给零。顺便说一句,你的计算似乎是错误的——它会给1.000001秒的时差带来与0.000002秒相同的结果。