gpt4 book ai didi

c - 使用 icc 编译时我的程序无法正常运行

转载 作者:行者123 更新时间:2023-12-02 06:48:42 24 4
gpt4 key购买 nike

我遇到了 icc 问题,到目前为止我还没有找到任何解决方案。我的程序用gcc编译时运行正常,但用icc编译时显然没有执行任何操作。不会发生运行时错误。该程序结束得非常快(几毫秒),但预计需要几秒钟(对于 n = 10 亿,大约需要 11 秒)。但是,如果我在最后打印总数,它就可以正常工作。

这是一个小代码:

# include <stdlib.h>
# include <stdio.h>

double f(double x){
double pi = 3.141592653589793;
double value;
value = 50.0 / (pi * (2500.0 * x * x + 1.0));
return value;
}
int main (int argc, char *argv[]){
double a = 0.0, b = 10.0, total = 0.0, x;
unsigned long int i, n = 1000000000;

for(i = 0; i < n; i++){
x = ((n - i - 1) * a + (i) * b) / (n - 1);
total = total + f(x);
}
total = (b - a) * total / (double) n;

//printf("%f\n", total);
return 0;
}

我还检查了它是否确实运行了循环并调用了函数 n 次。

有谁知道可能导致此问题的原因是什么?

谢谢!

最佳答案

However it works okay if I print the total at the end.

这可能是一个 optimizing compiler效果(合法,根据 C11 标准 n1570 )。

因为没有可见的side-effect在您的程序中(没有 printf),允许编译器(根据 as-if rule )将其优化为无操作程序。

一些版本的 GCCClang , 还有一些 optimization flags你可以观察到同样的情况。尝试使用 gcc -O3 -S -fverbose-asm 编译您的代码并查看生成的汇编代码(您将在 Linux 上使用 GCC 8.1 观察生成的空 main/x86-64)

Does anyone know what could be causing this problem?

你的代码,以及你对棘手的误解semantics C 的实现。实现的行为符合 C 标准(并且您的程序正常运行)。

顺便说一句,即使使用 printf,理论上编译器也可以将您的程序优化为一个简单的常量 printf。实际上,当前的编译器(遗憾的是)并没有那么聪明。

如果你想要一些稳健的基准测试,n 可能取决于程序参数(你仍然需要保留 printf,因为你想要一些可见的副作用) 也许:

 unsigned long n = (argc<2)?1000:(unsigned long)atol(argv[1]);

测量性能时,不要忘记在编译器中启用优化!

顺便说一句,几年后(在学习了更多 CS 类(class),包括一门关于编译的类(class)和/或阅读了 Dragon Book 之后),您可能会尝试实现一些 GCC plugin这将能够使用显式 printf (但仍将 n 初始化为编译时常量)优化您的函数到 main 中调用一些 printf 并在编译时 执行循环计算 total(这样的优化是合法的)。您会发现进行这样的优化需要大量工作(肯定是几个月,也许是几年!),并且可能 not适用于许多现有程序,但您可以从中获得乐趣。

如果您对浮点计算感兴趣,请务必阅读 floating point guide (这很棘手)。

关于c - 使用 icc 编译时我的程序无法正常运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50562050/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com