Skip to content

Commit 3ba9b69

Browse files
committed
Add wrappers for MPI_Info related routines.
1 parent 6b4c8d3 commit 3ba9b69

File tree

4 files changed

+79
-3
lines changed

4 files changed

+79
-3
lines changed

deps/CMakeLists.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ FortranCInterface_HEADER(jlmpi_f2c.h MACRO_NAMESPACE "JLMPI_" SYMBOLS
4141
MPI_COMM_RANK
4242
MPI_COMM_SIZE
4343
MPI_COMM_SPLIT
44+
MPI_COMM_SPLIT_TYPE
4445
MPI_EXSCAN
4546
MPI_FINALIZE
4647
MPI_FINALIZED
@@ -49,6 +50,12 @@ FortranCInterface_HEADER(jlmpi_f2c.h MACRO_NAMESPACE "JLMPI_" SYMBOLS
4950
MPI_GATHERV
5051
MPI_GET_COUNT
5152
MPI_GET_PROCESSOR_NAME
53+
MPI_INFO_CREATE
54+
MPI_INFO_DELETE
55+
MPI_INFO_FREE
56+
MPI_INFO_GET
57+
MPI_INFO_GET_VALUELEN
58+
MPI_INFO_SET
5259
MPI_INIT
5360
MPI_INITIALIZED
5461
MPI_IPROBE
@@ -81,6 +88,7 @@ FortranCInterface_HEADER(jlmpi_f2c.h MACRO_NAMESPACE "JLMPI_" SYMBOLS
8188
MPI_WAITALL
8289
MPI_WAITANY
8390
MPI_WAITSOME
91+
MPI_WTICK
8492
MPI_WTIME
8593
)
8694

deps/gen_functions.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ int main(int argc, char *argv[]) {
4141
printf(" :MPI_GET_COUNT => \"%s\",\n", STRING(MPI_GET_COUNT));
4242
printf(" :MPI_GET_PROCESSOR_NAME => \"%s\",\n",
4343
STRING(MPI_GET_PROCESSOR_NAME));
44+
printf(" :MPI_INFO_CREATE => \"%s\",\n", STRING(MPI_INFO_CREATE));
45+
printf(" :MPI_INFO_DELETE => \"%s\",\n", STRING(MPI_INFO_DELETE));
46+
printf(" :MPI_INFO_FREE => \"%s\",\n", STRING(MPI_INFO_FREE));
47+
printf(" :MPI_INFO_GET => \"%s\",\n", STRING(MPI_INFO_GET));
48+
printf(" :MPI_INFO_GET_VALUELEN => \"%s\",\n", STRING(MPI_INFO_GET_VALUELEN));
49+
printf(" :MPI_INFO_SET => \"%s\",\n", STRING(MPI_INFO_SET));
4450
printf(" :MPI_INIT => \"%s\",\n", STRING(MPI_INIT));
4551
printf(" :MPI_INITIALIZED => \"%s\",\n", STRING(MPI_INITIALIZED));
4652
printf(" :MPI_IPROBE => \"%s\",\n", STRING(MPI_IPROBE));

src/mpi-base.jl

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,51 @@ const REQUEST_NULL = Request(MPI_REQUEST_NULL, nothing)
9595

9696
mutable struct Info
9797
val::Cint
98+
#val::Cint
99+
function Info()
100+
newinfo = Ref{Cint}()
101+
ccall(MPI_INFO_CREATE, Void, (Ptr{Cint}, Ptr{Cint}), newinfo, &0 )
102+
info=new(newinfo[])
103+
finalizer(info, info -> ( ccall(MPI_INFO_FREE, Void,
104+
(Ptr{Cint}, Ptr{Cint}), &info.val, &0);
105+
info.val = MPI_INFO_NULL ) )
106+
info
107+
end
108+
end
109+
const INFO_NULL = MPI_INFO_NULL
110+
111+
# the info functions assume that Fortran hidden arguments are placed at the end of the argument list
112+
function Info_set(info::Info,key::AbstractString,value::AbstractString)
113+
@assert isascii(key) && isascii(value)
114+
ccall(MPI_INFO_SET, Void,
115+
(Ptr{Cint}, Ptr{UInt8}, Ptr{UInt8}, Ptr{Cint}, Csize_t, Csize_t),
116+
&info.val, key, value, &0, sizeof(key), sizeof(value))
117+
end
118+
119+
function Info_get(info::Info,key::AbstractString)
120+
@assert isascii(key)
121+
keyexists=Ref{Bool}()
122+
len=Ref{Cint}()
123+
ccall(MPI_INFO_GET_VALUELEN, Void,
124+
(Ptr{Cint}, Ptr{UInt8}, Ptr{Cint}, Ptr{Bool}, Ptr{Cint}, Csize_t),
125+
&info.val, key, len, keyexists, &0, sizeof(key))
126+
if keyexists[]
127+
value=" "^(len[])
128+
ccall(MPI_INFO_GET, Void,
129+
(Ptr{Cint}, Ptr{UInt8}, Ptr{Cint}, Ptr{UInt8}, Ptr{Bool}, Ptr{Cint}, Csize_t, Csize_t),
130+
&info.val, key, len, value, keyexists, &0, sizeof(key), sizeof(value) )
131+
else
132+
value=""
133+
end
134+
value
98135
end
99-
const INFO_NULL = Info(MPI_INFO_NULL)
136+
137+
function Info_delete(info::Info,key::AbstractString)
138+
@assert isascii(key)
139+
ccall(MPI_INFO_DELETE, Void,
140+
(Ptr{Cint}, Ptr{UInt8}, Ptr{Cint}, Csize_t), &info.val, key ,&0, sizeof(key) )
141+
end
142+
Info_free(info::Info) = finalize(info)
100143

101144
mutable struct Status
102145
val::Array{Cint,1}
@@ -176,14 +219,16 @@ end
176219

177220
function Comm_split(comm::Comm,color::Integer,key::Integer)
178221
newcomm = Ref{Cint}()
179-
ccall(MPI_COMM_SPLIT, Void, (Ptr{Cint}, Ptr{Cint}, Ptr{Cint}, Ptr{Cint}, Ptr{Cint}),
222+
ccall(MPI_COMM_SPLIT, Void,
223+
(Ptr{Cint}, Ptr{Cint}, Ptr{Cint}, Ptr{Cint}, Ptr{Cint}),
180224
&comm.val, &color, &key, newcomm, &0)
181225
MPI.Comm(newcomm[])
182226
end
183227

184228
function Comm_split_type(comm::Comm,split_type::Integer,key::Integer;info::Info=INFO_NULL)
185229
newcomm = Ref{Cint}()
186-
ccall(MPI_COMM_SPLIT_TYPE, Void, (Ptr{Cint}, Ptr{Cint}, Ptr{Cint}, Ptr{Cint}, Ptr{Cint}, Ptr{Cint}),
230+
ccall(MPI_COMM_SPLIT_TYPE, Void,
231+
(Ptr{Cint}, Ptr{Cint}, Ptr{Cint}, Ptr{Cint}, Ptr{Cint}, Ptr{Cint}),
187232
&comm.val, &split_type, &key, &info.val, newcomm, &0)
188233
MPI.Comm(newcomm[])
189234
end

test/test_info.jl

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using Base.Test
2+
using MPI
3+
4+
MPI.Init()
5+
6+
info = MPI.Info()
7+
@test typeof(info) == MPI.Info
8+
@test info.val != MPI.Info
9+
MPI.Info_set(info, "foo", "fast")
10+
MPI.Info_set(info, "bar", "evenfaster")
11+
@test MPI.Info_get(info, "foo" ) == "fast"
12+
MPI.Info_delete(info, "bar")
13+
@test MPI.Info_get(info, "bar" ) == ""
14+
finalize(info)
15+
@test info.val == MPI.INFO_NULL
16+
17+
MPI.Finalize()

0 commit comments

Comments
 (0)