Я пытаюсь запустить программу умножения матриц с использованием 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
************************************************** **** Готово.
Как я могу подойти к этой проблеме?