/
group.jl
128 lines (104 loc) · 3.71 KB
/
group.jl
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
"""
MPI.Group
An MPI Group object.
"""
mutable struct Group
val::MPI_Group
end
Base.:(==)(a::Group, b::Group) = a.val == b.val
Base.cconvert(::Type{MPI_Group}, group::Group) = group
Base.unsafe_convert(::Type{MPI_Group}, group::Group) = group.val
Base.unsafe_convert(::Type{Ptr{MPI_Group}}, group::Group) = convert(Ptr{MPI_Group}, pointer_from_objref(group))
const GROUP_NULL = Group(API.MPI_GROUP_NULL[])
const GROUP_EMPTY = Group(API.MPI_GROUP_EMPTY[])
add_load_time_hook!(LoadTimeHookSetVal(GROUP_NULL, API.MPI_GROUP_NULL ))
add_load_time_hook!(LoadTimeHookSetVal(GROUP_EMPTY, API.MPI_GROUP_EMPTY))
Group() = Group(GROUP_NULL.val)
# int MPI_Group_range_excl(MPI_Group group, int n, int ranges[][3], MPI_Group *newgroup)
# int MPI_Group_range_incl(MPI_Group group, int n, int ranges[][3], MPI_Group *newgroup)
# int MPI_Group_translate_ranks(MPI_Group group1, int n, const int ranks1[], MPI_Group group2, int ranks2[])
function free(group::Group)
if group != GROUP_NULL && !Finalized()
# int MPI_Group_free(MPI_Group *group)
API.MPI_Group_free(group)
end
return nothing
end
"""
Group_size(group::Group)
The number of processes involved in group.
# External links
$(_doc_external("MPI_Group_size"))
"""
function Group_size(group::Group)
size = Ref{Cint}()
API.MPI_Group_size(group, size)
Int(size[])
end
"""
Group_rank(group::Group)
The rank of the process in the particular group.
Returns an integer in the range `0:MPI.Group_size()-1`.
# External links
$(_doc_external("MPI_Group_rank"))
"""
function Group_rank(group::Group)
rank = Ref{Cint}()
API.MPI_Group_rank(group, rank)
Int(rank[])
end
"""
Comparison
An enum denoting the result of [`Comm_compare`](@ref):
- `MPI.IDENT`: the objects are handles for the same object (identical groups and same contexts).
- `MPI.CONGRUENT`: the underlying groups are identical in constituents and rank order; these communicators differ only by context.
- `MPI.SIMILAR`: members of both objects are the same but the rank order differs.
- `MPI.UNEQUAL`: otherwise
"""
mutable struct Comparison
val::Cint
end
const IDENT = Comparison(API.MPI_IDENT[])
const CONGRUENT = Comparison(API.MPI_CONGRUENT[])
const SIMILAR = Comparison(API.MPI_SIMILAR[])
const UNEQUAL = Comparison(API.MPI_UNEQUAL[])
add_load_time_hook!(LoadTimeHookSetVal(IDENT, API.MPI_IDENT ))
add_load_time_hook!(LoadTimeHookSetVal(CONGRUENT, API.MPI_CONGRUENT))
add_load_time_hook!(LoadTimeHookSetVal(SIMILAR, API.MPI_SIMILAR ))
add_load_time_hook!(LoadTimeHookSetVal(UNEQUAL, API.MPI_UNEQUAL ))
Base.:(==)(tl1::Comparison, tl2::Comparison) = tl1.val == tl2.val
function Group_compare(group1::Group, group2::Group)
result = Ref{Cint}()
API.MPI_Group_compare(group1, group2, result)
return Comparison(result[])
end
function Group_difference(group1::Group, group2::Group)
newgroup = Group()
API.MPI_Group_difference(group1, group2, newgroup)
finalizer(free, newgroup)
return newgroup
end
function Group_intersection(group1::Group, group2::Group)
newgroup = Group()
API.MPI_Group_intersection(group1, group2, newgroup)
finalizer(free, newgroup)
return newgroup
end
function Group_union(group1::Group, group2::Group)
newgroup = Group()
API.MPI_Group_union(group1, group2, newgroup)
finalizer(free, newgroup)
return newgroup
end
function Group_excl(group::Group, ranks::Vector{Cint})
newgroup = Group()
API.MPI_Group_excl(group, length(ranks), ranks, newgroup)
finalizer(free, newgroup)
return newgroup
end
function Group_incl(group::Group, ranks::Vector{Cint})
newgroup = Group()
API.MPI_Group_incl(group, length(ranks), ranks, newgroup)
finalizer(free, newgroup)
return newgroup
end