VM2D  1.12
Vortex methods for 2D flows simulation
Parallel.cpp
Go to the documentation of this file.
1 /*--------------------------------*- VMlib -*----------------*---------------*\
2 | ## ## ## ## ## ## ## | | Version 1.12 |
3 | ## ## ### ### ## ## | VMlib: VM2D/VM3D Library | 2024/01/14 |
4 | ## ## ## # ## ## ## #### | Open Source Code *----------------*
5 | #### ## ## ## ## ## ## | https://www.github.com/vortexmethods/VM2D |
6 | ## ## ## #### ### #### | https://www.github.com/vortexmethods/VM3D |
7 | |
8 | Copyright (C) 2017-2024 Ilia Marchevsky |
9 *-----------------------------------------------------------------------------*
10 | File name: Parallel.cpp |
11 | Info: Source code of VMlib |
12 | |
13 | This file is part of VMlib. |
14 | VMLib is free software: you can redistribute it and/or modify it |
15 | under the terms of the GNU General Public License as published by |
16 | the Free Software Foundation, either version 3 of the License, or |
17 | (at your option) any later version. |
18 | |
19 | VMlib is distributed in the hope that it will be useful, but WITHOUT |
20 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
21 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
22 | for more details. |
23 | |
24 | You should have received a copy of the GNU General Public License |
25 | along with VMlib. If not, see <http://www.gnu.org/licenses/>. |
26 \*---------------------------------------------------------------------------*/
27 
28 
37 #include "Parallel.h"
38 
39 using namespace VMlib;
40 
41 // Распределение задач по процессорам
42 parProp Parallel::SplitMPIone(size_t n, bool bcastAll) const
43 {
44  parProp par;
45 
46  par.totalLen = static_cast<int>(n);
47 
48 #ifdef USE_MPI
49  MPI_Bcast(&par.totalLen, 1, MPI_INT, 0, commWork);
50 #endif
51 
52  if (myidWork == 0)
53  {
54  par.len.clear();
55  par.disp.clear();
56 
57  par.len.push_back(static_cast<int>(n));
58  par.disp.push_back(0);
59 
60  for (int s = 1; s < nProcWork; ++s)
61  {
62  par.len.push_back(0);
63  par.disp.push_back(static_cast<int>(n-1));
64  }
65  }
66 
67 #ifdef USE_MPI
68  MPI_Scatter(par.len.data(), 1, MPI_INT, &par.myLen, 1, MPI_INT, 0, commWork);
69  MPI_Scatter(par.disp.data(), 1, MPI_INT, &par.myDisp, 1, MPI_INT, 0, commWork);
70 #else
71  par.myLen = par.len[0];
72  par.myDisp = par.disp[0];
73 #endif
74 
75 #ifdef USE_MPI
76  if (bcastAll)
77  {
78  if (myidWork != 0)
79  {
80  par.len.resize(nProcWork);
81  par.disp.resize(nProcWork);
82  }
83  MPI_Bcast(par.len.data(), nProcWork, MPI_INT, 0, commWork);
84  MPI_Bcast(par.disp.data(), nProcWork, MPI_INT, 0, commWork);
85  }
86 #endif
87 
88  return par;
89 
90 }//SplitMPIone(...)
91 
92 
93 // Распределение задач по процессорам
94 parProp Parallel::SplitMPI(size_t n, bool bcastAll) const
95 {
96  parProp par;
97 
98  par.totalLen = static_cast<int>(n);
99 
100 #ifdef USE_MPI
101  MPI_Bcast(&par.totalLen, 1, MPI_INT, 0, commWork);
102 #endif
103 
104  if (myidWork == 0)
105  {
106  par.len.clear();
107  par.disp.clear();
108 
109  int nPerP = static_cast<int>(n / nProcWork);
110 
111  for (int s = 0; s < nProcWork - 1; ++s)
112  {
113  par.len.push_back(nPerP);
114  par.disp.push_back(s*nPerP);
115  }
116 
117  par.len.push_back(static_cast<int>(n) - nPerP * (nProcWork - 1));
118  par.disp.push_back(nPerP * (nProcWork - 1));
119  }
120 
121 #ifdef USE_MPI
122  MPI_Scatter(par.len.data(), 1, MPI_INT, &par.myLen, 1, MPI_INT, 0, commWork);
123  MPI_Scatter(par.disp.data(), 1, MPI_INT, &par.myDisp, 1, MPI_INT, 0, commWork);
124 #else
125  par.myLen = par.len[0];
126  par.myDisp = par.disp[0];
127 #endif
128 
129 #ifdef USE_MPI
130  if (bcastAll)
131  {
132  if (myidWork != 0)
133  {
134  par.len.resize(nProcWork);
135  par.disp.resize(nProcWork);
136  }
137  MPI_Bcast(par.len.data(), nProcWork, MPI_INT, 0, commWork);
138  MPI_Bcast(par.disp.data(), nProcWork, MPI_INT, 0, commWork);
139  }
140 #endif
141 
142  return par;
143 
144 }//SplitMPI(...)
145 
146 
int totalLen
Общее число витков, разделенное между всеми процессорами
Definition: Parallel.h:69
int myDisp
Индекс первого витка из числа витков, предназначенных текущему процессору
Definition: Parallel.h:66
int myidWork
Локальный номер процессора, решающего конкретную задачу
Definition: Parallel.h:94
std::vector< int > len
Список из чисел витков циклов, предназначенных для каждого процессора
Definition: Parallel.h:57
parProp SplitMPIone(size_t n, bool bcastAll=false) const
Распределение задач по процессорам
Definition: Parallel.cpp:42
int commWork
Коммуникатор для решения конкретной задачи
Definition: Parallel.h:90
int myLen
Число витков, предназначенное текущему процессору
Definition: Parallel.h:63
Заголовочный файл с описанием класса Parallel и структуры parProp.
std::vector< int > disp
Список, определяющий номер витка цикла, с которого должен начинать работу данный процессор ...
Definition: Parallel.h:60
Стрктура, содержащая параметры исполнения задачи в параллельном MPI-режиме
Definition: Parallel.h:54
parProp SplitMPI(size_t n, bool bcastAll=false) const
Распределение задач по процессорам
Definition: Parallel.cpp:94
int nProcWork
Число процессоров, решающих конкретную задачу
Definition: Parallel.h:97