【发布时间】:2017-08-05 20:09:19
【问题描述】:
当我使用 gcc 在定期更新的 Ubuntu 16.04 64bit 上编译以下代码时
gcc source.c -O3 --fast-math
可执行文件需要大约 45 秒的 CPU 时间才能运行。但是在同一台机器上,在 Windows 7 64bit 中,使用 Visual Studio 2012 发布模式,运行 CPU 时间不到 10 秒。造成这种差异的主要原因是什么?我没有使用足够多的 gcc 优化选项吗? Visual Studio 的编译器是否更好?还是别的什么?
#include <stdio.h>
#include <math.h>
#include <time.h>
#define Nx 1000
int main()
{
double d = 0.015e-2; // meter
double V0 = 400; // volt
double De = 1800e-4; // m^2 per sec
double mu_e = 2.9e1 / 760; // m^2 per volt sec
double n0 = 1e19; // per m^3
double e_eps = 1.602e-19 / 8.854e-12;
double ne[Nx], je[Nx], E[Nx];
double dx = d / (Nx - 1);
double dt = 1e-14; // s
const int Nt = 500000;
int i, k;
double sum;
FILE *fp_ne, *fp_E;
double alpha, exp_alpha, R;
int ESign = -1;
clock_t start_t, end_t;
start_t = clock();
// initialization
for (i = 1; i < Nx; i++)
ne[i] = n0;
ne[0] = 1e-4 * n0;
for (i = 0; i < Nx; i++)
E[i] = -V0 / d;
// time loop
for (k = 0; k < Nt; k++)
{
if (k%1000==0) printf("k = %d\n", k);
for (i = 0; i < (Nx-1); i++)
{
alpha = mu_e*dx*E[i]/De;
exp_alpha = exp(alpha);
R = (exp_alpha-1)/alpha;
je[i] = (De/(dx*R))*(ne[i]-exp_alpha*ne[i+1]);
}
for (i = 1; i < (Nx - 1); i++)
ne[i] += -dt/dx*(je[i] - je[i-1]);
ne[Nx - 1] = ne[Nx - 2];
sum = 0;
for (i = 0; i < (Nx - 1); i++)
sum += dx*je[i];
for (i = 0; i < (Nx - 1); i++)
{
E[i] += -dt*e_eps*(sum / d - je[i]);
if (E[i]>=0) ESign=+1;
}
if (ESign==1) break;
}
// output
printf("time=%e\n",k*dt);
fp_ne = fopen("ne.txt", "w");
fp_E = fopen("E.txt", "w");
fprintf(fp_ne, "# x (cm)\tne(per cm^3)\n");
fprintf(fp_E, "# x (cm)\tE(V/cm)\n");
for (i = 0; i < Nx; i++)
fprintf(fp_ne, "%f\t%e\n", i*dx*100,ne[i]/1e6);
for (i = 0; i < Nx-1; i++)
fprintf(fp_E, "%f\t%e\n", i*dx*100, fabs(E[i])/1e2);
fclose(fp_ne);
fclose(fp_E);
end_t = clock();
printf("CPU time = %f\n", (double)(end_t - start_t) / CLOCKS_PER_SEC);
}
【问题讨论】:
-
对两者进行概要分析并进行比较?我不知道这段代码做了什么,也没有答案。它有“米”、“伏特”和电荷,所以它是一些物理、电磁学的东西,我不想把它拆开来找出答案。你希望我们用它做什么,究竟是什么?
-
哦 - 它读取包含一些内容的数据文件,同样,我们应该如何处理这个?应用 I/O 是否绑定?文件有多大?你知道所有这些东西,所以你应该做[whatever]
-
比较生成的代码(仅限数学部分)I/O 和其他库函数可以完全不同。
-
最大的耗时是输出到终端(在 Ubuntu linux 16.04 中)对我来说,在我的机器上,21+ 秒输出所有数据
-
您是直接在机器/计算机上运行每个操作系统还是其中一个在 VM 中运行?
标签: c gcc visual-studio-2012