我有一个openmp代码产生一些奇怪的错误。显然,程序的并行版本没有正确处理输入数据。我连续编写了相同的程序来比较输出。 我在这里提供类似于我的程序的代码。我无能为力。
#include<stdio.h>
#include<stdlib.h>
#include<omp.h>
unsigned long long int N=100000;
unsigned long long int *a1,*b1,*c1,*d1,*a2,*b2,*c2,*d2,*a3,*b3,*c3,*d3;
void init(){ //just to put some random data
unsigned long long int i;
a1=(unsigned long long int *)malloc(N*sizeof(unsigned long long int));
b1=(unsigned long long int *)malloc(N*sizeof(unsigned long long int));
c1=(unsigned long long int *)malloc(N*sizeof(unsigned long long int));
d1=(unsigned long long int *)malloc(N*sizeof(unsigned long long int));
a2=(unsigned long long int *)malloc(N*sizeof(unsigned long long int));
b2=(unsigned long long int *)malloc(N*sizeof(unsigned long long int));
c2=(unsigned long long int *)malloc(N*sizeof(unsigned long long int));
d2=(unsigned long long int *)malloc(N*sizeof(unsigned long long int));
a3=(unsigned long long int *)malloc(N*sizeof(unsigned long long int));
b3=(unsigned long long int *)malloc(N*sizeof(unsigned long long int));
c3=(unsigned long long int *)malloc(N*sizeof(unsigned long long int));
d3=(unsigned long long int *)malloc(N*sizeof(unsigned long long int));
for(i=0;i<N;i++){
a1[i]=rand();
a2[i]=a1[i];
a3[i]=a1[i];
b1[i]=rand();
b2[i]=b1[i];
b3[i]=b1[i];
c1[i]=rand();
c2[i]=c1[i];
c3[i]=c1[i];
d1[i]=rand();
d2[i]=d1[i];
d3[i]=d1[i];
}
}
void seq(){//runs on one core
unsigned long long int i;
for(i=0;i<N;i++){
a2[i]=a2[i]*b2[i];
}
for(i=0;i<N;i++){
c2[i]=c2[i]*d2[i];
}
}
void parallel(){//runs on 2 cores
unsigned long long int i;
#pragma omp parallel
{
int ID;
ID=omp_get_thread_num();
if(ID==0){
for(i=0;i<N;i++){
a3[i]=a3[i]*b3[i];
}
}
else{
for(i=0;i<N;i++){
c3[i]=c3[i]*d3[i];
}
}
}
}
void main(){
init();
double time;
int i;
time=omp_get_wtime();
seq();
time=omp_get_wtime()-time;
printf("\n time for serial execution : %f\n",time);
time=omp_get_wtime();
parallel();
time=omp_get_wtime()-time;
printf("\ntime for parallel execution : %f\n",time);
for(i=0;i<N;i++){
if(a2[i]!=a3[i])
break;
}
if(i!=-1)
printf("|| error i: %d a1: %llu,a2: %llu,b2: %llua3: %llu,b3:%llu\n||",i,a1[i],a2[i],b2[i],a3[i],b3[i]);
}
正如您所看到的那样,并行代码和顺序代码在相同的数据上运行并执行相同的操作。但是,在某些执行中,并行代码产生错误的输出。串行代码的输出始终是正确的。此外,我无法理解为什么并行执行的时间比串行执行更差。
下面给出了一些执行结果: // ----------------------------------执行1 ------------ -------- 串行执行的时间:0.001207
并行执行的时间:0.001949 ||错误i:1 a1:1957747793,a2:830551664052244655,b2:424238335a3:6241267121326981713,b3:424238335 // ----------------------------------执行2 ------------ -------- 串行执行的时间:0.001241
并行执行的时间:0.001386 ||错误我:1 a1:1957747793,a2:830551664052244655,b2:424238335a3:6241267121326981713,b3:424238335
答案 0 :(得分:0)
在评论的帮助下,我想出了这个。变量“i”是这里的问题。要么我们必须在并行块中声明“i”或声明“private(i)”