ircodouble/Calc — Issue #1: вычисление точек квадратов (параллельные процессы)
Author: ircodouble
Created: 2011-10-29 07:24:16+00:00
State: open

#include
#include	// For ceil (округляет вверх) & floor (округляет вниз)
#include	// For cout, cin, endl
using namespace std;	// For cout, cin, endl

// Структура представляет тип данных точка
struct Point{
float x;
float y;
};

void main(int argc,char *argv[])
{
MPI_Init(&argc, &argv);
// Колличество параллельных процессов, номер процесса
int size, rank;
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

// Расстояние между соседними точками, колличество точек в ребре квадрата
float between, edge;
Point* pMasPoint = 0;	// Указатель на результирующий массив точек (хранит адрес начала массива)
float timeStart = 0.0;	// Для хранения времени начала работы программы
int masSize = 0;	// Для правильного заполнения массива в процессах

if(rank==0)
{
FILE *fo;	// Указатель на файл в буфере (хранит адрес)
// Пожалуйста, введите расстояние мажду парой точек:
cout<<"Please, enter a distance between a pair of points: ";
cin>>between;	// Ввод
// Пожалуйста, введите ребро квадрата:
cout<>edge;	// Ввод
cout<(ceil((((edge*edge)-1)/size)));
pMasPoint = new Point[edge*edge];	// Создаём массив точек

// Определяем первую точку (0,0)
pMasPoint[0].x = pMasPoint[0].y = 0.0;
}

// Разослать исходные данные по процессам (расстояние м\ду точками и кол-во точек в ребре)
MPI_Bcast(&between,1,MPI_INT,0,MPI_COMM_WORLD);
MPI_Bcast(&edge,1,MPI_INT,0,MPI_COMM_WORLD);
if(rank!=0)
masSize = static_cast(ceil((((edge*edge)-1)/size)));
int dif = static_cast(size - ((masSize*size) - ((edge*edge)-1)));

if(rank!=0)	// Вычисления для подсчета размера массива
{
if(rank>=dif) masSize--;	// в процессах кроме нулевого
pMasPoint = new Point[masSize];	// Создаём массив точек
}

// Рассчитать свою часть точек
float numProc = static_cast(rank) + 1.0;
int i=0, stop=masSize;
if(rank==0)
{
i=1;stop++;
}
for(i;i