-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathREADME
353 lines (262 loc) · 13.6 KB
/
README
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
# Getting Started guide {#gettingstartedmpc}
Introduction
------------
This Getting Started guide details the various ways to install and configure the
MPC library (Multi-Processor Computing) version including MPI `@MPI_VERSION@`,
OpenMP `@OMP_VERSION@` (with patched GCC) and PThread support. For further
information on MPC internals, the reader may refer to
[documentation](http://mpc.paratools.com/Documentation) for more details about
the MPC framework and its execution model.
Prerequisites
-------------
The following prerequisites are required to compile MPC:
* The main archive file from the [Downloads page](http://mpc.paratools.com/Download)
* A **C** compiler (e.g., `gcc`)
* An optional **Fortran** compiler if Fortran applications are to be used
(e.g., `g77` or `gfortran`)
* Optional *SLURM*, *HWLOC* and *OPENPA* libraries installed
* For *Infiniband* support *libibverbs* is required
Standard Installation
---------------------
1. Unpack the main archive (tar format) and go to the top-level directory:
$ tar xfz MPC_@MPC_VERSION@.tar.gz
$ cd MPC_@MPC_VERSION@
2. If your tar program does not accept the ’z’ option, use the following
commands:
$ gunzip MPC_@MPC_VERSION@.tar.gz
$ tar xf MPC_@MPC_VERSION@.tar
$ cd MPC_@MPC_VERSION@
3. Choose an installation directory. Using the default `/usr/local/` will
overwrite legacy headers. The most convenient choice is a directory shared
among all the machines you want to use the library on. If such a directory is
not accessible, you will have to deploy MPC on every machine after the
installation.
$ mkdir $HOME/mpc-install
4. Launch the installation script for MPC and its dependencies. Specifying the
installation directory:
$ ./installmpc --prefix=$HOME/mpc-install
**Note**: you can use the flag `-jX` to perform a faster installation. `X`
should be a number and is the total amount of processes launched by *Make*.
5. Source the *mpcvars* script (located at the root of the MPC installation
directory) to update environment variables (e.g., *PATH* and
*LD\_LIBRARY\_PATH*).
For *csh* and *tcsh*:
$ source $(HOME)/mpc-install/mpcvars.csh
For *bash* and *sh*:
$ source $(HOME)/mpc-install/mpcvars.sh
Check that everything went well at this point by running
$ which mpc_cc
$ which mpcrun
If there was no errors, it should display the path of the mpc\_cc and mpcrun
scripts.
6. To compile your first MPC program, you may execute the mpc\_cc compiler:
$ mpc_cc hello_world.c -o hello_world
This command uses the main default patched *GCC* to compile the code. If you
want to use your favorite compiler instead (loosing some features like OpenMP
support and global-variable removal), you may use the *mpc\_cflags* and
*mpc\_ldflags* commands:
$ ${CC} hello_world.c -o hello_world `mpc_cflags` `mpc_ldflags`
7. To execute your MPC program, use the mpcrun command:
$ mpcrun -m=ethread -p=1 -n=4 hello_world
$ mpcrun -m=ethread_mxn -p=1 -n=4 hello_world
$ mpcrun -m=pthread -p=1 -n=4 hello_world
Standard MPI Compilers
-----------------------
MPC does provide standard MPI compilers such as mpicc mpicxx mpif77. These compiler will
call MPC but won't privarize by default (process-mode). If you'd like to port an exisiting
build system relying on mpicc you may `export MPI_PRIV=1` which will turn on privatization
in these wrappers.
For example:
$ MPI_PRIV=1 mpicc hello.c -o hello
# Will be strictly equivalent to
$ mpc_cc hello.c -o hello.c
Custom Installation
-------------------
The previous section described the default installation and configuration of
MPC, but other alternatives are available. You can find out more details on the
configuration by running: ./configure --help.
Specify the PMI based launcher to be used by MPC as follows:
* `--with-hydra``: Compile MPC with the **Hydra** launcher (embedded in the MPC
distribution). This option is enabled by default.
* `--with-slurm[=prefix]` Compile MPC with the **SLURM** launcher.
Specify external libraries used by MPC:
* `--with-hwloc=prefix`: Specify the prefix of hwloc library
* `--with-openpa=prefix`: Specify the prefix of OpenPA library
* `--with-mpc-binutils=prefix`: Specify the prefix of the binutils
Specify external libraries for gcc compilation:
* `--with-gmp=prefix`: Specify the prefix of gmp library
* `--with-mpfr=prefix`: Specify the prefix of mpfr library
* `--with-mpc=prefix`: Specify the prefix of mpc multiprecision library
Specify external gcc and gdb:
* `--with-mpc-gcc=prefix`: Specify the prefix of the gcc used by MPC
* `--with-mpc-gdb=prefix`: Specify the prefix of the gdb used by MPC
Running MPC
-----------
The mpcrun script drives the launch of MPC programs with different types of
parallelism. Its usage is defined as follows:
Usage mpcrun [option] [--] binary [user args]
Launch Configuration:
-N=n,--node-nb=n Total number of nodes
-p=n, --process-nb=n Total number of UNIX processes
-n=n, --task-nb=n Total number of tasks
-c=n, --cpu-nb=n Number of cpus per UNIX process
--cpu-nb-mpc=n Number of cpus per process for the MPC process
--enable-smt Enable SMT capabilities (disabled by default)
Multithreading:
-m=n, --multithreading=n Define multithreading mode
modes: pthread ethread_mxn
Network:
-net=n, --net=, --network=n Define Network mode (TCP + SHM by default)
Configured CLI switches for network configurations:
- ib:
* Rail 0: shm_mpi
* Rail 1: ib_mpi
- opa:
* Rail 0: shm_mpi
* Rail 1: opa_mpi
- tcponly:
* Rail 0: tcp_mpi
- tcp:
* Rail 0: shm_mpi
* Rail 1: tcp_mpi
- multirail_tcp:
* Rail 0: shm_mpi
* Rail 1: tcp_large
- portals:
* Rail 0: portals_mpi
- shm:
* Rail 0: shm_mpi
- default:
* Rail 0: shm_mpi
* Rail 1: ib_mpi
Launcher:
-l=n, --launcher=n Define launcher
--opt=<options> Launcher specific options
--launchlist Print available launch methods
--config=<file> Configuration file to load.
--profiles=<p1,p2> List of profiles to enable in config.
Informations:
-h, --help Display this help
--show Display command line
-v,-vv,-vvv,--verbose=n Verbose mode (level 1 to 3)
--verbose Verbose level 1
--graphic-placement Output a xml file to visualize thread
placement and topology for each compute node
--text-placement Output a txt file to visualize thread placement and
their infos on the topology for each compute node
Debugger:
--dbg=<debugger_name> to use a debugger
Launcher options
----------------
Options passed to the launcher options should be compatible with the launch mode
chosen during *configure*. For more information you might read the
documentations of mpiexec and srun respectively for Hydra and Slurm.
* `Hydra`: If MPC is configured with Hydra, mpcrun should be used with
`-l=mpiexec` argument. Note that this argument is used by default if not
specified.
* `SLURM`: If MPC is configured with SLURM, mpcrun should be used with `-l=srun`
argument.
Mono-process job
----------------
In order to run an MPC job in a single process with Hydra, you should use on of
the following methods (depending on the thread type you want to use).
$ mpcrun -m=ethread -n=4 hello_world
$ mpcrun -m=ethread_mxn -n=4 hello_world
$ mpcrun -m=pthread -n=4 hello_world
To use one of the above methods with SLURM, just add *-l=srun* to the command
line.
Multi-process job on a single node
----------------------------------
In order to run an MPC job with Hydra in a two-process single-node manner with
the shared memory module enabled (SHM), you should use one of the following
methods (depending on the thread type you want to use). Note that on a single
node, even if the TCP module is explicitly used, MPC automatically uses the SHM
module for all process communications.
$ mpcrun -m=ethread -n=4 -p=2 -net=tcp hello_world
$ mpcrun -m=ethread_mxn -n=4 -p=2 -net=tcp hello_world
$ mpcrun -m=pthread -n=4 -p=2 -net=tcp hello_world
To use one of the above methods with SLURM, just add *-l=srun* to the command
line. Of course, this mode supports both MPI and OpenMP standards, enabling the
use of hybrid programming. There are different implementations of inter-process
communications. A call to *mpcrun -help* details all the available
implementations.
Multi-process job on multiple nodes
-----------------------------------
In order to run an MPC job on two nodes with eight processes communicating with
TCP, you should use one of the following methods (depending on the thread type
you want to use). Note that on multiple nodes, MPC automatically switches to the
MPC SHared Memory module (SHM) when a communication between processes on the
same node occurs. This behavior is available with all inter-process
communication modules (TCP included).
$ mpcrun -m=ethread -n=8 -p=8 -net=tcp -N=2 hello_world
$ mpcrun -m=ethread_mxn -n=8 -p=8 -net=tcp -N=2 hello_world
$ mpcrun -m=pthread -n=8 -p=8 -net=tcp -N=2 hello_world
Of course, this mode supports both MPI and OpenMP standards, enabling the use of
hybrid programming. There are different implementations of inter-process
communications and launch methods. A call to mpcrun -help detail all the
available implementations and launch methods.
Multi-process job on multiple nodes with process-based MPI flavor
-----------------------------------------------------------------
MPC offers two flavors of its MPI implementation: process-based and thread-based.
Process-based implementation is similar to the behavior of OpenMPI or MPICH.
The flavor can be directly driven by the launch arguments.
To use MPC-MPI in process-based flavor, the number of MPI processes specified
in the launch command should be the same as the number of OS processes specified
(hence -n value should be the same as -p value).
The following examples launch eight MPI processes on two nodes, in process-based
flavor. Each node will end up with four OS processes, each of these OS processes
embedding a MPI process.
$ mpcrun -m=ethread -n=8 -p=8 -net=tcp -N=2 -c=2 hello_world
$ mpcrun -m=ethread_mxn -n=8 -p=8 -net=tcp -N=2 -c=2 hello_world
$ mpcrun -m=pthread -n=8 -p=8 -net=tcp -N=2 -c=2 hello_world
Note that the -c argument specified the number of cores per OS process.
In the ebove examples, we can deduce that the nodes we want to work on have
at least 8 cores, with four OS processes per node, and two cores per OS
process.
Multi-process job on multiple nodes with thread-based MPI flavor
-----------------------------------------------------------------
MPC-MPI was developed to allow a thread-based flavor, e.g. inside a node,
MPI processes are threads. This flavor allows sharing constructs through
the shared memory. Communications between MPI processes on the node are just
data exchange in the shared memory, without having to go through the SHM module.
The following examples launch eight MPI processes on two nodes, in thread-based
flavor. Each node will end up with one OS process, each of these OS processes
embedding four MPI processes which are threads.
$ mpcrun -m=ethread -n=8 -p=2 -net=tcp -N=2 -c=8 hello_world
$ mpcrun -m=ethread_mxn -n=8 -p=2 -net=tcp -N=2 -c=8 hello_world
$ mpcrun -m=pthread -n=8 -p=2 -net=tcp -N=2 -c=8 hello_world
Since the -c argument specifies the number of cores per OS process, and not
per MPI process, the user need to give a number of cores per OS process at least
equals to the number of MPI process per OS process to avoid oversubscribing.
In the examples above, we will have four MPI process per OS process and eight
cores per OS process, hence two cores per MPI process.
The examples above display an example of full thread-based: one OS process per node,
and all MPI processes on the node are threads. It is also possible to have a
mitigated behavior: several OS processes per node, and multiple MPI processes which
are thread in each of these OS processes.
The following examples show such a behavior:
$ mpcrun -m=ethread -n=8 -p=4 -net=tcp -N=2 -c=4 hello_world
$ mpcrun -m=ethread_mxn -n=8 -p=4 -net=tcp -N=2 -c=4 hello_world
$ mpcrun -m=pthread -n=8 -p=4 -net=tcp -N=2 -c=4 hello_world
With these values for -N, -n, -p, each node will end up with two OS processes
and four MPI processes. It implies that each OS process embeds two MPI processes
which are threads. Then, to have two cores per MPI process, it is necessary to
ask four cores per OS process.
Launch with Hydra
-----------------
In order to execute an MPC job on multiple nodes using *Hydra*, you need to
provide the list of nodes in a *hosts* file and set the HYDRA\_HOST\_FILE
variable with the path to the file. You can also pass the host file as a
parameter of the launcher as follow:
$ mpcrun -m=ethread -n=8 -p=8 -net=tcp -N=2 --opt='-f hosts' hello_world
See [Using the Hydra Process Manager](https://wiki.mpich.org/mpich/index.php/Using_the_Hydra_Process_Manager)
for more information about hydra hosts file.
Contacts
--------
In case of question, feature or need for assistance, please contact any of the
maintainers of the project. You can find an exhaustive list in the
[MAINTAINERS](./MAINTAINERS.md) file, summarized below :
* JAEGER Julien julien.jaeger@cea.fr
* ROUSSEL Adrien adrien.roussel@cea.fr
* TABOADA Hugo hugo.taboada@cea.fr
* ParaTools Staff info@paratools.fr