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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top