РОССИИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ
АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ОБРАЗОВАНИЯ
«САМАРСКИЙ НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ
УНИВЕРСИТЕТ ИМЕНИ АКАДЕМИКА С.П. КОРОЛЕВА»
ОТЧЕТ
по лабораторной работе № 3
«Перемножение матриц с использованием технологии MPI»
Выполнила: Логинова П. А.
гр. 6176-120404 D
Проверил: Минаев Е.Ю.
Самара 2019
Цель работы: осуществить перемножение матриц с использованием
технологии MPI. Исследовать, как влияют на работу программы изменения
различных параметров.
Ход работы:
#include "mpi.h"
#include <cstdlib>
#include <iostream>
#include "time.h"
// MPI routines
int ProcNum, ProcRank;
temp = 0.0;
for (i=0; i < ProcPartSize; i++) {
for (j=0; j < ProcPartSize; j++) {
for (k=0; k < dim; k++)
temp += bufA[i*dim+k]*bufB[j*dim+k];
bufC[i*dim+j+ProcPartSize*ProcRank] = temp;
temp = 0.0;
}
}
int NextProc; int PrevProc;
for (p=1; p < ProcNum; p++) {
NextProc = ProcRank+1;
if (ProcRank == ProcNum-1)
NextProc = 0;
PrevProc = ProcRank-1;
if (ProcRank == 0)
PrevProc = ProcNum-1;
MPI_Sendrecv_replace(bufB, part, MPI_DOUBLE, NextProc, 0, PrevProc, 0,
MPI_COMM_WORLD, &Status);
temp = 0.0;
for (i=0; i < ProcPartSize; i++) {
for (j=0; j < ProcPartSize; j++) {
for (k=0; k < dim; k++) {
temp += bufA[i*dim+k]*bufB[j*dim+k];
}
if (ProcRank-p >= 0 )
ind = ProcRank-p;
else ind = (ProcNum-p+ProcRank);
bufC[i*dim+j+ind*ProcPartSize] = temp;
temp = 0.0;
}
}
}
delete []bufA;
delete []bufB;
delete []bufC;
MPI_Finalize();
}
// Matrix output
template <typename T> int matrixOutput(T *Mat, int size, string name)
{
cout << "\"" << name << "\" matrix output:" << endl;
for (int i=0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
cout << Mat[i*size + j] << " ";
}
cout << endl;
}
return 1;
}
//matrixOutput<double>(A, N, "A");
//matrixOutput<double>(B, N, "B");
start = clock();
// Begin MPI
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &ProcNum);
MPI_Comm_rank(MPI_COMM_WORLD, &ProcRank);
//MPI_Bcast(&N, 1, MPI_INT, 0, MPI_COMM_WORLD);
MatrixMultiplicationMPI(A, B, C, N);
cout << endl << "Calculation time: " << double(clock() - start)/CLOCKS_PER_SEC << "
seconds" << endl;
// free memory
delete [] A;
delete [] B;
delete [] C;
return 0;
}
Кроме самой программы (формата .cpp), был еще следующий файл формата
.pbs:
#!/bin/bash
#PBS -N matMulMPI.mpi
#PBS -A stud000
#PBS -l nodes=4:ppn=2
#PBS -j oe
#PBS -l walltime=00:01:10
cd $PBS_O_WORKDIR
2.5
2
Время
1.5 Ряд1
Ряд2
1
0.5
0
0 2 4 6 8
Парметр ppn
4
Время
3
Ряд1
2 Ряд2
0
0 500 1000 1500 2000
Размерность матрицы
2.5
0.5
0
0 0.5 1 1.5 2 2.5
Парметр nodes