forked from rikigigi/analisi
-
Notifications
You must be signed in to change notification settings - Fork 0
/
mp.cpp
78 lines (56 loc) · 1.36 KB
/
mp.cpp
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
/**
*
* (c) Riccardo Bertossa, 2019
*
* Use at your own risk.
*
* If you modified the code, I could be happy if you contribute on github!
*
**/
#include "config.h"
#include "mp.h"
#ifdef USE_MPI
#include "operazionisulista.h"
#include <iostream>
#include <string>
#include <mpi.h>
bool Mp::initialized=false;
Mp & Mp::mpi(int *argc, char ***argv) {
static Mp istanza(argc,argv);
return istanza;
}
Mp::Mp(int *argc, char ***argv)
{
int provided_thread=0;
if (initialized) {
std::cerr << "Errore: non posso inizializzare due volte l'ambiente MPI!\n";
MPI_Abort(MPI_COMM_WORLD,-1);
} else {
MPI_Init_thread(argc,argv,MPI_THREAD_SERIALIZED,&provided_thread);
MPI_Comm_rank(MPI_COMM_WORLD,&world_rank);
MPI_Comm_size(MPI_COMM_WORLD,&world_size);
if (!ionode()) { //suppress all output from other nodes
std::cout.setstate(std::ios_base::failbit);
std::cerr.setstate(std::ios_base::failbit);
std::clog.setstate(std::ios_base::failbit);
}
}
}
Mp::~Mp() {
MPI_Finalize();
}
int Mp::me(){
return world_rank;
}
int Mp::size(){
return world_size;
}
bool Mp::ionode() {
if (world_rank==0)
return true;
return false;
}
std::string Mp::outname(std::string s) {
return s + "."+ std::to_string(world_rank);
}
#endif