MLIR

Multi-Level IR Compiler Framework

'mpi' Dialect

This dialect models the Message Passing Interface (MPI), version 4.0. It is meant to serve as an interfacing dialect that is targeted by higher-level dialects. The MPI dialect itself can be lowered to multiple MPI implementations and hide differences in ABI. The dialect models the functions of the MPI specification as close to 1:1 as possible while preserving SSA value semantics where it makes sense, and uses memref types instead of bare pointers.

This dialect is under active development, and while stability is an eventual goal, it is not guaranteed at this juncture. Given the early state, it is recommended to inquire further prior to using this dialect.

For an in-depth documentation of the MPI library interface, please refer to official documentation such as the OpenMPI online documentation.

Operations 

source

mpi.comm_rank (mpi::CommRankOp) 

Get the current rank, equivalent to MPI_Comm_rank(MPI_COMM_WORLD, &rank)

Syntax:

operation ::= `mpi.comm_rank` attr-dict `:` type(results)

Communicators other than MPI_COMM_WORLD are not supported for now.

This operation can optionally return an !mpi.retval value that can be used to check for errors.

Results: 

ResultDescription
retvalMPI function call return value
rank32-bit signless integer

mpi.error_class (mpi::ErrorClassOp) 

Get the error class from an error code, equivalent to the MPI_Error_class function

Syntax:

operation ::= `mpi.error_class` $val attr-dict `:` type($val)

MPI_Error_class maps return values from MPI calls to a set of well-known MPI error classes.

Operands: 

OperandDescription
valMPI function call return value

Results: 

ResultDescription
errclassMPI function call return value

mpi.finalize (mpi::FinalizeOp) 

Finalize the MPI library, equivalent to MPI_Finalize()

Syntax:

operation ::= `mpi.finalize` attr-dict (`:` type($retval)^)?

This function cleans up the MPI state. Afterwards, no MPI methods may be invoked (excpet for MPI_Get_version, MPI_Initialized, and MPI_Finalized). Notably, MPI_Init cannot be called again in the same program.

This operation can optionally return an !mpi.retval value that can be used to check for errors.

Results: 

ResultDescription
retvalMPI function call return value

mpi.init (mpi::InitOp) 

Initialize the MPI library, equivalent to MPI_Init(NULL, NULL)

Syntax:

operation ::= `mpi.init` attr-dict (`:` type($retval)^)?

This operation must preceed most MPI calls (except for very few exceptions, please consult with the MPI specification on these).

Passing &argc, &argv is not supported currently.

This operation can optionally return an !mpi.retval value that can be used to check for errors.

Results: 

ResultDescription
retvalMPI function call return value

mpi.recv (mpi::RecvOp) 

Equivalent to MPI_Recv(ptr, size, dtype, dest, tag, MPI_COMM_WORLD, MPI_STATUS_IGNORE)

Syntax:

operation ::= `mpi.recv` `(` $ref `,` $tag `,` $rank `)` attr-dict `:` type($ref) `,` type($tag) `,` type($rank)(`->` type($retval)^)?

MPI_Recv performs a blocking receive of size elements of type dtype from rank dest. The tag value and communicator enables the library to determine the matching of multiple sends and receives between the same ranks.

Communicators other than MPI_COMM_WORLD are not supprted for now. The MPI_Status is set to MPI_STATUS_IGNORE, as the status object is not yet ported to MLIR.

This operation can optionally return an !mpi.retval value that can be used to check for errors.

Operands: 

OperandDescription
refmemref of any type values
tag32-bit signless integer
rank32-bit signless integer

Results: 

ResultDescription
retvalMPI function call return value

mpi.retval_check (mpi::RetvalCheckOp) 

Check an MPI return value against an error class

Syntax:

operation ::= `mpi.retval_check` $val `=` $errclass attr-dict `:` type($res)

This operation compares MPI status codes to known error class constants such as MPI_SUCCESS, or MPI_ERR_COMM.

Attributes: 

AttributeMLIR TypeDescription
errclass::mlir::mpi::MPI_ErrorClassEnumAttr
MPI error class name

