VM2D 1.14
Vortex methods for 2D flows simulation
Loading...
Searching...
No Matches
VMlib::Parallel Class Reference

#include <Parallel.h>

Public Member Functions

parProp SplitMPIone (size_t n, bool bcastAll=false) const
 Распределение задач по процессорам
 
parProp SplitMPI (size_t n, bool bcastAll=false) const
 Распределение задач по процессорам
 

Public Attributes

int commWork
 Коммуникатор для решения конкретной задачи
 
int myidWork
 Локальный номер процессора, решающего конкретную задачу
 
int nProcWork
 Число процессоров, решающих конкретную задачу
 

Detailed Description

\brief Класс, опеделяющий параметры исполнения задачи в параллельном MPI-режиме

\author Марчевский Илья Константинович
\author Сокол Ксения Сергеевна
\author Рятина Евгения Павловна
Author
Колганова Александра Олеговна \Version 1.14
Date
6 марта 2026 г.

Definition at line 86 of file Parallel.h.

Member Function Documentation

◆ SplitMPI()

parProp Parallel::SplitMPI ( size_t  n,
bool  bcastAll = false 
) const

Распределение задач по процессорам

Parameters
[in]nчисло распределяемых витков цикла
[in]bcastAllпризнак рассылки всей информации всем процессорам (по умолчанию false)
Returns
структуру типа parProp, заполненную для текущего процессора

Definition at line 97 of file Parallel.cpp.

98{
99 parProp par;
100
101 par.totalLen = static_cast<int>(n);
102
103#ifdef USE_MPI
104 MPI_Bcast(&par.totalLen, 1, MPI_INT, 0, commWork);
105#endif
106
107 if (myidWork == 0)
108 {
109 par.len.clear();
110 par.disp.clear();
111
112 int nPerP = static_cast<int>(n / nProcWork);
113
114 for (int s = 0; s < nProcWork - 1; ++s)
115 {
116 par.len.push_back(nPerP);
117 par.disp.push_back(s*nPerP);
118 }
119
120 par.len.push_back(static_cast<int>(n) - nPerP * (nProcWork - 1));
121 par.disp.push_back(nPerP * (nProcWork - 1));
122 }
123
124#ifdef USE_MPI
125 MPI_Scatter(par.len.data(), 1, MPI_INT, &par.myLen, 1, MPI_INT, 0, commWork);
126 MPI_Scatter(par.disp.data(), 1, MPI_INT, &par.myDisp, 1, MPI_INT, 0, commWork);
127#else
128 par.myLen = par.len[0];
129 par.myDisp = par.disp[0];
130#endif
131
132#ifdef USE_MPI
133 if (bcastAll)
134 {
135 if (myidWork != 0)
136 {
137 par.len.resize(nProcWork);
138 par.disp.resize(nProcWork);
139 }
140 MPI_Bcast(par.len.data(), nProcWork, MPI_INT, 0, commWork);
141 MPI_Bcast(par.disp.data(), nProcWork, MPI_INT, 0, commWork);
142 }
143#endif
144
145 return par;
146
147}//SplitMPI(...)
int nProcWork
Число процессоров, решающих конкретную задачу
Definition Parallel.h:100
int myidWork
Локальный номер процессора, решающего конкретную задачу
Definition Parallel.h:97
int commWork
Коммуникатор для решения конкретной задачи
Definition Parallel.h:93
Стрктура, содержащая параметры исполнения задачи в параллельном MPI-режиме
Definition Parallel.h:58
int myLen
Число витков, предназначенное текущему процессору
Definition Parallel.h:66
std::vector< int > disp
Список, определяющий номер витка цикла, с которого должен начинать работу данный процессор
Definition Parallel.h:63
std::vector< int > len
Список из чисел витков циклов, предназначенных для каждого процессора
Definition Parallel.h:60
int myDisp
Индекс первого витка из числа витков, предназначенных текущему процессору
Definition Parallel.h:69
int totalLen
Общее число витков, разделенное между всеми процессорами
Definition Parallel.h:72

◆ SplitMPIone()

parProp Parallel::SplitMPIone ( size_t  n,
bool  bcastAll = false 
) const

Распределение задач по процессорам

Parameters
[in]nчисло распределяемых витков цикла
[in]bcastAllпризнак рассылки всей информации всем процессорам (по умолчанию false)
Returns
структуру типа parProp, заполненную для текущего процессора

Definition at line 45 of file Parallel.cpp.

46{
47 parProp par;
48
49 par.totalLen = static_cast<int>(n);
50
51#ifdef USE_MPI
52 MPI_Bcast(&par.totalLen, 1, MPI_INT, 0, commWork);
53#endif
54
55 if (myidWork == 0)
56 {
57 par.len.clear();
58 par.disp.clear();
59
60 par.len.push_back(static_cast<int>(n));
61 par.disp.push_back(0);
62
63 for (int s = 1; s < nProcWork; ++s)
64 {
65 par.len.push_back(0);
66 par.disp.push_back(static_cast<int>(n-1));
67 }
68 }
69
70#ifdef USE_MPI
71 MPI_Scatter(par.len.data(), 1, MPI_INT, &par.myLen, 1, MPI_INT, 0, commWork);
72 MPI_Scatter(par.disp.data(), 1, MPI_INT, &par.myDisp, 1, MPI_INT, 0, commWork);
73#else
74 par.myLen = par.len[0];
75 par.myDisp = par.disp[0];
76#endif
77
78#ifdef USE_MPI
79 if (bcastAll)
80 {
81 if (myidWork != 0)
82 {
83 par.len.resize(nProcWork);
84 par.disp.resize(nProcWork);
85 }
86 MPI_Bcast(par.len.data(), nProcWork, MPI_INT, 0, commWork);
87 MPI_Bcast(par.disp.data(), nProcWork, MPI_INT, 0, commWork);
88 }
89#endif
90
91 return par;
92
93}//SplitMPIone(...)

Member Data Documentation

◆ commWork

int VMlib::Parallel::commWork

Коммуникатор для решения конкретной задачи

Definition at line 93 of file Parallel.h.

◆ myidWork

int VMlib::Parallel::myidWork

Локальный номер процессора, решающего конкретную задачу

Definition at line 97 of file Parallel.h.

◆ nProcWork

int VMlib::Parallel::nProcWork

Число процессоров, решающих конкретную задачу

Definition at line 100 of file Parallel.h.


The documentation for this class was generated from the following files: