`MPI.jl` RMA function's usage

using MPI

rank = MPI.Comm_rank(MPI.COMM_WORLD)
size = MPI.Comm_size(MPI.COMM_WORLD)

buf = fill(0, 10)
win = MPI.MPI_Win
MPI.API.MPI_Win_allocate(10*sizeof(Int), sizeof(Int), MPI.INFO_NULL, comm, buf, win)

if rank == 0
    @views buf .= 1:10
    @views buf .= 1 

@show (rank, buf)

if rank !== 0
    MPI.Win_lock(MPI.LOCK_EXCLUSIVE, 0, 0, win)
    MPI.Get(buf, 10, MPI.Int, rank, sizeof(Int), 10, MPI.Int, win)
    MPI.Win_unlock(0, win)

@show (rank, buf)

This is small program illustrating use of RMA (remote memory access) functionality of MPI. The syntax I am using for MPI.API.MPI_Win_allocate() is as given in MPI.jl docs:
MPI_Win_allocate(size, disp_unit, info, comm, baseptr, win)
still I am getting this error:

(base) $ mpiexecjl -np 2 julia test_rma.jl 
ERROR: ERROR: LoadError: LoadError: MethodError: no method matching unsafe_convert(::Type{Ptr{Int32}}, ::Type{Int32})MethodError: no method matching unsafe_convert(::Type{Ptr{Int32}}, ::Type{Int32})

Closest candidates are:
  unsafe_convert(::Type{Ptr{Int32}}, !Matched::MPI.Group)
   @ MPI ~/.julia/packages/MPI/z2owj/src/group.jl:12
  unsafe_convert(::Type{Ptr{Int32}}, !Matched::MPI.Errhandler)
   @ MPI ~/.julia/packages/MPI/z2owj/src/errhandler.jl:15
  unsafe_convert(::Type{Ptr{Int32}}, !Matched::MPI.Request)
   @ MPI ~/.julia/packages/MPI/z2owj/src/nonblocking.jl:190

Can anyone tell me why there is a error related to unsafe wrap?

Don’t you want to do something like

win = MPI.Win_create(all_ranks, MPI.COMM_WORLD)


Yeah, that is one method. But I want to use MPI.API.MPI_Win_allocate() instead of MPI.Win_create().

The last argument is a pointer to a storage location for the output:

r_win = Ref{MPI_Win}()
status = ...., r_win)
win = r_win[]

Or something similar. Check how Win_create works

so r_win is a reference to a window object?
what about the argument baseptr ?

Where can I check about Win_create’s working? I could not find it in the docs.

Looking at MPI_Win_allocate the baseptr needs to be handled similarly.

I would also recommend reading Calling C and Fortran Code · The Julia Language

Probably best to look at MPI.jl/src/onesided.jl at 7b97da711b90f2c0769ffe513a946958b4ec8ae1 · JuliaParallel/MPI.jl · GitHub

Turns out our Win object is a bit more magical, since it is GC tracked so that when it goes out of scope we deallocate the window.

I would recommend opening a feature PR to MPI.jl adding Win_allocate

Thanks for the resources.
But Win_allocate is available though using api in the file MPI.jl/src/api/generated_api.jl.

what does this line status = ...., r_win) means?
I am getting error;
MethodError: Cannot convert an object of type Int64 to an object of type MPI.API.MPIPtr

I have defined baseptr as:

r_buf = Ref{Int64}()
buf = r_buf[] 

The raw underlying C API is available that way, in order to use it you need to know how to interact with C from Julia.

MPI.jl provides high-level functions to make interacting with the C level convenient and less error prone.

You creating a reference to a single Int. You likely want a reference to a Ptr{Int} see MPI.jl/src/onesided.jl at 7b97da711b90f2c0769ffe513a946958b4ec8ae1 · JuliaParallel/MPI.jl · GitHub

I think MPI.MPI_Win is a datatype.

yeah, somehow related to Int32