Enum cases:

  • MPI_SUCCESS (MPI_SUCCESS)
  • MPI_ERR_ACCESS (MPI_ERR_ACCESS)
  • MPI_ERR_AMODE (MPI_ERR_AMODE)
  • MPI_ERR_ARG (MPI_ERR_ARG)
  • MPI_ERR_ASSERT (MPI_ERR_ASSERT)
  • MPI_ERR_BAD_FILE (MPI_ERR_BAD_FILE)
  • MPI_ERR_BASE (MPI_ERR_BASE)
  • MPI_ERR_BUFFER (MPI_ERR_BUFFER)
  • MPI_ERR_COMM (MPI_ERR_COMM)
  • MPI_ERR_CONVERSION (MPI_ERR_CONVERSION)
  • MPI_ERR_COUNT (MPI_ERR_COUNT)
  • MPI_ERR_DIMS (MPI_ERR_DIMS)
  • MPI_ERR_DISP (MPI_ERR_DISP)
  • MPI_ERR_DUP_DATAREP (MPI_ERR_DUP_DATAREP)
  • MPI_ERR_ERRHANDLER (MPI_ERR_ERRHANDLER)
  • MPI_ERR_FILE (MPI_ERR_FILE)
  • MPI_ERR_FILE_EXISTS (MPI_ERR_FILE_EXISTS)
  • MPI_ERR_FILE_IN_USE (MPI_ERR_FILE_IN_USE)
  • MPI_ERR_GROUP (MPI_ERR_GROUP)
  • MPI_ERR_INFO (MPI_ERR_INFO)
  • MPI_ERR_INFO_KEY (MPI_ERR_INFO_KEY)
  • MPI_ERR_INFO_NOKEY (MPI_ERR_INFO_NOKEY)
  • MPI_ERR_INFO_VALUE (MPI_ERR_INFO_VALUE)
  • MPI_ERR_IN_STATUS (MPI_ERR_IN_STATUS)
  • MPI_ERR_INTERN (MPI_ERR_INTERN)
  • MPI_ERR_IO (MPI_ERR_IO)
  • MPI_ERR_KEYVAL (MPI_ERR_KEYVAL)
  • MPI_ERR_LOCKTYPE (MPI_ERR_LOCKTYPE)
  • MPI_ERR_NAME (MPI_ERR_NAME)
  • MPI_ERR_NO_MEM (MPI_ERR_NO_MEM)
  • MPI_ERR_NO_SPACE (MPI_ERR_NO_SPACE)
  • MPI_ERR_NO_SUCH_FILE (MPI_ERR_NO_SUCH_FILE)
  • MPI_ERR_NOT_SAME (MPI_ERR_NOT_SAME)
  • MPI_ERR_OP (MPI_ERR_OP)
  • MPI_ERR_OTHER (MPI_ERR_OTHER)
  • MPI_ERR_PENDING (MPI_ERR_PENDING)
  • MPI_ERR_PORT (MPI_ERR_PORT)
  • MPI_ERR_PROC_ABORTED (MPI_ERR_PROC_ABORTED)
  • MPI_ERR_QUOTA (MPI_ERR_QUOTA)
  • MPI_ERR_RANK (MPI_ERR_RANK)
  • MPI_ERR_READ_ONLY (MPI_ERR_READ_ONLY)
  • MPI_ERR_REQUEST (MPI_ERR_REQUEST)
  • MPI_ERR_RMA_ATTACH (MPI_ERR_RMA_ATTACH)
  • MPI_ERR_RMA_CONFLICT (MPI_ERR_RMA_CONFLICT)
  • MPI_ERR_RMA_FLAVOR (MPI_ERR_RMA_FLAVOR)
  • MPI_ERR_RMA_RANGE (MPI_ERR_RMA_RANGE)
  • MPI_ERR_RMA_SHARED (MPI_ERR_RMA_SHARED)
  • MPI_ERR_RMA_SYNC (MPI_ERR_RMA_SYNC)
  • MPI_ERR_ROOT (MPI_ERR_ROOT)
  • MPI_ERR_SERVICE (MPI_ERR_SERVICE)
  • MPI_ERR_SESSION (MPI_ERR_SESSION)
  • MPI_ERR_SIZE (MPI_ERR_SIZE)
  • MPI_ERR_SPAWN (MPI_ERR_SPAWN)
  • MPI_ERR_TAG (MPI_ERR_TAG)
  • MPI_ERR_TOPOLOGY (MPI_ERR_TOPOLOGY)
  • MPI_ERR_TRUNCATE (MPI_ERR_TRUNCATE)
  • MPI_ERR_TYPE (MPI_ERR_TYPE)
  • MPI_ERR_UNKNOWN (MPI_ERR_UNKNOWN)
  • MPI_ERR_UNSUPPORTED_DATAREP (MPI_ERR_UNSUPPORTED_DATAREP)
  • MPI_ERR_UNSUPPORTED_OPERATION (MPI_ERR_UNSUPPORTED_OPERATION)
  • MPI_ERR_VALUE_TOO_LARGE (MPI_ERR_VALUE_TOO_LARGE)
  • MPI_ERR_WIN (MPI_ERR_WIN)
  • MPI_ERR_LASTCODE (MPI_ERR_LASTCODE)

