Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб. 7 ТПП

.docx
Скачиваний:
1
Добавлен:
29.12.2024
Размер:
114.01 Кб
Скачать

Лабораторная работа №7

Передача и прием сообщений в MPI

Цель: изучить основные принципы приема и передачи сообщений в технологии MPI на примере использования в рамках языка С++.

Задание:

#include <stdio.h>

#include <stdlib.h>

#include <mpi.h>

#include <time.h>

#include <wchar.h>

#include <locale.h>

#include <Windows.h>

#define TAG 0

#define COUNT_LIMIT 10

//chcp 65001

//mpiexec .\TPP_LAB_7.exe

long long get_milliseconds() {

LARGE_INTEGER frequency, counter;

QueryPerformanceFrequency(&frequency); // Частоту таймера

QueryPerformanceCounter(&counter); // Текущее значение таймера

return (counter.QuadPart * 1000) / frequency.QuadPart; // Перевод в миллисекунды

}

int main(int argc, char** argv) {

int rank, size;

int counter = 0;

int message;

bool flag = true;

setlocale(LC_ALL, "ru_RU.UTF-8");

MPI_Init(&argc, &argv);

MPI_Comm_rank(MPI_COMM_WORLD, &rank);

MPI_Comm_size(MPI_COMM_WORLD, &size);

while (flag) {

// Процесс-счётчик

if (rank == 0) {

MPI_Recv(&message, 1, MPI_INT, MPI_ANY_SOURCE, TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

if (message == -1) {

wprintf(L"Получено сообщение: %d. Текущее значение счётчика: %d\n", message, counter);

fflush(stdout);

wprintf(L"Счётчик завершает работу со значением: %d\n", counter);

fflush(stdout);

flag = false;

//break;

}

else {

counter++;

wprintf(L"Получено сообщение: %d. Текущее значение счётчика: %d\n", message, counter);

fflush(stdout);

}

for (int i = 1; i < size; i++) {

MPI_Send(&flag, 1, MPI_INT, i, TAG, MPI_COMM_WORLD);

}

}

else {

srand(get_milliseconds() + rank);

message = rand() % 22 - 1;

MPI_Send(&message, 1, MPI_INT, 0, TAG, MPI_COMM_WORLD);

//wprintf(L"Процесс: %d отправил: %d\n", rank, message);

//fflush(stdout);

MPI_Recv(&flag, 1, MPI_INT, 0, TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

//MPI_Irecv(&message, 1, MPI_INT, 0, TAG, MPI_COMM_WORLD, &request);

Sleep(5);

//wprintf(L"Время %llu номер %d\n", get_milliseconds(), rank);

if (!flag) {

wprintf(L"Отправитель %d завершает работу\n", rank);

break;

}

}

}

MPI_Finalize();

return 0;

}

Соседние файлы в предмете Технологии параллельного программирования