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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2016, 21:35   #1
lokzzor
Новичок
Джуниор
 
Регистрация: 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.
lokzzor вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна помощь с F# Demon_prog Помощь студентам 4 07.06.2014 20:07
Очень нужна помощь c матрицами, макросами в Excel. Заранее благодарен(поверьте, очень-очень нужна помощь) Farridjan Помощь студентам 1 03.07.2009 12:24
Очень нужна помощь с написанием программы... срочно(буду благодарен за помощь) 5Paladin5 Помощь студентам 3 02.07.2009 09:12