Мне нужно последовательно и параллельно решать систему линейных алгебраических уравнений c (с использованием Open MP), вычислять время выполнения последовательных и параллельных частей, вычислять коэффициент ускорения. Скажите, как я могу распараллелить этот код
#include<stdio.h>
#include<sys/time.h>
#define M 100
double MA[M][M+1], MAD;
int main()
{ int i, j, v, k;
/* Variables for measuring solution time */
struct timeval tv1, tv2;
long int dt1;
/* Data generation */
for(i = 0; i < M; i++)
{ for(j = 0; j < M; j++)
{ if(i == j)
MA[i][j] = 2.0;
else
MA[i][j] = 1.0;
}
MA[i][M] = 1.0*(M)+1.0;
}
gettimeofday(&tv1,NULL);
/* Direct running */
for(k = 0; k < M; k++)
#pragma omp parallel num_threads(4)
{
#pragma omp single
{
MAD = 1.0/MA[k][k];
for(j = M; j >= k; j--)
MA[k][j] *= MAD;
}
#pragma omp for
for(i = k+1; i < M; i++)
for(j = M; j >= k; j--)
MA[i][j] -= MA[i][k]*MA[k][j];
}
/* Return stroke */
for(k = M-1; k >= 0; k--)
#pragma omp parallel num_threads(4)
{
#pragma omp for
for(i = k-1; i >= 0; i--)
MA[i][M] -= MA[k][M]*MA[i][k];
}
/* Time stamping and printing */
gettimeofday(&tv2,NULL);
dt1 = (tv2.tv_sec - tv1.tv_sec)*1000000 + tv2.tv_usec - tv1.tv_usec;
printf("Time = %ld\n",dt1);
/* Printing the first eight roots */
printf(" %f %f %f %f\n",MA[0][M],MA[1][M],MA[2][M],MA[3][M]);
printf(" %f %f %f %f\n",MA[4][M],MA[5][M],MA[6][M],MA[7][M]);
return(0);
}
Результат моего кода:
Время = 33998 -591774539427820410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000,000000 -5020624202161460500000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,000000 -5264154914667309200000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000,000000 1660877030174726000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000,000000 340989012662263910000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000 0000000.000000 -80901561342721588000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -56037652391083288000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000,000000 725419631418998910000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000,000000
Процесс закончил с кодом выхода 0