Помогите с Mpi,плз!

  • Автор темы Kirill
  • Дата начала
K

Kirill

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

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

A = (int**)malloc(n*sizeof(int*));
for(i = 0; i < n; i++) {
A =(int*) malloc(n*sizeof(int));}

Соответственно, получается массив n*n типа float.
Как сделать то же самое в MPI?

Ниже 2 варианта кода.

Этот вариант - последовательная реализация нужной программы, но зато с динамическим выделением памяти.
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Без MPI, но с malloc</div></div><div class="sp-body"><div class="sp-content">#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 =(float*) malloc(n*sizeof(float));
U =(float*) malloc(n*sizeof(float));
L =(float*) malloc(n*sizeof(float));
}

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

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

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

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

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

//вывод А
printf("Matrica A\n\n");
for(i = 0; i < n; i++) {
for(j = 0; j < m; j++) {
printf("%g ",A[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[j]);
fprintf(wr,"%g ", L[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[j]);
fprintf(wr,"%g ", U[j]);

}
printf("\n");
fprintf(wr,"\n");
}
getch();
fclose(opn);fclose (wr);
return 0;
}

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

<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">MPI без malloc</div></div><div class="sp-body"><div class="sp-content">#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[j]);
U[j]=A[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[j]);
fprintf(wr,"%g ", A[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]);
fprintf(wr,"%g ", L[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 < sz; i++) {
for(j = 0; j < sz; j++) {
printf("%g ",U[j]);
fprintf(wr,"%g ", U[j]);

}
printf("\n");
fprintf(wr,"\n");
}


fclose(opn);
fclose (wr); }

MPI_Finalize();

return 0;
}

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