Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






MPI_Status Status;





MPI_Init(&argc, &argv);

MPI_Comm_size(MPI_COMM_WORLD, &proc_count);

MPI_Comm_rank(MPI_COMM_WORLD, &proc_rank);

//===================================================================

if ((proc_rank==0) && (proc_count>1)) // Если это "главный" процесс

{ // и процессов минимум два

int n; // Размер массива (изначально неизвестен)

cout << "Input n: ";

cin >> n; // Вводим с клавиатуры размер массива

// Заводим массив на n элементов и заполняем его случайными числами:

int *mas; // Указатель на массив типа int

mas = new int [n]; // Выделяем память под массив (без проверки)

for (int i=0; i<n; i++) // и заполняем случайными числами от 0 до 10

mas[i]=rand()%11;

// Распараллелим поиск суммы ровно на два процесса.

// Даже если доступных процессорных ядер будет больше,

// они не будут использоваться. Ровно два процесса:

// текущий процесс с рангом 0 и процесс с рангом 1.

// Поскольку процесс 1 не знает о размере массива, он

// не может знать, какой объем сообщения ему принимать.

// Поэтому мы сначала передадим процессу 1 число, равное

// размеру массива. Так процесс 1 сможет подготовить

// память под принимаемый массив.

MPI_Send (&n, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);

// Теперь отсылаем первую половину массива процессу 1

MPI_Send (mas, n/2, MPI_INT, 1, 0, MPI_COMM_WORLD);

// Пока процесс 1 обрабатывает первую половину массива,

// делаем пока свою часть работы: ищем сумму элементов

// оставшейся части массива

int S=0;

for (int i=n/2; i<n; i++)

S=S+mas[i];

// Готовимся получать результат работы процесса 1.

// Результатом будет одно число типа int.

int S1; // Место под результат

// Ждем сообщение от процесса 1

MPI_Recv (&S1, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &Status);

S=S+S1; // Складываем обе суммы

cout << "S = " << S << endl;

delete [] mas; // Освобождаем память, выделенную под массив

} // if - процесс 0

//===================================================================

if (proc_rank==1) // Если это процесс с номером 1

{

int size; // Размер принимаемого массива

int Summa; // Сумма его элементов

// Готовимся принять размер массива

// Ждем сообщение от процесса 0

MPI_Recv (&size, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &Status);

size=size/2; // Мы получили размер всего массива,

// но принимать будем только половину

// Динамически выделяем память под принимаемый массив

int *ptr = new int [size];

// Готовимся принять массив данных

// Ждем сообщение от процесса 0

MPI_Recv (ptr, size, MPI_INT, 0, 0, MPI_COMM_WORLD, &Status);

// Ищем сумму элементов массива

Summa=0;

for (int i=0; i<size; i++)

Summa+=ptr[i];

// Отсылаем ответ процессу 0

MPI_Send (&Summa, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);

delete [] ptr; // Освобождаем память

} // if - процесс 1

//===================================================================

Date: 2016-02-19; view: 329; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.006 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию