Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "pch.h"
- #include <mpi.h>
- #include <stdio.h>
- #include <iostream>
- #include <math.h>
- #define MPI_ROOT_PROC (0) // id управл¤ющего узла
- //#define LAB_DEBUG
- const float interval_a = 0.1; // нижн¤¤ граница интервала
- const float interval_b = 0.5; // верхн¤¤ граница интервала
- const int cycle_count = 100; // количество циклов вычислени¤ дл¤ получени¤ результатов
- using namespace std;
- float function(float x) {
- return fabs(cos(x));
- }
- int main(int argc, char *argv[]) {
- char host_name[MPI_MAX_PROCESSOR_NAME]; // название хоста, на котором выполн¤ет процесс
- int host_name_lenght = 0; // длина названи¤ хоста
- int group_size = 0; // размер группы (кол-во процессов в этой группе)
- int cur_id = MPI_PROC_NULL; // id текущего процесса
- MPI_Init(&argc, &argv); // инициализируем mpi-программу
- MPI_Comm_size(MPI_COMM_WORLD, &group_size); // получаем количество процессов в группе
- MPI_Comm_rank(MPI_COMM_WORLD, &cur_id); // получаем индекс текущего процесса
- MPI_Get_processor_name(host_name, &host_name_lenght); // получаем им¤ текущего хоста
- if (cur_id == MPI_PROC_NULL) { // если id текущего процесса неопределн выходим
- std::cout << host_name << " not initialized. Process id is MPI_PROC_NULL\n";
- MPI_Finalize();
- return 0;
- }
- else {
- std::cout << "Process id: " << cur_id << ". Host name: " << host_name << "\n";
- #ifdef LAB_DEBUG
- std::cout << "Group size: " << group_size << "\n";
- #endif
- }
- int task_size = 100; // начальный размер задачи
- for (int i = 0; i < 5; ++i) {
- float global_result = 0; // глобальный результат дл¤ всех процессов (к нему обращаемс¤ только из управл¤ющего узла)
- MPI_Bcast(&task_size, 1, MPI_INT, MPI_ROOT_PROC, MPI_COMM_WORLD); // делаем шир. вещ. сообщение всем процессам
- int local_task_size = (float)task_size / group_size; // вычисл¤ем локальный размер задачи
- int task_start = cur_id * local_task_size;
- int task_end = (cur_id + 1)*local_task_size;
- float local_result = 0; // локальный результат дл¤ текущего процесса
- float step = (interval_b - interval_a) / task_size;
- #ifdef LAB_DEBUG
- std::cout << "Process id: " << cur_id << " start = " << task_start << " end = " << task_end << "\n";
- #endif
- double start_time = MPI_Wtime();
- for (int cycle_ind = 0; cycle_ind < cycle_count; ++cycle_ind) {
- for (int i = task_start; i < task_end; ++i) {
- local_result += function(i * step)*step;
- }
- }
- double end_time = MPI_Wtime();
- double total_time = (end_time - start_time) / cycle_count * 1000000;
- #ifdef LAB_DEBUG
- std::cout << "Reduce local result from process id: " << cur_id << "\n";
- #endif
- MPI_Reduce(&local_result, &global_result, 1, MPI_DOUBLE, MPI_SUM, MPI_ROOT_PROC, MPI_COMM_WORLD);
- if (cur_id == MPI_ROOT_PROC) {
- std::cout << "For task size: " << task_size << " result is " << global_result << ". Time is " << total_time;
- if (total_time < 100) printf(" %3.2f\n", total_time);
- else printf(" %d\n", (int)total_time);
- }
- task_size *= 10;
- }
- MPI_Finalize();
- std::cout << "Thank you for wating. This program finished";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement