OMP: разные выходы в последовательной и параллельной версиях - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь запустить программу умножения матриц с использованием OMP. Я получаю разные результаты в последовательной и параллельной версиях. Я пытаюсь использовать только матрицу 3 * 3 для тестирования.

Мой параллельный код:

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

#define NRA 3//62                 /* number of rows in matrix A */
#define NCA 3//15                 /* number of columns in matrix A */
#define NCB 3//7                  /* number of columns in matrix B */

int main (int argc, char *argv[]) 
{
int tid, nthreads, i, j, k, chunk;
double  a[NRA][NCA],           /* matrix A to be multiplied */
    b[NCA][NCB],           /* matrix B to be multiplied */
    c[NRA][NCB];           /* result matrix C */

chunk = 10;                    /* set loop iteration chunk size */

/*** Spawn a parallel region explicitly scoping all variables ***/
#pragma omp parallel shared(a,b,c,nthreads,chunk) private(tid,i,j,k)
  {
  tid = omp_get_thread_num();
  if (tid == 0)
    {
    nthreads = omp_get_num_threads();
    printf("Starting matrix multiple example with %d threads\n",nthreads);
    printf("Initializing matrices...\n");
    }
  /*** Initialize matrices ***/
  #pragma omp for schedule (static, chunk) 
  for (i=0; i<NRA; i++)
    for (j=0; j<NCA; j++)
      a[i][j]= i+j;
  #pragma omp for schedule (static, chunk)
  for (i=0; i<NCA; i++)
    for (j=0; j<NCB; j++)
      b[i][j]= i*j;
  #pragma omp for schedule (static, chunk)
  for (i=0; i<NRA; i++)
    for (j=0; j<NCB; j++)
      c[i][j]= 0;

  /*** Do matrix multiply sharing iterations on outer loop ***/
  /*** Display who does which iterations for demonstration purposes ***/
  printf("Thread %d starting matrix multiply...\n",tid);
  #pragma omp for schedule (static, chunk)
  for (i=0; i<NRA; i++)    
    {
    printf("Thread=%d did row=%d\n",tid,i);
    for(j=0; j<NCB; j++)       
      for (k=0; k<NCA; k++)
        c[i][j] += a[i][k] * b[k][j];
    }
  }   /*** End of parallel region ***/

/*** Print results ***/

printf("******************************************************\n");
printf("Result Matrix:\n");
for (i=0; i<NRA; i++)
  {
  for (j=0; j<NCB; j++) 
    printf("%6.2f   ", a[i][j]);
  printf("\n"); 
  }
printf("******************************************************\n");

printf("******************************************************\n");
printf("Result Matrix:\n");
for (i=0; i<NRA; i++)
  {
  for (j=0; j<NCB; j++) 
    printf("%6.2f   ", b[i][j]);
  printf("\n"); 
  }
printf("******************************************************\n");
printf("******************************************************\n");
printf("Result Matrix:\n");
for (i=0; i<NRA; i++)
  {
  for (j=0; j<NCB; j++) 
    printf("%6.2f   ", c[i][j]);
  printf("\n"); 
  }
printf("******************************************************\n");
printf ("Done.\n");

}

Для серийной версии я только что прокомментировал строку:

#pragma omp for schedule (static, chunk)

Вывод моей параллельной версии:

Запуск примера матрицы с несколькими потоками. Инициализация. матрицы ... нить 0 начальная матрица умножить ... нить 8 начальная матричное умножение ... нить 6 начальная матрица умножение ... нить 9 умножение начальной матрицы ... Thread 5 умножение начальной матрицы ... Thread 1, начальная матрица умножается ... Thread 4, начальная матрица умножить ... нить 7, начальная матрица умножить ... нить 10, начальная матрица матричное умножение ... нить 3 начальная матрица умножение ... нить 2 умножение стартовой матрицы ... Тема = 0 сделал строку = 0 Тема = 0 сделал строку = 1 Thread = 0 did row = 2 Thread 11 Начальная матрица умножается ... ************************************************** **** Матрица результатов: 0,00 1,00 2,00
1,00 2,00 3,00
2,00 3,00 4,00


*********************************************** ******* Матрица результатов: 0,00 0,00 0,00
0,00 1,00 2,00
0,00 2,00 4,00


*********************************************** ******* Матрица результатов: 0,00 5,00 10,00
0,00 8,00 16,00
0,00 11,00 22,00
************************************************** **** Готово.

Вывод моей серийной версии такой:

Запуск примера матрицы с несколькими потоками. Инициализация матрицы ... нить 0 начальная матрица умножить ... нить 3 начальная матричное умножение ... нить 5 начальная матрица умножение ... нить 11 начальная матрица умножается ... Thread 1 начальная матрица умножается ... Thread 10, начальная матрица умножается ... Thread 2, начальная матрица умножить ... нить 9, начальная матрица умножить ... нить 7, начальная матрица матричное умножение ... нить 8 начальная матрица умножение ... нить 4 начальная матрица умножается ... Thread 6 начальная матрица умножается ... ************************************************** **** Матрица результатов: 0,00 1,00 2,00
1,00 2,00 3,00
2,00 3,00 4,00


*********************************************** ******* Матрица результатов: 0,00 0,00 0,00
0,00 1,00 2,00
0,00 2,00 4,00


*********************************************** ******* Матрица результатов: 0,00 60,00 120,00
0,00 96,00 192,00
0,00 132,00 264,00
************************************************** **** Готово.

Как я могу подойти к этой проблеме?

1 Ответ

0 голосов
/ 26 марта 2019

Я нашел ошибку. В последовательной версии я не комментировал должным образом. Я игнорировал строку:

#pragma omp parallel shared(a,b,c,nthreads,chunk) private(tid,i,j,k)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...