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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2009, 17:32   #1
kbbudanov
Новичок
Джуниор
 
Регистрация: 25.11.2009
Сообщений: 2
Восклицание Помогите с MPI, плз!

ОС: ХЗ SP3
Компилятор: VS .NET 2003

Суть вот в чем, в универе достаточно много писали на плюсах, однако про MPI и знать не знали...Поэтому, если буду тупить - не бейте, плз)
Проблема:
в без MPI двумерный массив типа **A, можно было инициализировать так:

Цитата:
A = (int**)malloc(n*sizeof(int*));
for(i = 0; i < n; i++) {
A[i] =(int*) malloc(n*sizeof(int));}
Соответственно, получается массив n*n типа float.

Как сделать то же самое в MPI?
kbbudanov вне форума Ответить с цитированием
Старый 25.11.2009, 17:53   #2
kbbudanov
Новичок
Джуниор
 
Регистрация: 25.11.2009
Сообщений: 2
По умолчанию

Этот вариант - последовательная реализация нужной программы, но зато с динамическим выделением памяти.
Код:
#include "stdafx.h"
#include <malloc.h>
#include <conio.h>
//#include <mpi.h>

int main( int argc, char **argv )
{
	float **A,**U,**L;
	int n,m,i,j,k,sum=0;
	FILE *opn;
	FILE *wr;
	wr = fopen("output.txt", "w");
	
	//открытие файла с матрицей

	do
	{
		opn = fopen("input.txt", "r");
		if (!opn) 
		{
			printf("Fail input.txt, soderzhaschij matricu A,dolzhen byt` v papke s programmoj\n");
			getch();
		}
	}
	while(!opn);
	
	//размер матрицы

	do
	{
	printf("Vvedite razmer matricy\n");
	scanf ("%d %d",&n,&m);
	getch();
	if (m!=n) 
	{
		printf("Matrica dolzhna byt` kvadratchnaja!\n");
		getch();
	}
	}
	while (m!=n);
	printf("\n");

	// выделение памяти под А,U и L
	A = (float**)malloc(n*sizeof(float*));
	U = (float**)malloc(n*sizeof(float*));
	L = (float**)malloc(n*sizeof(float*));
	for(i = 0; i < n; i++) 
	{
	A[i] =(float*) malloc(n*sizeof(float));
	U[i] =(float*) malloc(n*sizeof(float));
	L[i] =(float*) malloc(n*sizeof(float));
	}

	 ///заполнение матрицы А значениями

	 for(i = 0; i < n; i++) 
		{for(j = 0; j < n; j++) 
			{fscanf(opn,"%f",&A[i][j]);
				}
		}

	//вычисление L и U
	for (i = 0; i < n; i++)
            {
		U[0][i] = A[0][i];
                L[i][0] = A[i][0] / U[0][0];
              
		for (j = 0; j < n; j++)
                {

			sum = 0;
			for (k = 0; k <i; k++)
                    	{
                        sum =sum + L[i][k] * U[k][j];
                    	}
                    U[i][j] = A[i][j] - sum;
                    if (i > j)
                    {
                        L[j][i] = 0;
                    }
                    else
                    {
                        sum = 0;
                        for (k = 0; k <i; k++)
                        {
                            sum =sum + L[j][k] * U[k][i];
                        }
                        L[j][i] = (A[j][i] - sum) / U[i][i];
                    }
                }
            }

	 //вывод А
	 printf("Matrica A\n\n");
	 for(i = 0; i < n; i++) {
	 for(j = 0; j < m; j++) {
			printf("%g ",A[i][j]);
		 }
		 printf("\n");
	 }
	 printf("\n");

	 //вывод L
	 printf("Matrica L\n\n");
	 fprintf(wr,"Matrica L\n\n");
	 for(i = 0; i < n; i++) {
	 for(j = 0; j < m; j++) {
			printf("%g ",L[i][j]);
            fprintf(wr,"%g ", L[i][j]);
			
	 }
	 printf("\n");
	 fprintf(wr,"\n");
	 }
	 printf("\n");
	 fprintf(wr,"\n");

	 //вывод U
	 printf("Matrica U\n\n");
	 fprintf(wr,"Matrica U\n\n");
	 for(i = 0; i < n; i++) {
	 for(j = 0; j < m; j++) {
			printf("%g ",U[i][j]);
			fprintf(wr,"%g ", U[j]);
			
	 }
	 printf("\n");
	 fprintf(wr,"\n");
	 }
getch();
fclose(opn);fclose (wr);
	return 0;
}

