'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 ¶
mpi.allreduce
(mpi::AllReduceOp) ¶
Equivalent to MPI_Allreduce(sendbuf, recvbuf, op, MPI_COMM_WORLD)
Syntax:
operation ::= `mpi.allreduce` `(` $sendbuf `,` $recvbuf `,` $op `)` attr-dict `:`type($sendbuf) `,` type($recvbuf)(`->` type($retval)^)?
MPI_Allreduce performs a reduction operation on the values in the sendbuf array and stores the result in the recvbuf array. The operation is performed across all processes in the communicator.
The op
attribute specifies the reduction operation to be performed.
Currently only the MPI_Op
predefined in the standard (e.g. MPI_SUM
) are
supported.
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.
Attributes: ¶
Attribute | MLIR Type | Description |
---|---|---|
op | ::mlir::mpi::MPI_OpClassEnumAttr | MPI operation classEnum cases:
|
Operands: ¶
Operand | Description |
---|---|
sendbuf | memref of any type values |
recvbuf | memref of any type values |
Results: ¶
Result | Description |
---|---|
retval | MPI function call return value (!mpi.retval) |
mpi.barrier
(mpi::Barrier) ¶
Equivalent to MPI_Barrier(MPI_COMM_WORLD)
Syntax:
operation ::= `mpi.barrier` attr-dict (`:` type($retval) ^)?
MPI_Barrier blocks execution until all processes in the communicator have reached this routine.
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: ¶
Result | Description |
---|---|
retval | MPI function call return value (!mpi.retval) |
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: ¶
Result | Description |
---|---|
retval | MPI function call return value (!mpi.retval) |
rank | 32-bit signless integer |
mpi.comm_size
(mpi::CommSizeOp) ¶
Get the size of the group associated to the communicator, equivalent to MPI_Comm_size(MPI_COMM_WORLD, &size)
Syntax:
operation ::= `mpi.comm_size` 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: ¶
Result | Description |
---|---|
retval | MPI function call return value (!mpi.retval) |
size | 32-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: ¶
Operand | Description |
---|---|
val | MPI function call return value (!mpi.retval) |
Results: ¶
Result | Description |
---|---|
errclass | MPI function call return value (!mpi.retval) |
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: ¶
Result | Description |
---|---|
retval | MPI function call return value (!mpi.retval) |
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: ¶
Result | Description |
---|---|
retval | MPI function call return value (!mpi.retval) |
mpi.irecv
(mpi::IRecvOp) ¶
Equivalent to MPI_Irecv(ptr, size, dtype, dest, tag, MPI_COMM_WORLD, &req)
Syntax:
operation ::= `mpi.irecv` `(` $ref `,` $tag `,` $rank `)` attr-dict `:`type($ref) `,` type($tag) `,` type($rank) `->`type(results)
MPI_Irecv begins a non-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 supported for now.
This operation can optionally return an !mpi.retval
value that can be used
to check for errors.
Operands: ¶
Operand | Description |
---|---|
ref | memref of any type values |
tag | 32-bit signless integer |
rank | 32-bit signless integer |
Results: ¶
Result | Description |
---|---|
retval | MPI function call return value (!mpi.retval) |
req | MPI asynchronous request handler |
mpi.isend
(mpi::ISendOp) ¶
Equivalent to MPI_Isend(ptr, size, dtype, dest, tag, MPI_COMM_WORLD)
Syntax:
operation ::= `mpi.isend` `(` $ref `,` $tag `,` $rank `)` attr-dict `:` type($ref) `,` type($tag) `,` type($rank) `->` type(results)
MPI_Isend begins a non-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 supported for now.
This operation can optionally return an !mpi.retval
value that can be used
to check for errors.
Operands: ¶
Operand | Description |
---|---|
ref | memref of any type values |
tag | 32-bit signless integer |
rank | 32-bit signless integer |
Results: ¶
Result | Description |
---|---|
retval | MPI function call return value (!mpi.retval) |
req | MPI asynchronous request handler |
mpi.recv
(mpi::RecvOp) ¶
Equivalent to MPI_Recv(ptr, size, dtype, source, tag, MPI_COMM_WORLD, MPI_STATUS_IGNORE)
Syntax:
operation ::= `mpi.recv` `(` $ref `,` $tag `,` $source `)` attr-dict `:` type($ref) `,` type($tag) `,` type($source)(`->` type($retval)^)?
MPI_Recv performs a blocking receive of size
elements of type dtype
from rank source
. 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 supported 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: ¶
Operand | Description |
---|---|
ref | memref of any type values |
tag | 32-bit signless integer |
source | 32-bit signless integer |
Results: ¶
Result | Description |
---|---|
retval | MPI function call return value (!mpi.retval) |
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: ¶
Attribute | MLIR Type | Description |
---|---|---|
errclass | ::mlir::mpi::MPI_ErrorClassEnumAttr | MPI error class nameEnum cases:
|
Operands: ¶
Operand | Description |
---|---|
val | MPI function call return value (!mpi.retval) |
Results: ¶
Result | Description |
---|---|
res | 1-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 `,` $dest `)` attr-dict `:` type($ref) `,` type($tag) `,` type($dest)(`->` 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 supported for now.
This operation can optionally return an !mpi.retval
value that can be used
to check for errors.
Operands: ¶
Operand | Description |
---|---|
ref | memref of any type values |
tag | 32-bit signless integer |
dest | 32-bit signless integer |
Results: ¶
Result | Description |
---|---|
retval | MPI function call return value (!mpi.retval) |
mpi.wait
(mpi::Wait) ¶
Equivalent to MPI_Wait(req, MPI_STATUS_IGNORE)
Syntax:
operation ::= `mpi.wait` `(` $req `)` attr-dict `:` type($req) (`->` type($retval) ^)?
MPI_Wait blocks execution until the request has completed.
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: ¶
Operand | Description |
---|---|
req | MPI asynchronous request handler |
Results: ¶
Result | Description |
---|---|
retval | MPI function call return value (!mpi.retval) |
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: ¶
Parameter | C++ type | Description |
---|---|---|
value | ::mlir::mpi::MPI_ErrorClassEnum | an enum of type MPI_ErrorClassEnum |
MPI_OpClassEnumAttr ¶
MPI operation class
Syntax:
#mpi.opclass<
::mlir::mpi::MPI_OpClassEnum # value
>
Enum cases:
- MPI_OP_NULL (
MPI_OP_NULL
) - MPI_MAX (
MPI_MAX
) - MPI_MIN (
MPI_MIN
) - MPI_SUM (
MPI_SUM
) - MPI_PROD (
MPI_PROD
) - MPI_LAND (
MPI_LAND
) - MPI_BAND (
MPI_BAND
) - MPI_LOR (
MPI_LOR
) - MPI_BOR (
MPI_BOR
) - MPI_LXOR (
MPI_LXOR
) - MPI_BXOR (
MPI_BXOR
) - MPI_MINLOC (
MPI_MINLOC
) - MPI_MAXLOC (
MPI_MAXLOC
) - MPI_REPLACE (
MPI_REPLACE
)
Parameters: ¶
Parameter | C++ type | Description |
---|---|---|
value | ::mlir::mpi::MPI_OpClassEnum | an enum of type MPI_OpClassEnum |
Types ¶
RequestType ¶
MPI asynchronous request handler
Syntax: !mpi.request
This type represents a handler to an asynchronous request.
RetvalType ¶
MPI function call return value (!mpi.retval)
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.
StatusType ¶
MPI reception operation status type
Syntax: !mpi.status
This type represents the status of a reception operation.
Enums ¶
MPI_ErrorClassEnum ¶
MPI error class name
Cases: ¶
Symbol | Value | String |
---|---|---|
MPI_SUCCESS | 0 | MPI_SUCCESS |
MPI_ERR_ACCESS | 1 | MPI_ERR_ACCESS |
MPI_ERR_AMODE | 2 | MPI_ERR_AMODE |
MPI_ERR_ARG | 3 | MPI_ERR_ARG |
MPI_ERR_ASSERT | 4 | MPI_ERR_ASSERT |
MPI_ERR_BAD_FILE | 5 | MPI_ERR_BAD_FILE |
MPI_ERR_BASE | 6 | MPI_ERR_BASE |
MPI_ERR_BUFFER | 7 | MPI_ERR_BUFFER |
MPI_ERR_COMM | 8 | MPI_ERR_COMM |
MPI_ERR_CONVERSION | 9 | MPI_ERR_CONVERSION |
MPI_ERR_COUNT | 10 | MPI_ERR_COUNT |
MPI_ERR_DIMS | 11 | MPI_ERR_DIMS |
MPI_ERR_DISP | 12 | MPI_ERR_DISP |
MPI_ERR_DUP_DATAREP | 13 | MPI_ERR_DUP_DATAREP |
MPI_ERR_ERRHANDLER | 14 | MPI_ERR_ERRHANDLER |
MPI_ERR_FILE | 15 | MPI_ERR_FILE |
MPI_ERR_FILE_EXISTS | 16 | MPI_ERR_FILE_EXISTS |
MPI_ERR_FILE_IN_USE | 17 | MPI_ERR_FILE_IN_USE |
MPI_ERR_GROUP | 18 | MPI_ERR_GROUP |
MPI_ERR_INFO | 19 | MPI_ERR_INFO |
MPI_ERR_INFO_KEY | 20 | MPI_ERR_INFO_KEY |
MPI_ERR_INFO_NOKEY | 21 | MPI_ERR_INFO_NOKEY |
MPI_ERR_INFO_VALUE | 22 | MPI_ERR_INFO_VALUE |
MPI_ERR_IN_STATUS | 23 | MPI_ERR_IN_STATUS |
MPI_ERR_INTERN | 24 | MPI_ERR_INTERN |
MPI_ERR_IO | 25 | MPI_ERR_IO |
MPI_ERR_KEYVAL | 26 | MPI_ERR_KEYVAL |
MPI_ERR_LOCKTYPE | 27 | MPI_ERR_LOCKTYPE |
MPI_ERR_NAME | 28 | MPI_ERR_NAME |
MPI_ERR_NO_MEM | 29 | MPI_ERR_NO_MEM |
MPI_ERR_NO_SPACE | 30 | MPI_ERR_NO_SPACE |
MPI_ERR_NO_SUCH_FILE | 31 | MPI_ERR_NO_SUCH_FILE |
MPI_ERR_NOT_SAME | 32 | MPI_ERR_NOT_SAME |
MPI_ERR_OP | 33 | MPI_ERR_OP |
MPI_ERR_OTHER | 34 | MPI_ERR_OTHER |
MPI_ERR_PENDING | 35 | MPI_ERR_PENDING |
MPI_ERR_PORT | 36 | MPI_ERR_PORT |
MPI_ERR_PROC_ABORTED | 37 | MPI_ERR_PROC_ABORTED |
MPI_ERR_QUOTA | 38 | MPI_ERR_QUOTA |
MPI_ERR_RANK | 39 | MPI_ERR_RANK |
MPI_ERR_READ_ONLY | 40 | MPI_ERR_READ_ONLY |
MPI_ERR_REQUEST | 41 | MPI_ERR_REQUEST |
MPI_ERR_RMA_ATTACH | 42 | MPI_ERR_RMA_ATTACH |
MPI_ERR_RMA_CONFLICT | 43 | MPI_ERR_RMA_CONFLICT |
MPI_ERR_RMA_FLAVOR | 44 | MPI_ERR_RMA_FLAVOR |
MPI_ERR_RMA_RANGE | 45 | MPI_ERR_RMA_RANGE |
MPI_ERR_RMA_SHARED | 46 | MPI_ERR_RMA_SHARED |
MPI_ERR_RMA_SYNC | 47 | MPI_ERR_RMA_SYNC |
MPI_ERR_ROOT | 48 | MPI_ERR_ROOT |
MPI_ERR_SERVICE | 49 | MPI_ERR_SERVICE |
MPI_ERR_SESSION | 50 | MPI_ERR_SESSION |
MPI_ERR_SIZE | 51 | MPI_ERR_SIZE |
MPI_ERR_SPAWN | 52 | MPI_ERR_SPAWN |
MPI_ERR_TAG | 53 | MPI_ERR_TAG |
MPI_ERR_TOPOLOGY | 54 | MPI_ERR_TOPOLOGY |
MPI_ERR_TRUNCATE | 55 | MPI_ERR_TRUNCATE |
MPI_ERR_TYPE | 56 | MPI_ERR_TYPE |
MPI_ERR_UNKNOWN | 57 | MPI_ERR_UNKNOWN |
MPI_ERR_UNSUPPORTED_DATAREP | 58 | MPI_ERR_UNSUPPORTED_DATAREP |
MPI_ERR_UNSUPPORTED_OPERATION | 59 | MPI_ERR_UNSUPPORTED_OPERATION |
MPI_ERR_VALUE_TOO_LARGE | 60 | MPI_ERR_VALUE_TOO_LARGE |
MPI_ERR_WIN | 61 | MPI_ERR_WIN |
MPI_ERR_LASTCODE | 62 | MPI_ERR_LASTCODE |
MPI_OpClassEnum ¶
MPI operation class
Cases: ¶
Symbol | Value | String |
---|---|---|
MPI_OP_NULL | 0 | MPI_OP_NULL |
MPI_MAX | 1 | MPI_MAX |
MPI_MIN | 2 | MPI_MIN |
MPI_SUM | 3 | MPI_SUM |
MPI_PROD | 4 | MPI_PROD |
MPI_LAND | 5 | MPI_LAND |
MPI_BAND | 6 | MPI_BAND |
MPI_LOR | 7 | MPI_LOR |
MPI_BOR | 8 | MPI_BOR |
MPI_LXOR | 9 | MPI_LXOR |
MPI_BXOR | 10 | MPI_BXOR |
MPI_MINLOC | 11 | MPI_MINLOC |
MPI_MAXLOC | 12 | MPI_MAXLOC |
MPI_REPLACE | 13 | MPI_REPLACE |