Код:
// MPI_Умножение.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<iostream>
#include "MPI.h"
#include <locale.h>
double *pMatrix, *pVector, *pResult, *pProcRows, *pProcResult, Start, Finish, Duration;
int ProcNum =2, ProcRank,RowNum;
void ProcessInitalization(double* &pMatrix, double* &pVector, double* &pResult, double*pProcResult,int &Size)
{
if (ProcRank == 0)
{
do
{
printf("\n Введите размер начальных объектов:");
scanf_s("%d", &Size);
if (Size < ProcNum){
printf("Размер объектов должен быть больше количества процессов!\n");
}
if (Size%ProcNum != 0){
printf("Размер объектов должен быть кратен количеству процессов\n ");
MPI_Bcast(&Size, 1, MPI_INT, 0, MPI_COMM_WORLD);
RowNum = Size / ProcNum;
pVector = new double[Size];
pResult = new double[Size];
pProcRows = new double[RowNum*Size];
pProcResult = new double[RowNum];
if (ProcRank = 0){
pMatrix = new double[Size*Size];
}
}
}
while ((Size<ProcNum) || (Size%ProcNum != 0));
}
}
void DummyDatainitialization( double*pMatrix,double*pVector,int Size )
{
int i, j;
for (i = 0; i < Size; i++){
pVector[i] = 1;
printf("Начальный вектор:\n");
printf("%.2f", pVector[i]);
}
for (i = 0; i < Size; i++)
{
for (j = 0; j < Size; j++)
{
pMatrix[j,i] = i + 1;
printf("Начальная матрица :\n");
printf("%.2f", pMatrix[i,j]);
}
}
}
void DataDistribution(double*pMatrix,double*pVector,double*pProcRows,int Size, int RowNum){
MPI_Bcast(pVector,Size,MPI_DOUBLE,0,MPI_COMM_WORLD);
MPI_Scatter(pMatrix,RowNum*Size,MPI_DOUBLE,pProcRows,RowNum*Size,MPI_DOUBLE,0,MPI_COMM_WORLD);
}
void ParalelResultCalculation(double *pProcRows, double *pVector, double *pProcResult, int Size, int RowNum){
int i, j;
for (i = 0; i < Size; i++){
pProcResult[i] = 0;
for (j = 0; j < Size; j++){
pProcResult[i] += pProcRows[i*Size + j] * pVector[j];
printf("Результат умножения вектора на матрицу при леточном разделении вертикально:\n");
printf("%.2f", pProcResult[i]);
}
}
}
void ResultReplication(double*pProcResult,double *pResult,int Size,int RowNum){
MPI_Allgather(pProcResult,RowNum,MPI_DOUBLE,pResult,RowNum,MPI_DOUBLE,MPI_COMM_WORLD);
}
void PorcessTermination(double* &pMatrix, double* &pVector, double* &pResult){
if (ProcRank == 0)
{
delete[]pMatrix;
delete[]pVector;
delete[]pResult;
delete[]pProcRows;
delete[]pProcResult;
}
}
void main(int argc, char* argv[])
{
setlocale(LC_ALL, "rus");
int Size;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD,&ProcNum);
MPI_Comm_rank(MPI_COMM_WORLD,&ProcRank);
if (ProcRank == 0){
printf("Паралельное векторно манричное умножение\n ");
}
printf("Оценка текущего процесса\n");
ProcessInitalization(pMatrix, pVector, pResult, pProcResult, Size);
DummyDatainitialization(pMatrix, pVector, Size);
Start = MPI_Wtime();
DataDistribution(pMatrix, pVector, pProcRows, Size, RowNum);
ParalelResultCalculation(pProcRows, pVector, pProcResult, Size, RowNum);
ResultReplication(pProcResult, pResult, Size, RowNum); Finish = MPI_Wtime();
Duration = Finish - Start;
printf("Время веполнения векторно матричного умножения=%.2f",Duration);
PorcessTermination(pMatrix,pVector,pResult);
MPI_Finalize();
system("Pause");
}