0

一个使用 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

4 回答 4

5

该标志-mno-sse导致浮点参数在堆栈上传递,而通常的 x86_64 ABI 指定它们应该通过 SSE 寄存器传递。

由于printf()在您的 C 库中编译时没有使用 -mno-sse,因此需要根据 ABI 传递浮点参数。这就是您的代码失败的原因。它与 . 无关gettimeofday()

如果您希望printf()从编译的代码中使用-mno-sse并传递浮点参数,则需要使用该选项重新编译您的 C 库并链接到该版本。

于 2010-09-11T14:33:38.870 回答
1

看来您正在使用一个不做任何事情的循环来观察时间差。问题是,编译器可能会完全优化这个循环。问题可能不在于-mno-sse它本身,而可能在于它允许进行优化以删除循环,从而每次运行它时给你相同的时间。

我建议尝试在该循环中放入无法优化的内容(例如增加最后打印出来的数字)。看看你是否仍然得到相同的行为。如果没有,我建议查看生成的汇编程序gcc -S并查看代码差异。

于 2010-09-10T20:18:58.643 回答
1

数据结构 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;
}

感谢您的及时回复。希望这可以帮助。

于 2010-09-11T06:51:28.213 回答
0

你什么意思doesn't give output

0(零)是一个完全合理的预期输出。


编辑:尝试编译到汇编器 ( gcc -S ...) 并查看普通版本和无 sse 版本之间的差异。

于 2010-09-10T19:54:55.063 回答