-mno-sse标志和C中的gettimeofday()出错

时间:2010-09-10 19:51:11

标签: 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; 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”。

4 个答案:

答案 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版本之间的差异。