Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的-mno sse标志和gettimeofday()出错_C_Gcc_Gettimeofday - Fatal编程技术网

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

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;

使用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;
}
#包括
#包括
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秒相同的结果。