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

Лаб. 9 ТПП

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

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

Обобщенная передача данных

Цель: изучить основные принципы обобщенной передачи данных в технологии 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; // Перевод в миллисекунды

}

void lab7(int rank, int size) {

int counter = 0;

int message;

bool flag = true;

clock_t start_time = clock();

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);

//fflush(stdout);

break;

}

}

}

clock_t end_time = clock();

if (rank == 0) {

double result = ((double)(end_time - start_time)) / CLOCKS_PER_SEC;

wprintf(L"ЛР 7\n");

wprintf(L"Время выполнения программы: %f секунд\n", result);

}

}

void lab8(int rank, int size) {

int counter = 0;

int message;

bool flag = true;

clock_t start_time = clock();

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);

}*/

//Sleep(5000);

MPI_Bcast(&flag, 1, MPI_INT, 0, 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_Bcast(&flag, 1, MPI_INT, 0, MPI_COMM_WORLD);

Sleep(5);

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

if (!flag) {

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

//fflush(stdout);

break;

}

}

}

clock_t end_time = clock();

if (rank == 0) {

double result = ((double)(end_time - start_time)) / CLOCKS_PER_SEC;

wprintf(L"ЛР 8\n");

wprintf(L"Время выполнения программы: %f секунд\n", result);

}

}

void lab9(int rank, int size) {

int message = 0;

int counter = 0;

int* messages;

bool flag = true;

clock_t start_time = clock();

while (flag) {

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

if (rank == 0) {

messages = (int*)malloc((size) * sizeof(int));

MPI_Gather(&message, 1, MPI_INT, messages, 1, MPI_INT, 0, MPI_COMM_WORLD);

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

if (flag) {

if (messages[i] == -1) {

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

//fflush(stdout);

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

//fflush(stdout);

flag = false;

}

else {

counter++;

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

//fflush(stdout);

}

}

}

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

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

}*/

MPI_Bcast(&flag, 1, MPI_INT, 0, MPI_COMM_WORLD);

free(messages);

}

else {

srand(get_milliseconds() + rank);

message = rand() % 22 - 1;

MPI_Gather(&message, 1, MPI_INT, NULL, 1, MPI_INT, 0, MPI_COMM_WORLD);

MPI_Bcast(&flag, 1, MPI_INT, 0, MPI_COMM_WORLD);

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

Sleep(5);

if (!flag) {

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

break;

}

}

}

clock_t end_time = clock();

if (rank == 0) {

double result = ((double)(end_time - start_time)) / CLOCKS_PER_SEC;

wprintf(L"ЛР 9\n");

wprintf(L"Время выполнения программы: %f секунд\n", result);

}

}

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

int rank, size;

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);

lab7(rank, size);

lab8(rank, size);

lab9(rank, size);

MPI_Finalize();

return 0;

}

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