Параллельное решение системы линейных алгебраических уравнений c - PullRequest
0 голосов
/ 02 мая 2020

Мне нужно последовательно и параллельно решать систему линейных алгебраических уравнений 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...