使用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 = native -mtune = native 有人能解释为什么会这样吗? 程序正常返回正确的值,但在启用-mno-sse编译时打印“0”。
答案 0 :(得分:5)
标志-mno-sse
导致浮点参数在堆栈上传递,而通常的x86_64 ABI指定它们应该通过SSE寄存器传递。
由于C库中的printf()
是在没有 -mno-sse
的情况下编译的,因此需要根据ABI传递浮点参数。这就是您的代码失败的原因。它与gettimeofday()
无关。
如果您希望在使用printf()
编译的代码中使用-mno-sse
并传递浮点参数,则需要使用该选项重新编译C库并链接该版本。
答案 1 :(得分:1)
看起来你正在使用一个没有任何作用的循环来观察时差。问题是,编译器可能完全优化此循环。问题可能不在于-mno-sse
本身,但可能是允许进行优化以消除循环,因此每次运行时都会给您相同的时间。
我建议尝试在该循环中放置一些无法优化的内容(例如递增最后打印出的数字)。看看你是否仍然有同样的行为。如果没有,我建议您查看生成的汇编程序gcc -S
,看看代码差异是什么。
答案 2 :(得分:1)
数据结构tv_usec和tv_sec通常很长。 将变量“time”重新声明为长整数解决了这个问题。
以下链接解决了该问题。 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;
}
感谢您的快速回复。希望这会有所帮助。
答案 3 :(得分:0)
你是什么意思doesn't give output
?
0(零)是期望的完全合理的输出。
编辑:尝试编译汇编程序(gcc -S ...
)并查看正常版本和no-sse版本之间的差异。