openmp程序中的奇怪错误

时间:2017-03-11 20:01:56

标签: c serialization parallel-processing openmp

我有一个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

1 个答案:

答案 0 :(得分:0)

在评论的帮助下,我想出了这个。变量“i”是这里的问题。要么我们必须在并行块中声明“i”或声明“private(i)”