Смекни!
smekni.com

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

if ( feof(fp) ) break;

}

fscanf (fp,"\n");

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

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

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

if ( feof(fp) ) break;

NULL_Ib[i] = NULL_Ib[i] + MatrixB[i][j];

NULL_Jb[j] = NULL_Jb[j] + MatrixB[i][j];

}

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

NULL_Ib[i] = NULL_Ib[i] + MatrixB[i][j];

NULL_Jb[j] = NULL_Jb[j] + MatrixB[i][j];

if ( feof(fp) ) break;

}

}

fclose(fp);

}

void ReorganizeInputMatrixes () { // algebraic manipulation of input matrixes

while (NULL_Ia[A_I-1] == 0) { // if last row of matrix А is null

A_I--;

}

while (NULL_Jb[B_J-1] == 0) { // if last column of matrix B is null

B_J--;

}

// if last column of matrix A and last row of matrix B is null

while ((NULL_Ja[A_J-1] == 0) && (NULL_Ib[B_I-1] == 0)) {

A_J--;

B_I--;

}

}

void MultiplyInputMatrixes () { // multiplication of two rectangular matrixes

int i,j,k; // counters

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

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

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

MatrixC[i][j] = MatrixC[i][j] + MatrixA[i][k]*MatrixB[k][j];

}

}

}

}

void DisplayInputMatrixes () { // display input matrixes

int i,j; // counters

printf ("&bsol;nMatrix A&bsol;n&bsol;n");

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

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

printf("%i&bsol;t",MatrixA[i][j]);

}

printf("&bsol;n");

}

printf ("&bsol;nMatrix B&bsol;n&bsol;n");

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

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

printf("%i&bsol;t",MatrixB[i][j]);

}

printf("&bsol;n");

}

}

void DisplayResultMatrix () { // display resulting matrix

int i,j; // counters

printf ("&bsol;n&bsol;nResulting matrix C = A x B&bsol;n");

printf ("&bsol;nMatrix C&bsol;n&bsol;n");

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

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

printf("%i&bsol;t",MatrixC[i][j]);

}

printf("&bsol;n");

}

}

void WriteResultMatrix (char filename[255]) { // open file and write resulting matrix

FILE *fp; // pointer on file

int i,j; // counters

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

Error();

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

exit(0);

}

else {

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

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

fprintf(fp,"%i&bsol;t",MatrixC[i][j]);

}

fprintf(fp,"&bsol;n");

}

}

fclose(fp);

}

int main (int argc, char *argv[]) {

if (argv[1] == NULL){ // input filename

Error();

printf ("%s filename&bsol;n",argv[0]);

exit(0);

}

NULL_Ia[SIZE_Ia] = 0;

NULL_Ja[SIZE_Ja] = 0;

NULL_Ib[SIZE_Ib] = 0;

NULL_Jb[SIZE_Jb] = 0;

A_I = SIZE_Ia;

A_J = SIZE_Ja;

B_I = SIZE_Ib;

B_J = SIZE_Jb;

if (A_J != B_I) {

Error();

fprintf(stderr, "Error: can't multiply input matrixes.&bsol;n");

fprintf(stderr, "Number of columns of A not equal number of rows of B.&bsol;n");

exit(0);

}

NullMatrix();

ReadMatrixes (argv[1]);

if (argv[2] == NULL) {

printf ("&bsol;nInput Matrixes:&bsol;n");

DisplayInputMatrixes();

}

ReorganizeInputMatrixes();

if (argv[2] == NULL) {

printf ("&bsol;n&bsol;nReorganized Matrixes:&bsol;n");

DisplayInputMatrixes();

}

MultiplyInputMatrixes();

if (argv[2] != NULL){ // output filename

WriteResultMatrix(argv[2]);

}

else {

DisplayResultMatrix();

}

}

1.2.4 Результаты работы программы

Запуск программы: ml-mpo-lab1.exe matrixes.txt

Данные, а также ход работы, выводятся на экран.

Input Matrixes:

Matrix A

1 2 0 0 0 0 0

3 0 4 5 0 0 0

0 6 0 7 8 0 0

0 0 1 0 2 0 0

0 0 0 3 0 4 0

0 0 0 0 0 0 0

0 0 0 0 0 0 0

Matrix B

2 3 0 0 0

1 0 5 6 0

0 4 0 1 2

0 0 3 0 4

0 0 0 5 0

0 0 0 0 0

0 0 0 0 0

0 0 0 0 0

Reorganized Matrixes:

Matrix A

1 2 0 0 0 0

3 0 4 5 0 0

0 6 0 7 8 0

0 0 1 0 2 0

0 0 0 3 0 4

0 0 0 0 0 0

0 0 0 0 0 0

Matrix B

2 3 0 0 0

1 0 5 6 0

0 4 0 1 2

0 0 3 0 4

0 0 0 5 0

0 0 0 0 0

0 0 0 0 0

Resulting matrix C = A x B

Matrix C

4 3 10 12 0

6 25 15 4 28

6 0 51 76 28

0 4 0 11 2

0 0 9 0 12

0 0 0 0 0

0 0 0 0 0

1.2.5 Входные и выходные данные

matrixes.txt

1 2 0 0 0 0 0 0

3 0 4 5 0 0 0 0

0 6 0 7 8 0 0 0

0 0 1 0 2 0 0 0

0 0 0 3 0 4 0 0

0 0 0 0 0 0 5 0

0 0 0 0 0 0 6 0

2 3 0 0 0

1 0 5 6 0

0 4 0 1 2

0 0 3 0 4

0 0 0 5 0

0 0 0 0 0

0 0 0 0 0

0 0 0 0 0

Запуск программы: ml-mpo-lab1.exe matrixes.txt result.txt

Данные и ход работы не выводятся на экран, результат записывается в файл.

result.txt

4 3 10 12 0

6 25 15 4 28

6 0 51 76 28

0 4 0 11 2

0 0 9 0 12

0 0 0 0 0

0 0 0 0 0

1.3. Литература

1. Воеводин В.В. Математические основы параллельных вычислений. – М.: МГУ, 1991. – 345 с.

2. Воеводин В.В. Параллельные вычисления. – СПб: БХВ-Петербург. – 2002.

3. Молчанов И.Н. Введение в алгоритмы параллельных вычислений. К.: Наукова думка. - 1990 – 128 с.

4. Дорошенко А.Е. Математические модели и методы организации высокопроизводительных параллельных вычислений. – К.: Наукова думка, 2000 – 177 с.

5. Малышкин В.Э. Основы параллельных вычислений. Учебное пособие. – Новосибирск: Изд-во НГТУ, 2000.