# \`MPI.jl\` RMA function's usage

**URL:** https://discourse.julialang.org/t/mpi-jl-rma-functions-usage/115328
**Category:** New to Julia
**Tags:** question, package, mpi, parallel-computing
**Created:** [June 7, 2024, 12:39pm UTC](https://discourse.julialang.org/t/mpi-jl-rma-functions-usage/115328 "2024-06-07T12:39:16Z")
**Posts on this page:** 12
**Page:** 1

<div class="post-metadata">

### Author: ![Devansh1106](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/devansh1106/32/207983_2.png) [@Devansh1106](https://discourse.julialang.org/u/Devansh1106)
#### Post date: [June 7, 2024, 12:39pm UTC](https://discourse.julialang.org/t/mpi-jl-rma-functions-usage/115328/1 "2024-06-07T12:39:16Z")

</div>

```julia
using MPI
MPI.Init()

comm = MPI.COMM_WORLD
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
else
    @views buf .= 1 
end

@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)
end

@show (rank, buf)
MPI.free(win)

```

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:

```julia
(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?

---

<div class="post-metadata">

### Author: ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)
#### Post date: [June 7, 2024, 1:53pm UTC](https://discourse.julialang.org/t/mpi-jl-rma-functions-usage/115328/2 "2024-06-07T13:53:57Z")

</div>

> [@Devansh1106](#):
>
> `MPI_Win`

Don’t you want to do something like

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

```

?

---

<div class="post-metadata">

### Author: ![Devansh1106](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/devansh1106/32/207983_2.png) [@Devansh1106](https://discourse.julialang.org/u/Devansh1106)
#### Post date: [June 7, 2024, 1:56pm UTC](https://discourse.julialang.org/t/mpi-jl-rma-functions-usage/115328/3 "2024-06-07T13:56:46Z")

</div>

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

---

<div class="post-metadata">

### Author: ![vchuravy](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vchuravy/32/8_2.png) [@vchuravy](https://discourse.julialang.org/u/vchuravy)
#### Post date: [June 7, 2024, 2:02pm UTC](https://discourse.julialang.org/t/mpi-jl-rma-functions-usage/115328/4 "2024-06-07T14:02:14Z")

</div>

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

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

```

Or something similar. Check how `Win_create` works

---

<div class="post-metadata">

### Author: ![Devansh1106](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/devansh1106/32/207983_2.png) [@Devansh1106](https://discourse.julialang.org/u/Devansh1106)
#### Post date: [June 7, 2024, 2:05pm UTC](https://discourse.julialang.org/t/mpi-jl-rma-functions-usage/115328/5 "2024-06-07T14:05:58Z")

</div>

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.

---

<div class="post-metadata">

### Author: ![vchuravy](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vchuravy/32/8_2.png) [@vchuravy](https://discourse.julialang.org/u/vchuravy)
#### Post date: [June 7, 2024, 2:12pm UTC](https://discourse.julialang.org/t/mpi-jl-rma-functions-usage/115328/6 "2024-06-07T14:12:04Z")

</div>

Looking at [MPI\_Win\_allocate](https://www.mpich.org/static/docs/v3.3/www3/MPI_Win_allocate.html) the baseptr needs to be handled similarly.

I would also recommend reading [Calling C and Fortran Code · The Julia Language](https://docs.julialang.org/en/v1/manual/calling-c-and-fortran-code/)

Probably best to look at [MPI.jl/src/onesided.jl at 7b97da711b90f2c0769ffe513a946958b4ec8ae1 · JuliaParallel/MPI.jl · GitHub](https://github.com/JuliaParallel/MPI.jl/blob/7b97da711b90f2c0769ffe513a946958b4ec8ae1/src/onesided.jl#L95)

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`

---

<div class="post-metadata">

### Author: ![Devansh1106](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/devansh1106/32/207983_2.png) [@Devansh1106](https://discourse.julialang.org/u/Devansh1106)
#### Post date: [June 7, 2024, 2:16pm UTC](https://discourse.julialang.org/t/mpi-jl-rma-functions-usage/115328/7 "2024-06-07T14:16:22Z")

</div>

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

---

<div class="post-metadata">

### Author: ![Devansh1106](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/devansh1106/32/207983_2.png) [@Devansh1106](https://discourse.julialang.org/u/Devansh1106)
#### Post date: [June 7, 2024, 2:26pm UTC](https://discourse.julialang.org/t/mpi-jl-rma-functions-usage/115328/8 "2024-06-07T14:26:27Z")

</div>

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:

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

```

---

<div class="post-metadata">

### Author: ![vchuravy](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vchuravy/32/8_2.png) [@vchuravy](https://discourse.julialang.org/u/vchuravy)
#### Post date: [June 7, 2024, 2:28pm UTC](https://discourse.julialang.org/t/mpi-jl-rma-functions-usage/115328/9 "2024-06-07T14:28:53Z")

</div>

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.

---

<div class="post-metadata">

### Author: ![vchuravy](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vchuravy/32/8_2.png) [@vchuravy](https://discourse.julialang.org/u/vchuravy)
#### Post date: [June 7, 2024, 2:30pm UTC](https://discourse.julialang.org/t/mpi-jl-rma-functions-usage/115328/10 "2024-06-07T14:30:07Z")

</div>

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](https://github.com/JuliaParallel/MPI.jl/blob/7b97da711b90f2c0769ffe513a946958b4ec8ae1/src/onesided.jl#L92)

---

<div class="post-metadata">

### Author: ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)
#### Post date: [June 7, 2024, 2:33pm UTC](https://discourse.julialang.org/t/mpi-jl-rma-functions-usage/115328/11 "2024-06-07T14:33:53Z")

</div>

I think `MPI.MPI_Win` is a _datatype_.

---

<div class="post-metadata">

### Author: ![Devansh1106](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/devansh1106/32/207983_2.png) [@Devansh1106](https://discourse.julialang.org/u/Devansh1106)
#### Post date: [June 7, 2024, 2:39pm UTC](https://discourse.julialang.org/t/mpi-jl-rma-functions-usage/115328/12 "2024-06-07T14:39:35Z")

</div>

yeah, somehow related to `Int32`
