Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2015, 21:11   #1
фаридофф
Новичок
Джуниор
 
Регистрация: 09.08.2012
Сообщений: 2
По умолчанию MPI_Умножение

Код:
// 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");
}
Код нужно оформлять правильно, спец. тегом. Просьба учесть. Модератор

Последний раз редактировалось Poma][a; 25.08.2015 в 21:22.
фаридофф вне форума Ответить с цитированием
Старый 25.08.2015, 21:16   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

И для чего сей опус здесь приложен? Дабы увековечить в анналах истории? Или потешить ЧСВ?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц