
Лаб. 7 ТПП
.docxЛабораторная работа №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;
}