使用openmp进行高斯消除

时间:2020-06-11 23:11:43

标签: c openmp

我是openmp的新手,我尝试使用openmp运行高斯消除方法。但是当我增加线程数(MAXTHREADS)时,实现的总时间也增加了,这很奇怪,因为通常随着线程数的增加,总时间应该减少。也许是竞争条件或开销引起了这个问题或其他任何原因,但是我不能,发现如果有人告诉我我的错误是什么,我会很高兴?

   #include<stdio.h>
#include<omp.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>

#define SIZE 4096
#define MAXTHREADS 4

void read();
void print();
double a[SIZE][SIZE],b[SIZE],x[SIZE],y[SIZE];
int main(){


    int chunk,start,end,i,j,tid,k;
    double start_time,end_time;
    double diff_time;

    read();
    printf("AFTER THE READ FUNCTION \n");
    start_time=omp_get_wtime();
    chunk=SIZE/MAXTHREADS;
    omp_set_num_threads(MAXTHREADS);

#pragma omp parallel shared(a,b,x,y,i,j,chunk)private(k,tid,start,end)
    {

        tid=omp_get_thread_num();
        start=tid*chunk;
        end=start+chunk;
        printf("THREAD %d CREATED WITH START : %d AND END : %d \n",tid,start,end);
        for(k=0;k<SIZE;k++){
            if((k>=start)&&(k<end))
            {
                for(j=k+1;j<SIZE;j++)
                    a[k][j]=a[k][j]/a[k][k];
                x[k]=b[k]/a[k][k];
                a[k][k]=1;
            }
#pragma omp barrier
#pragma omp for schedule(dynamic,chunk)nowait
            for(i=k+1;i<SIZE;i++)
            {
                for(j=k+1;j<SIZE;j++)
                    a[i][j]=a[i][j]-a[i][k]*a[k][j];
                b[i]=b[i]-a[i][k]*x[k];
                a[i][k]=0;
            }
#pragma omp barrier
        }//k end
    }//end of omp parallel

end_time=omp_get_wtime();

//print();
diff_time=difftime(end_time,start_time);
printf("TOTAL TIME: %1f",diff_time);
return 0;

}

void read()
{
    int i,j,k;
    for(i=0; i<SIZE; i++)
    {
        for(j=0;j<SIZE;j++)
        {
            if(i==j)
            {
                a[i][j]=(double) 10*SIZE;
            }
            else
            {
                a[i][j]=1;
            }
        }

'''

0 个答案:

没有答案