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

Тема в разделе "Общие вопросы по С и С++", создана пользователем Kirill, 25 ноя 2009.

  1. Kirill

    Kirill Гость

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

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


    Соответственно, получается массив 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[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, но как видите, [b]матрицы фиксированного размера[/b]

    <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[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]);

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


    fclose(opn);
    fclose (wr); }

    MPI_Finalize();

    return 0;
    }

    [b]Как сделать и с MPI и динамическим выделением? [/b][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
     
Загрузка...

Поделиться этой страницей