MPI_WIN_CREATE_KEYVAL(3)

✨ NAME ✨

MPI_Win_create_keyval β€” bestie, it creates a keyval for a window πŸͺŸπŸ’–

(and yeah, this is straight out of the Open MPI manual, we're just making it make sense πŸ’…)


πŸ“œ SYNTAX πŸ“œ

🩡 C Syntax

#include <mpi.h>

int MPI_Win_create_keyval(MPI_Win_copy_attr_function *win_copy_attr_fn,
     MPI_Win_delete_attr_function *win_delete_attr_fn,
     int *win_keyval, void *extra_state)

🩡 Fortran Syntax

USE MPI
! or the older form: INCLUDE 'mpif.h'
MPI_WIN_CREATE_KEYVAL(WIN_COPY_ATTR_FN, WIN_DELETE_ATTR_FN,
     WIN_KEYVAL, EXTRA_STATE, IERROR)
     EXTERNAL WIN_COPY_ATTR_FN, WIN_DELETE_ATTR_FN
     INTEGER WIN_KEYVAL, IERROR
     INTEGER(KIND=MPI_ADDRESS_KIND) EXTRA_STATE

🩡 Fortran 2008 Syntax

USE mpi_f08
MPI_Win_create_keyval(win_copy_attr_fn, win_delete_attr_fn, win_keyval,
             extra_state, ierror)
     PROCEDURE(MPI_Win_copy_attr_function) :: win_copy_attr_fn
     PROCEDURE(MPI_Win_delete_attr_function) :: win_delete_attr_fn
     INTEGER, INTENT(OUT) :: win_keyval
     INTEGER(KIND=MPI_ADDRESS_KIND), INTENT(IN) :: extra_state
     INTEGER, OPTIONAL, INTENT(OUT) :: ierror

πŸŽ€ INPUT PARAMETERS πŸŽ€

  • win_copy_attr_fn β€” the copy callback function for win_keyval (a function, bestie, you gotta hand it one). 🫢
  • win_delete_attr_fn β€” the delete callback function for win_keyval (also a function). πŸ’€
  • extra_state β€” extra state for the callback functions. Stash whatever you need in there. ✨

🌸 OUTPUT PARAMETERS 🌸

  • win_keyval β€” the key value for future access (integer). This is the lil ticket you'll use later. 🎟️
  • ierror β€” Fortran only: error status (integer). πŸ›

πŸ’– DESCRIPTION πŸ’–

Okay so, win_copy_attr_fn? You can pass MPI_WIN_NULL_COPY_FN or MPI_WIN_DUP_FN for it, from either C or Fortran, no cap. MPI_WIN_NULL_COPY_FN is a function whose entire personality is returning flag = 0 and MPI_SUCCESS. Meanwhile MPI_WIN_DUP_FN is a simple-minded copy function that sets flag = 1, returns the value of attribute_val_in in attribute_val_out, and returns MPI_SUCCESS. It's giving low-effort but it works. 😌

And win_delete_attr_fn? You can pass MPI_WIN_NULL_DELETE_FN for it, again from either C or Fortran. MPI_WIN_NULL_DELETE_FN is a function that serves only to return MPI_SUCCESS. That's it, that's the whole job. πŸ‘‘

The C callback functions are:

typedef int MPI_Win_copy_attr_function(MPI_Win oldwin, int win_keyval,
             void *extra_state, void *attribute_val_in,
             void *attribute_val_out, int *flag);

typedef int MPI_Win_delete_attr_function(MPI_Win win, int win_keyval,
             void *attribute_val, void *extra_state);

The Fortran callback functions are:

SUBROUTINE WIN_COPY_ATTR_FN(OLDWIN, WIN_KEYVAL, EXTRA_STATE,
     ATTRIBUTE_VAL_IN, ATTRIBUTE_VAL_OUT, FLAG, IERROR)
     INTEGER OLDWIN, WIN_KEYVAL, IERROR
     INTEGER(KIND=MPI_ADDRESS_KIND) EXTRA_STATE, ATTRIBUTE_VAL_IN,
             ATTRIBUTE_VAL_OUT
     LOGICAL FLAG

SUBROUTINE WIN_DELETE_ATTR_FN(WIN, WIN_KEYVAL, ATTRIBUTE_VAL,
     EXTRA_STATE, IERROR)
     INTEGER WIN, WIN_KEYVAL, IERROR
     INTEGER(KIND=MPI_ADDRESS_KIND) ATTRIBUTE_VAL, EXTRA_STATE

🚨 ERRORS 🚨

Almost all MPI routines return an error value, bestie β€” C routines hand it back as the return result of the function, and Fortran routines put it in the last argument. 🫠

Before that error value gets returned, the current MPI error handler that's associated with the communication object (like a communicator, window, or file, iykyk) gets called. And if there's no communication object associated with the MPI call? Then the call counts as attached to MPI_COMM_SELF and it'll call the associated MPI error handler. When MPI_COMM_SELF is not initialized β€” that's before MPI_Init/MPI_Init_thread, after MPI_Finalize, or when you're using the Sessions Model exclusively β€” the error raises the initial error handler. You can change that initial error handler by calling MPI_Comm_set_errhandler on MPI_COMM_SELF when you're using the World model, or via the mpi_initial_errhandler CLI argument to mpiexec, or the info key to MPI_Comm_spawn/MPI_Comm_spawn_multiple. And if no other appropriate error handler has been set, then the MPI_ERRORS_RETURN error handler is called for MPI I/O functions, and the MPI_ERRORS_ABORT error handler is called for all other MPI functions. Periodt. πŸ’…

Open MPI ships three predefined error handlers you can use:

  • MPI_ERRORS_ARE_FATAL β€” causes the program to abort all connected MPI processes. Yeah. Everyone. 😭
  • MPI_ERRORS_ABORT β€” an error handler that can be invoked on a communicator, window, file, or session. When called on a communicator, it acts as if MPI_Abort was called on that communicator. If it's called on a window or file, it acts as if MPI_Abort was called on a communicator containing the group of processes in the corresponding window or file. If it's called on a session, it aborts only the local process. Situational awareness, we love to see it. 🌈
  • MPI_ERRORS_RETURN β€” returns an error code to the application. Chillest one in the group chat. πŸ“

MPI applications can also implement their own error handlers by calling:

  • MPI_Comm_create_errhandler then MPI_Comm_set_errhandler
  • MPI_File_create_errhandler then MPI_File_set_errhandler
  • MPI_Session_create_errhandler then MPI_Session_set_errhandler or at MPI_Session_init
  • MPI_Win_create_errhandler then MPI_Win_set_errhandler
Note that MPI does not guarantee that an MPI program can continue past an error. Like, it might just be over. Be so fr. πŸ’€

See the MPI man page for a full list of MPI error codes. And see the Error Handling section of the MPI-3.1 standard for more information. πŸ“š


2003-2026, The Open MPI Community. Absolute icons, honestly. 🫢


Okay that's the whole page, bestie!! This was MPI_WIN_CREATE_KEYVAL(3) from Open MPI, dated Sep 10, 2026 β€” go make some window keyvals, you're gonna slay πŸ’…βœ¨πŸ¦‹

πŸ“¦ where this page comes from