А этот - с MPI, но как видите, матрицы фиксированного размера

[I]#include "stdafx.h"
#include "mpi.h"
#include <conio.h>
int main(int argc, char **argv )
{
	float A[4][4]={0},L[4][4]={0},U[4][4]={0},l=0;
	
	double time;
	int k=0,i=0,j=0,sz,myrank;
	FILE *opn;
	FILE *wr;

	MPI_Init (&argc, &argv);
	MPI_Comm_rank (MPI_COMM_WORLD, &myrank);
	MPI_Comm_size (MPI_COMM_WORLD, &sz);
	time = MPI_Wtime ();
	
	wr = fopen("output.txt", "w");
	opn = fopen("input.txt", "r");

	 for(i = 0; i < sz; i++) 
		{
			for(j = 0; j < sz; j++) 
			 {
			fscanf(opn,"%f",&A[i][j]);
			U[i][j]=A[i][j];
		}
	}

	i=1;
	for(k=0;k<sz;k++){
	MPI_Scatter(&U, sz, MPI_FLOAT, &U[myrank], sz, MPI_FLOAT, 0, MPI_COMM_WORLD);
	
	l=U[myrank][k]/U[k][k];
	for(j=i;j<sz;j++)
	{
	U[myrank][j]=U[myrank][j] - l*U[k][j];
	}
	MPI_Gather (&l, 1, MPI_FLOAT, &L[k], 1, MPI_FLOAT, 0, MPI_COMM_WORLD);
	MPI_Gather (&U[myrank], sz, MPI_FLOAT, &U, sz, MPI_FLOAT, 0, MPI_COMM_WORLD);
	i++;}
	
	if (myrank==0){
	
	time = MPI_Wtime () - time;
	printf ("Time = %f\n\n", time);
	 //вывод А
	 printf("Matrica A\n\n");
	 fprintf(wr,"Matrica A\n\n");
	 for(i = 0; i < sz; i++) {
		for(j = 0; j < sz; j++) {
				printf("%g ",A[i][j]);
				fprintf(wr,"%g ", A[i][j]);
			}
			printf("\n");
			fprintf(wr,"\n");
	 }
	 printf("\n");
	 fprintf(wr,"\n");
	//Вывод L
	printf("Matrica L\n\n");
	fprintf(wr,"Matrica L\n\n");
	for(i = 0; i < sz; i++) {
		for(j = 0; j < sz; j++) {
			printf("%g ",L[j][i]);
            fprintf(wr,"%g ", L[j][i]);
			
	 }
	 printf("\n");
	 fprintf(wr,"\n");
	 }
	 printf("\n");
	 fprintf(wr,"\n");

	 //вывод U
	 printf("Matrica U\n\n");
	 fprintf(wr,"Matrica U\n\n");
	 for(i = 0; i < sz; i++) {
		 for(j = 0; j < sz; j++) {
			printf("%g ",U[j][i]);
			fprintf(wr,"%g ", U[j][i]);
			
		}
	 printf("\n");
	 fprintf(wr,"\n");
	 }


fclose(opn);
fclose (wr);	}
	
MPI_Finalize();

	return 0;
}
Как сделать и с MPI и динамическим выделением?

Последний раз редактировалось Sazary; 27.11.2009 в 20:19.
kbbudanov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Установка PACX-MPI go321fds Qt и кроссплатформенное программирование С/С++ 0 14.11.2009 15:14
Параллельные вычисления. работа с MPI elpilasgsm Общие вопросы C/C++ 1 27.07.2009 14:54
Проблема компиляции проги с использованием MPI! neo-210 Общие вопросы C/C++ 7 14.07.2009 17:55
Параллельная программа для метода холецкого с помощью openMp и mpi игоревна Помощь студентам 0 06.06.2009 20:47