Новичок
Джуниор
Регистрация: 14.12.2016
Сообщений: 1
|
Нужна помощь с mpi)
В общем была программа с использованием shmem,дали задание переписать под mpi используя MPI_Bsend.
Программа вроде как работает но вот не правильно,при использовании на нескольких процессорах выделяет разное кол-во памяти.
Код:
#include <stdlib.h>
#include <string.h>
#include "dimension.h"
#include<iostream>
#include<mpi.h>
#define FILENAME "foutput_cpu.dat"
static MPI_Status st;
static MPI_Request rq;
#define NITER 5000
#define STEPITER 1000
#define BUFSIZE 2000
#define delx 0.5
#define dely 0.25
int main(int argc, char **argv)
{
int i, j, n, mx1, mx2, my1, my_number, n_of_nodes, totalmx, partmx, leftmx, mx, my;
FILE *fp;
int buf[BUFSIZE];
double howlong;
double rdx2, rdy2, beta;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_number);
MPI_Comm_size(MPI_COMM_WORLD, &n_of_nodes);
if (argc != 3)
{
if (!my_number)
fprintf(stderr, "Usage: %s <nrows> <ncolumns>\n", argv[0]);
return (-1);
}
totalmx = mx = (int)atol(argv[1]);
my = (int)atol(argv[2]);
if (my<1)
{
if (!my_number)
fprintf(stderr, "Number of columns (%d) should be positive\n", my);
return (-1);
}
mx = (totalmx + n_of_nodes - 1) / n_of_nodes;
partmx = mx;
leftmx = totalmx - partmx*(n_of_nodes - 1);
if (leftmx<1)
{
if (!my_number)
fprintf(stderr, "Cannot distribute, too many processors\n");
return(-1);
}
if (my_number == (n_of_nodes - 1)) mx = leftmx;
partmx += 2;
mx += 2;
my += 2;
//std::cout<<mx<<" "<<my<<std::endl;
{
char buf[2 * my*sizeof(double)];
DIM2(double, f, my);
DIM2(double, newf, my);
DIM2(double, r, my);
typeof(f) pf[2];
int curf;
MPI_Buffer_attach(buf, 2 * my*sizeof(double));
f = (typeof(f))malloc(2 * partmx*sizeof(*f));
r = (typeof(r))malloc(mx*sizeof(*r));
if ((!f) || (!r))
{
fprintf(stderr, "Cannot allocate, exiting\n");
exit(-1);
}
curf = 0;
pf[0] = f;
pf[1] = f + partmx;
newf = pf[1];
rdx2 = 1. / delx / delx;
rdy2 = 1. / dely / dely;
beta = 1.0 / (2.0*(rdx2 + rdy2));
if (!my_number)
{
printf("Solving heat conduction task on %d by %d grid by %d processors\n", totalmx, my - 2, n_of_nodes);
}
fflush(stdout);
for (i = 0; i < mx; i++)
{
for (j = 0; j < my; j++)
{
if ((((i == 0) && (my_number == 0)) || (j == 0)) || ((i == (mx - 1)) && (my_number == (n_of_nodes - 1))) || (j == (my - 1)))
newf[i][j] = f[i][j] = 1;
else
newf[i][j] = f[i][j] = 0;
r[i][j] = 0;
}
}
mx1 = mx - 1;
my1 = my - 1;
MPI_Barrier(MPI_COMM_WORLD);
howlong = MPI_Wtime();
for (n = 0; n < NITER; n++)
{
if (!my_number)
{
if (!(n%STEPITER))
printf("Iteration %d\n", n);
}
f = pf[curf];
newf = pf[1 - curf];
for (i = 1; i < mx1; i++)
{
for (j = 1; j < my1; j++)
{
newf[i][j] = ((f[i - 1][j] + f[i + 1][j])*rdx2 + f[i][j - 1] + f[i][j + 1] * rdy2 - r[i][j])*beta;
}
}
if (my_number>0)
MPI_Bsend(&(newf[1][1]), my - 2, MPI_DOUBLE, my_number - 1, 500, MPI_COMM_WORLD);
//std::cout<<mx<<" "<<my<<std::endl;
if (my_number<(n_of_nodes - 1))
MPI_Bsend(&(newf[mx - 2][1]), my - 2, MPI_DOUBLE, my_number + 1, 500, MPI_COMM_WORLD);
//std::cout<<mx<<" "<<my<<std::endl;
if (my_number>0)
MPI_Recv(&(newf[0][1]), my - 2, MPI_DOUBLE, my_number - 1, MPI_ANY_TAG, MPI_COMM_WORLD, &st);
//std::cout<<mx<<" "<<my<<std::endl;
if (my_number<(n_of_nodes - 1))
MPI_Recv(&(newf[partmx - 1][1]), my - 2, MPI_DOUBLE, my_number + 1, 500, MPI_COMM_WORLD, &st);
//std::cout<<mx<<" "<<my<<std::endl;
curf = 1 - curf;
}
if (!my_number)
{
printf("Elasped time: %f sec\n", (float)(MPI_Wtime() - howlong));
fp = fopen(FILENAME, "w");
fclose(fp);
}
for (j = 0; j<n_of_nodes; j++)
{
if (j == my_number)
{
fp = fopen(FILENAME, "a");
for (i = 1; i<(mx - 1); i++)
{
fwrite(&(newf[i][1]), my - 2, sizeof(newf[0][0]), fp);
}
fclose(fp);
}
}
}
MPI_Finalize();
}
Пожалуйста, оформляйте Ваш код согласно правилам.
Последний раз редактировалось Вадим Мошев; 14.12.2016 в 21:46.
|