Operands: 

OperandDescription
valMPI function call return value

Results: 

ResultDescription
res1-bit signless integer

mpi.send (mpi::SendOp) 

Equivalent to MPI_Send(ptr, size, dtype, dest, tag, MPI_COMM_WORLD)

Syntax:

operation ::= `mpi.send` `(` $ref `,` $tag `,` $rank `)` attr-dict `:` type($ref) `,` type($tag) `,` type($rank)(`->` type($retval)^)?

MPI_Send performs a blocking send of size elements of type dtype to rank dest. The tag value and communicator enables the library to determine the matching of multiple sends and receives between the same ranks.

Communicators other than MPI_COMM_WORLD are not supprted for now.

This operation can optionally return an !mpi.retval value that can be used to check for errors.

Operands: 

OperandDescription
refmemref of any type values
tag32-bit signless integer
rank32-bit signless integer

Results: 

ResultDescription
retvalMPI function call return value

Attributes 

MPI_ErrorClassEnumAttr 

MPI error class name

Syntax:

#mpi.errclass<
  ::mlir::mpi::MPI_ErrorClassEnum   # value
>

Enum cases:

  • MPI_SUCCESS (MPI_SUCCESS)
  • MPI_ERR_ACCESS (MPI_ERR_ACCESS)
  • MPI_ERR_AMODE (MPI_ERR_AMODE)
  • MPI_ERR_ARG (MPI_ERR_ARG)
  • MPI_ERR_ASSERT (MPI_ERR_ASSERT)
  • MPI_ERR_BAD_FILE (MPI_ERR_BAD_FILE)
  • MPI_ERR_BASE (MPI_ERR_BASE)
  • MPI_ERR_BUFFER (MPI_ERR_BUFFER)
  • MPI_ERR_COMM (MPI_ERR_COMM)
  • MPI_ERR_CONVERSION (MPI_ERR_CONVERSION)
  • MPI_ERR_COUNT (MPI_ERR_COUNT)
  • MPI_ERR_DIMS (MPI_ERR_DIMS)
  • MPI_ERR_DISP (MPI_ERR_DISP)
  • MPI_ERR_DUP_DATAREP (MPI_ERR_DUP_DATAREP)
  • MPI_ERR_ERRHANDLER (MPI_ERR_ERRHANDLER)
  • MPI_ERR_FILE (MPI_ERR_FILE)
  • MPI_ERR_FILE_EXISTS (MPI_ERR_FILE_EXISTS)
  • MPI_ERR_FILE_IN_USE (MPI_ERR_FILE_IN_USE)
  • MPI_ERR_GROUP (MPI_ERR_GROUP)
  • MPI_ERR_INFO (MPI_ERR_INFO)
  • MPI_ERR_INFO_KEY (MPI_ERR_INFO_KEY)
  • MPI_ERR_INFO_NOKEY (MPI_ERR_INFO_NOKEY)
  • MPI_ERR_INFO_VALUE (MPI_ERR_INFO_VALUE)
  • MPI_ERR_IN_STATUS (MPI_ERR_IN_STATUS)
  • MPI_ERR_INTERN (MPI_ERR_INTERN)
  • MPI_ERR_IO (MPI_ERR_IO)
  • MPI_ERR_KEYVAL (MPI_ERR_KEYVAL)
  • MPI_ERR_LOCKTYPE (MPI_ERR_LOCKTYPE)
  • MPI_ERR_NAME (MPI_ERR_NAME)
  • MPI_ERR_NO_MEM (MPI_ERR_NO_MEM)
  • MPI_ERR_NO_SPACE (MPI_ERR_NO_SPACE)
  • MPI_ERR_NO_SUCH_FILE (MPI_ERR_NO_SUCH_FILE)
  • MPI_ERR_NOT_SAME (MPI_ERR_NOT_SAME)
  • MPI_ERR_OP (MPI_ERR_OP)
  • MPI_ERR_OTHER (MPI_ERR_OTHER)
  • MPI_ERR_PENDING (MPI_ERR_PENDING)
  • MPI_ERR_PORT (MPI_ERR_PORT)
  • MPI_ERR_PROC_ABORTED (MPI_ERR_PROC_ABORTED)
  • MPI_ERR_QUOTA (MPI_ERR_QUOTA)
  • MPI_ERR_RANK (MPI_ERR_RANK)
  • MPI_ERR_READ_ONLY (MPI_ERR_READ_ONLY)
  • MPI_ERR_REQUEST (MPI_ERR_REQUEST)
  • MPI_ERR_RMA_ATTACH (MPI_ERR_RMA_ATTACH)
  • MPI_ERR_RMA_CONFLICT (MPI_ERR_RMA_CONFLICT)
  • MPI_ERR_RMA_FLAVOR (MPI_ERR_RMA_FLAVOR)
  • MPI_ERR_RMA_RANGE (MPI_ERR_RMA_RANGE)
  • MPI_ERR_RMA_SHARED (MPI_ERR_RMA_SHARED)
  • MPI_ERR_RMA_SYNC (MPI_ERR_RMA_SYNC)
  • MPI_ERR_ROOT (MPI_ERR_ROOT)
  • MPI_ERR_SERVICE (MPI_ERR_SERVICE)
  • MPI_ERR_SESSION (MPI_ERR_SESSION)
  • MPI_ERR_SIZE (MPI_ERR_SIZE)
  • MPI_ERR_SPAWN (MPI_ERR_SPAWN)
  • MPI_ERR_TAG (MPI_ERR_TAG)
  • MPI_ERR_TOPOLOGY (MPI_ERR_TOPOLOGY)
  • MPI_ERR_TRUNCATE (MPI_ERR_TRUNCATE)
  • MPI_ERR_TYPE (MPI_ERR_TYPE)
  • MPI_ERR_UNKNOWN (MPI_ERR_UNKNOWN)
  • MPI_ERR_UNSUPPORTED_DATAREP (MPI_ERR_UNSUPPORTED_DATAREP)
  • MPI_ERR_UNSUPPORTED_OPERATION (MPI_ERR_UNSUPPORTED_OPERATION)
  • MPI_ERR_VALUE_TOO_LARGE (MPI_ERR_VALUE_TOO_LARGE)
  • MPI_ERR_WIN (MPI_ERR_WIN)
  • MPI_ERR_LASTCODE (MPI_ERR_LASTCODE)

