Multithreading OpenMP#pragma omp并行速度较慢

Multithreading OpenMP#pragma omp并行速度较慢,multithreading,parallel-processing,openmp,multicore,pragma,Multithreading,Parallel Processing,Openmp,Multicore,Pragma,我正在努力改进我的C源代码以并行执行。我有一个四核CPU,所以我认为4是一个很好的线程数(一个用于CPU)来运行我的程序,比像顺序代码一样优化的速度更快 但它不起作用。我的代码在没有OpenMP的情况下需要11分钟才能执行,而并行代码的执行时间超过11分钟。我报告了所有源代码,但并行代码仅在getBasin()函数中 #包括 #包括 #包括 #包括 #包括 #定义BLD“\x1B[1m” #定义红色“\x1B[31m” #定义GRN“\x1B[32m” #定义RST“\x1B[0m” 结构点{

我正在努力改进我的C源代码以并行执行。我有一个四核CPU,所以我认为4是一个很好的线程数(一个用于CPU)来运行我的程序,比像顺序代码一样优化的速度更快

但它不起作用。我的代码在没有OpenMP的情况下需要11分钟才能执行,而并行代码的执行时间超过11分钟。我报告了所有源代码,但并行代码仅在
getBasin()函数中

#包括
#包括
#包括
#包括
#包括
#定义BLD“\x1B[1m”
#定义红色“\x1B[31m”
#定义GRN“\x1B[32m”
#定义RST“\x1B[0m”
结构点{
双x;
双v;
双t;
双E0;
双E;
双德;
}类型定义点;
结构参数{
双伽马射线;
双ε;
双dt;
双星;
双丘盆地;
双t_最大值;
双x0;
双v0;
智力选择;
int alg[1];
双dx;
}typedef参数;
//福齐奥尼酒店
无效设置();
void getParams(参数*pars);
void getError(点*xv,参数*pars,int*i,int k,int*n_passi,double*xn1,double*vn1);
void getBasin(点*xv,参数*pars,int*h,int*n_passi,双*xn1,双*vn1);
双f(双x,双v,参数*PAR);
无效代数(点*xv,参数*pars,双*xn1,双*vn1);
无效代数分析仪(点*xv,参数*PAR,双*xn1,双*vn1);
无效algPuntoDiMezzo(点*xv,参数*PAR,双*xn1,双*vn1);
无效algVerlet(点*xv,参数*pars,双*xn1,双*vn1);
无效algRungeKutta2(点*xv,参数*PAR,双*xn1,双*vn1);
内部主(空){
//根据l'utente.Maggiori informazioni vedere funzione Setup()对il显示进行初始化;
设置();
//根据项目的相关规定,对项目进行重新评估;
旁部;
getParams(和pars);
//在支持方面的变化;
int i,n_passi=pars.t_max/pars.dt;
双dt0,xn1,vn1,t_星=5。;
第十五点;
//子宫旁异位;
xv.x=PAR.x0;
xv.v=PAR.v0;
xv.E0=0.5*(xv.v)*(xv.v)-(xv.x)*(xv.x)/8.+(xv.x)*(xv.x)*(xv.x)*(xv.x)/4。;
xv.E=xv.E0;
xv.dE=0;
xv.t=0;
pars.t_星=5;
t_盆地部分=60;
dt0=帕斯·德特;
//格式化输出;
printf(“t\tx(t)\tv(t)\tE(t)\tdE\n”);
如果((pars.choice==1)|(pars.choice==3)|(pars.choice==4)){//L'utente ha deciso di affrontare il primo/terzo/quarto esercizio;
//这是一种快速、有效的治疗方法;
fprintf(标准“\nAvvio integrazione numerica…”);
if(pars.alg[0]==1){//L'tente ha selezionato L'algoritmo di Eulero;
对于(i=0;i插入每个伽马的值:);
扫描频率(“%lf”和&pars->gamma);
}而(pars->gamma<0);
做{
fprintf(标准,“>每ε插入值:”;
scanf(“%lf”,&pars->epsilon);
}而(pars->epsilon<0);
做{
fprintf(标准,“>每dt的价格插入:”;
扫描频率(“%lf”和&pars->dt);
}而(pars->dt<0);
做{
fprintf(标准“>每tmax t.c.的价格插入:\n”);
每个eserc的fprintf(标准“>>(tmax>5”);
fprintf(标准,“>>(tmax>60)每V eserc.”;
扫描频率(“%lf”和&pars->t_max);
}而(pars->t_max<0);
做{
fprintf(标准“>每x(0)的价格插入:”;
扫描频率(“%lf”和&pars->x0);
}而(PAR->x0<-1);
做{
fprintf(标准“>每v(0)的价格插入:”;
扫描频率(“%lf”,&PAR->v0);
}而(PAR->v0<-1);
做{
fprintf(标准,“>Selezionare l'esercizio richiesto:\n”);
fprintf(标准“\t>>[1]Esercizio 1\n”);
fprintf(标准,“\t>>[2]Esercizio 2\n”);
fprintf(标准,“\t>>[3]Esercizio 3\n”);
fprintf(标准,“\t>>[4]Esercizio 4\n”);
fprintf(标准,“\t>>[5]Esercizio 5\n\n”);
fprintf(标准字符“\t>>”);
scanf(“%d”和&pars->choice);
}而((pars->choice alg[0]);
}而((pars->alg[0]alg[k]);
如果(k==0){
fp=fopen(“错误1.dat”,“w+”);
}否则{
fp=fopen(“错误2.dat”,“w+”);
}
//第二次会议将在第二次会议上举行;
如果(PAR->alg[k]==1){
algF=阿尔古列罗;
}否则如果(PAR->alg[k]==2){
algF=阿尔及利亚罗克默;
}否则如果(PAR->alg[k]==3){
algF=algPuntoDiMezzo;
}否则如果(PAR->alg[k]==4){
algF=algVerlet;
}否则如果(PAR->alg[k]==5){
algF=algRungeKutta2;
}否则{
fprintf(stderr,“\n[%s%s失败%s]E'stato selezionato un algoritmo non-valido.\n”,BLD,红色,RST);
退出(退出失败);
}
//信息处理程序;
fprintf(stderr,“\n>>Avvio%d算法…”,k+1);
//格式化戴尔的输出数据文件内容gli错误;
fprintf(fp,“dt\tE(t*)\tE(0)\tdE/E(0)\t\passi\ti\tt\n”);
对于(j=0;jdt/2.t)和(xv->t>=pars->t\u star+pars->dt/2.)和(n==0)){
fprintf(fp,“%+.14lf\t%+.14lf\t%+.14lf\t%+.14d\t%+.14d\t%+.14lf\n”,pars->dt,xv->E,xv->E0,(xv->E-xv->E0)/xv->E0,(*n通过),(*i),xv->t);
n=1;
}
}
//重置为每日可变的l'algoritmo con dt/2^j
n=0;
xv->t=0;
xv->x=pars->x0;
xv->v=PAR->v0;
PAR->dt=PAR->dt/2。;
(*n_passi)=pars->t_max/pars->dt;
(*xn1)=0;
(*vn1)=0;
xv->E=xv->E0;
}
fclose(fp);
fprintf(标准,“[%s%sDONE%s]”,BLD,GRN,RST);
}
无效集水池(点*xv,参数*PAR,整数*h,整数*n_passi,双*xn1,双*vn1){
//这是一个很好的例子
gcc -O3 -fopenmp -mtune=native -march=native -w bassin.c