我是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;
}
}
'''