Parameters: 

ParameterC++ typeDescription
value::mlir::mpi::MPI_ErrorClassEnuman enum of type MPI_ErrorClassEnum

Types 

RetvalType 

MPI function call return value

Syntax: !mpi.retval

This type represents a return value from an MPI function call. This value can be MPI_SUCCESS, MPI_ERR_IN_STATUS, or any error code.

This return value can be compared agains the known MPI error classes represented by #mpi.errclass using the mpi.retval_check operation.

Enums 

MPI_ErrorClassEnum 

MPI error class name

Cases: 

SymbolValueString
MPI_SUCCESS0MPI_SUCCESS
MPI_ERR_ACCESS1MPI_ERR_ACCESS
MPI_ERR_AMODE2MPI_ERR_AMODE
MPI_ERR_ARG3MPI_ERR_ARG
MPI_ERR_ASSERT4MPI_ERR_ASSERT
MPI_ERR_BAD_FILE5MPI_ERR_BAD_FILE
MPI_ERR_BASE6MPI_ERR_BASE
MPI_ERR_BUFFER7MPI_ERR_BUFFER
MPI_ERR_COMM8MPI_ERR_COMM
MPI_ERR_CONVERSION9MPI_ERR_CONVERSION
MPI_ERR_COUNT10MPI_ERR_COUNT
MPI_ERR_DIMS11MPI_ERR_DIMS
MPI_ERR_DISP12MPI_ERR_DISP
MPI_ERR_DUP_DATAREP13MPI_ERR_DUP_DATAREP
MPI_ERR_ERRHANDLER14MPI_ERR_ERRHANDLER
MPI_ERR_FILE15MPI_ERR_FILE
MPI_ERR_FILE_EXISTS16MPI_ERR_FILE_EXISTS
MPI_ERR_FILE_IN_USE17MPI_ERR_FILE_IN_USE
MPI_ERR_GROUP18MPI_ERR_GROUP
MPI_ERR_INFO19MPI_ERR_INFO
MPI_ERR_INFO_KEY20MPI_ERR_INFO_KEY
MPI_ERR_INFO_NOKEY21MPI_ERR_INFO_NOKEY
MPI_ERR_INFO_VALUE22MPI_ERR_INFO_VALUE
MPI_ERR_IN_STATUS23MPI_ERR_IN_STATUS
MPI_ERR_INTERN24MPI_ERR_INTERN
MPI_ERR_IO25MPI_ERR_IO
MPI_ERR_KEYVAL26MPI_ERR_KEYVAL
MPI_ERR_LOCKTYPE27MPI_ERR_LOCKTYPE
MPI_ERR_NAME28MPI_ERR_NAME
MPI_ERR_NO_MEM29MPI_ERR_NO_MEM
MPI_ERR_NO_SPACE30MPI_ERR_NO_SPACE
MPI_ERR_NO_SUCH_FILE31MPI_ERR_NO_SUCH_FILE
MPI_ERR_NOT_SAME32MPI_ERR_NOT_SAME
MPI_ERR_OP33MPI_ERR_OP
MPI_ERR_OTHER34MPI_ERR_OTHER
MPI_ERR_PENDING35MPI_ERR_PENDING
MPI_ERR_PORT36MPI_ERR_PORT
MPI_ERR_PROC_ABORTED37MPI_ERR_PROC_ABORTED
MPI_ERR_QUOTA38MPI_ERR_QUOTA
MPI_ERR_RANK39MPI_ERR_RANK
MPI_ERR_READ_ONLY40MPI_ERR_READ_ONLY
MPI_ERR_REQUEST41MPI_ERR_REQUEST
MPI_ERR_RMA_ATTACH42MPI_ERR_RMA_ATTACH
MPI_ERR_RMA_CONFLICT43MPI_ERR_RMA_CONFLICT
MPI_ERR_RMA_FLAVOR44MPI_ERR_RMA_FLAVOR
MPI_ERR_RMA_RANGE45MPI_ERR_RMA_RANGE
MPI_ERR_RMA_SHARED46MPI_ERR_RMA_SHARED
MPI_ERR_RMA_SYNC47MPI_ERR_RMA_SYNC
MPI_ERR_ROOT48MPI_ERR_ROOT
MPI_ERR_SERVICE49MPI_ERR_SERVICE
MPI_ERR_SESSION50MPI_ERR_SESSION
MPI_ERR_SIZE51MPI_ERR_SIZE
MPI_ERR_SPAWN52MPI_ERR_SPAWN
MPI_ERR_TAG53MPI_ERR_TAG
MPI_ERR_TOPOLOGY54MPI_ERR_TOPOLOGY
MPI_ERR_TRUNCATE55MPI_ERR_TRUNCATE
MPI_ERR_TYPE56MPI_ERR_TYPE
MPI_ERR_UNKNOWN57MPI_ERR_UNKNOWN
MPI_ERR_UNSUPPORTED_DATAREP58MPI_ERR_UNSUPPORTED_DATAREP
MPI_ERR_UNSUPPORTED_OPERATION59MPI_ERR_UNSUPPORTED_OPERATION
MPI_ERR_VALUE_TOO_LARGE60MPI_ERR_VALUE_TOO_LARGE
MPI_ERR_WIN61MPI_ERR_WIN
MPI_ERR_LASTCODE62MPI_ERR_LASTCODE