Смекни!
smekni.com

Всвязи с большими объемами перерабатываемой информации в сложных вычислительных системах возможным путем решения возникающих в них задач является распараллеливание (стр. 2 из 3)

Номера строк

Номера столбцов

1

2

3

4

5

1

b11

b12

0

0

0

2

b21

0

b23

b24

0

3

0

b32

0

b34

b35

4

0

0

b43

0

b45

5

0

0

0

b54

0

6

0

0

0

0

0

7

0

0

0

0

0

1.4. Строится результирующая матрица С путём перемножения матриц А и В, полученных в результате распараллеливания. Для данного примера матрица С будет иметь вид:

Матрица С [7,5]

Номера строк

Номера столбцов

1

2

3

4

5

1

а11b1112b21

а11b12

а12b23

а12b24

0

2

а21b11

а21b1223b32

а24b43

а23b34

а23b3524b45

3

а32b21

0

а32b2334b43

а32b24 35b54

а34b45

4

0

а43b34

0

а43b3445b54

а43b35

5

0

0

а54b43

0

а54b45

6

0

0

0

0

0

7

0

0

0

0

0

1.2.2 Блок-схема алгоритма


1.2.3 Листинг текста программы

ml-mpo-lab1.c

/* Program for task solution of multiplication of two rectangular big dimension matrixes

* Решение задачи перемножения двух прямоугольных матриц большой размерности

* Copyright (C) 2005 Eugene Dokukin aka MustLive. http://mlbpg.narod.ru

* Open Source Software, GPL. http://www.gnu.org */

#include <stdio.h>

// matrix demensions: A 7x8 and B 8x5

#define SIZE_Ia 7 // max rows for matrix A

#define SIZE_Ja 8 // max columns for matrix A

#define SIZE_Ib 8 // max rows for matrix B

#define SIZE_Jb 5 // max columns for matrix B

int A_I, A_J; // number of rows and columns for matrix A

int B_I, B_J; // number of rows and columns for matrix B

int NULL_Ia[SIZE_Ia]; // nulls in rows of A

int NULL_Ja[SIZE_Ja]; // nulls in columns of A

int NULL_Ib[SIZE_Ib]; // nulls in rows of B

int NULL_Jb[SIZE_Jb]; // nulls in columns of B

int MatrixA[SIZE_Ia][SIZE_Ja]; // matrix A

int MatrixB[SIZE_Ib][SIZE_Jb]; // matrix B

int MatrixC[SIZE_Ia][SIZE_Jb]; // matrix C

void Error () { // enter correct parameters

printf ("&bsol;nProgram for task solution of multiplication&bsol;n");

printf ("of two rectangular big dimension matrixes&bsol;n");

printf ("Copyright (C) 2005 MustLive. http://mlbpg.narod.ru&bsol;n");

printf ("Open Source Software, GPL. http://www.gnu.org&bsol;n&bsol;n");

}

void NullMatrix () { // null all elements of all matrixes

int i,j; // counters

for (i=0;i<A_I;i++) {

for (j=0;j<A_J;j++) {

MatrixA[i][j] = 0;

}

}

for (i=0;i<B_I;i++) {

for (j=0;j<B_J;j++) {

MatrixB[i][j] = 0;

}

}

for (i=0;i<A_I;i++) {

for (j=0;j<B_J;j++) {

MatrixC[i][j] = 0;

}

}

}

void ReadMatrixes (char filename[255]) { // open file and read two matrixes

FILE *fp; // pointer on file

int i,j; // counters

if ( (fp = fopen(filename, "r")) == NULL) {

Error();

fprintf(stderr, "Error opening file %s.&bsol;n",filename);

exit(0);

}

else {

for (i=0;i<A_I;i++) {

for (j=0;j<A_J-1;j++) {

fscanf (fp, "%i ",&MatrixA[i][j]);

if ( feof(fp) ) break;

NULL_Ia[i] = NULL_Ia[i] + MatrixA[i][j];

NULL_Ja[j] = NULL_Ja[j] + MatrixA[i][j];

}

fscanf (fp, "%i&bsol;n",&MatrixA[i][j]);

NULL_Ia[i] = NULL_Ia[i] + MatrixA[i][j];

NULL_Ja[j] = NULL_Ja[j] + MatrixA[i][j];