'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, comm)
Syntax:
operation ::= `mpi.allreduce` `(` $sendbuf `,` $recvbuf `,` $op `,` $comm `)` 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.
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 class |
Operands: ¶
Operand | Description |
---|---|
sendbuf | memref of any type values |
recvbuf | memref of any type values |
comm | MPI communicator handler |
Results: ¶
Result | Description |
---|---|
retval | MPI function call return value (!mpi.retval) |
mpi.barrier
(mpi::Barrier) ¶
Equivalent to MPI_Barrier(comm)
Syntax:
operation ::= `mpi.barrier` `(` $comm `)` attr-dict
(`->` type($retval)^)?
MPI_Barrier blocks execution until all processes in the communicator have reached this routine.
This operation can optionally return an !mpi.retval
value that can be used
to check for errors.
Operands: ¶
Operand | Description |
---|---|
comm | MPI communicator handler |
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(comm, &rank)
Syntax:
operation ::= `mpi.comm_rank` `(` $comm `)` attr-dict `:` type(results)
This operation can optionally return an !mpi.retval
value that can be used
to check for errors.
Operands: ¶
Operand | Description |
---|---|
comm | MPI communicator handler |
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(comm, &size)
Syntax:
operation ::= `mpi.comm_size` `(` $comm `)` attr-dict `:` type(results)
This operation can optionally return an !mpi.retval
value that can be used
to check for errors.
Operands: ¶
Operand | Description |
---|---|
comm | MPI communicator handler |
Results: ¶
Result | Description |
---|---|
retval | MPI function call return value (!mpi.retval) |
size | 32-bit signless integer |
mpi.comm_split
(mpi::CommSplitOp) ¶
Partition the group associated with the given communicator into disjoint subgroups
Syntax:
operation ::= `mpi.comm_split` `(` $comm `,` $color `,` $key `)` attr-dict `:` type(results)
This operation splits the communicator into multiple sub-communicators. The color value determines the group of processes that will be part of the new communicator. The key value determines the rank of the calling process in the new communicator.
This operation can optionally return an !mpi.retval
value that can be used
to check for errors.
Operands: ¶
Operand | Description |
---|---|
comm | MPI communicator handler |
color | 32-bit signless integer |
key | 32-bit signless integer |
Results: ¶
Result | Description |
---|---|
retval | MPI function call return value (!mpi.retval) |
newcomm | MPI communicator handler |
mpi.comm_world
(mpi::CommWorldOp) ¶
Get the World communicator, equivalent to MPI_COMM_WORLD
Syntax:
operation ::= `mpi.comm_world` attr-dict `:` type(results)
This operation returns the predefined MPI_COMM_WORLD communicator.
Results: ¶
Result | Description |
---|---|
comm | MPI communicator handler |
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, source, tag, comm, &req)
Syntax:
operation ::= `mpi.irecv` `(` $ref `,` $tag `,` $source `,` $comm`)` attr-dict `:` type($ref) `,` type($tag) `,` type($source)`->` type(results)
MPI_Irecv begins a non-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.
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 |
comm | MPI communicator handler |
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, comm)
Syntax:
operation ::= `mpi.isend` `(` $ref `,` $tag `,` $dest `,` $comm`)` attr-dict `:` type($ref) `,` type($tag) `,` type($dest) `->` 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.
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 |
comm | MPI communicator handler |
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, comm, MPI_STATUS_IGNORE)
Syntax:
operation ::= `mpi.recv` `(` $ref `,` $tag `,` $source `,` $comm `)` 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.
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 |
comm | MPI communicator handler |
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 name |
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, comm)
Syntax:
operation ::= `mpi.send` `(` $ref `,` $tag `,` $dest `,` $comm `)` 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.
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 |
comm | MPI communicator handler |
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
>
Parameters: ¶
Parameter | C++ type | Description |
---|---|---|
value | ::mlir::mpi::MPI_ErrorClassEnum | an enum of type MPI_ErrorClassEnum |
Types ¶
CommType ¶
MPI communicator handler
Syntax: !mpi.comm
This type represents a handler for the MPI communicator.
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 |