Lower mpi
lower_mpi
¶
MpiLibraryInfo
dataclass
¶
This object is meant to capture characteristics of a specific MPI implementations.
It holds magic values, sizes of structs, field offsets and much more.
We need these as we currently cannot load these library headers into the programs we want to lower, therefore we need to generate our own external stubs and load magic values directly.
This way of doing it is inherently fragile, but we don't know of any better way. We plan to include a C file that automagically extracts all this information from MPI headers. You can see the current C file used in this PR: https://github.com/xdslproject/xdsl/pull/526 You can see the status of OpenMPI support here: https://github.com/xdslproject/xdsl/issues/523
These defaults have been extracted from MPICH 3.3a2. We would highly suggest running the mpi-info.c file yourself with your version of the library!
Source code in xdsl/transforms/lower_mpi.py
MPI_Datatype_size: int = 4
class-attribute
instance-attribute
¶
MPI_CHAR: int = 1275068673
class-attribute
instance-attribute
¶
MPI_SIGNED_CHAR: int = 1275068696
class-attribute
instance-attribute
¶
MPI_UNSIGNED_CHAR: int = 1275068674
class-attribute
instance-attribute
¶
MPI_BYTE: int = 1275068685
class-attribute
instance-attribute
¶
MPI_WCHAR: int = 1275069454
class-attribute
instance-attribute
¶
MPI_SHORT: int = 1275068931
class-attribute
instance-attribute
¶
MPI_UNSIGNED_SHORT: int = 1275068932
class-attribute
instance-attribute
¶
MPI_INT: int = 1275069445
class-attribute
instance-attribute
¶
MPI_UNSIGNED: int = 1275069446
class-attribute
instance-attribute
¶
MPI_LONG: int = 1275070471
class-attribute
instance-attribute
¶
MPI_UNSIGNED_LONG: int = 1275070472
class-attribute
instance-attribute
¶
MPI_FLOAT: int = 1275069450
class-attribute
instance-attribute
¶
MPI_DOUBLE: int = 1275070475
class-attribute
instance-attribute
¶
MPI_LONG_DOUBLE: int = 1275072524
class-attribute
instance-attribute
¶
MPI_LONG_LONG_INT: int = 1275070473
class-attribute
instance-attribute
¶
MPI_UNSIGNED_LONG_LONG: int = 1275070489
class-attribute
instance-attribute
¶
MPI_LONG_LONG: int = 1275070473
class-attribute
instance-attribute
¶
MPI_Op_size: int = 4
class-attribute
instance-attribute
¶
MPI_MAX: int = 1476395009
class-attribute
instance-attribute
¶
MPI_MIN: int = 1476395010
class-attribute
instance-attribute
¶
MPI_SUM: int = 1476395011
class-attribute
instance-attribute
¶
MPI_PROD: int = 1476395012
class-attribute
instance-attribute
¶
MPI_LAND: int = 1476395013
class-attribute
instance-attribute
¶
MPI_BAND: int = 1476395014
class-attribute
instance-attribute
¶
MPI_LOR: int = 1476395015
class-attribute
instance-attribute
¶
MPI_BOR: int = 1476395016
class-attribute
instance-attribute
¶
MPI_LXOR: int = 1476395017
class-attribute
instance-attribute
¶
MPI_BXOR: int = 1476395018
class-attribute
instance-attribute
¶
MPI_MINLOC: int = 1476395019
class-attribute
instance-attribute
¶
MPI_MAXLOC: int = 1476395020
class-attribute
instance-attribute
¶
MPI_REPLACE: int = 1476395021
class-attribute
instance-attribute
¶
MPI_NO_OP: int = 1476395022
class-attribute
instance-attribute
¶
MPI_Comm_size: int = 4
class-attribute
instance-attribute
¶
MPI_COMM_WORLD: int = 1140850688
class-attribute
instance-attribute
¶
MPI_COMM_SELF: int = 1140850689
class-attribute
instance-attribute
¶
MPI_Request_size: int = 4
class-attribute
instance-attribute
¶
MPI_REQUEST_NULL = 738197504
class-attribute
instance-attribute
¶
MPI_Status_size: int = 20
class-attribute
instance-attribute
¶
MPI_STATUS_IGNORE: int = 1
class-attribute
instance-attribute
¶
MPI_STATUSES_IGNORE: int = 1
class-attribute
instance-attribute
¶
MPI_Status_field_MPI_SOURCE: int = 8
class-attribute
instance-attribute
¶
MPI_Status_field_MPI_TAG: int = 12
class-attribute
instance-attribute
¶
MPI_Status_field_MPI_ERROR: int = 16
class-attribute
instance-attribute
¶
MPI_IN_PLACE: int = -1
class-attribute
instance-attribute
¶
__init__(MPI_Datatype_size: int = 4, MPI_CHAR: int = 1275068673, MPI_SIGNED_CHAR: int = 1275068696, MPI_UNSIGNED_CHAR: int = 1275068674, MPI_BYTE: int = 1275068685, MPI_WCHAR: int = 1275069454, MPI_SHORT: int = 1275068931, MPI_UNSIGNED_SHORT: int = 1275068932, MPI_INT: int = 1275069445, MPI_UNSIGNED: int = 1275069446, MPI_LONG: int = 1275070471, MPI_UNSIGNED_LONG: int = 1275070472, MPI_FLOAT: int = 1275069450, MPI_DOUBLE: int = 1275070475, MPI_LONG_DOUBLE: int = 1275072524, MPI_LONG_LONG_INT: int = 1275070473, MPI_UNSIGNED_LONG_LONG: int = 1275070489, MPI_LONG_LONG: int = 1275070473, MPI_Op_size: int = 4, MPI_MAX: int = 1476395009, MPI_MIN: int = 1476395010, MPI_SUM: int = 1476395011, MPI_PROD: int = 1476395012, MPI_LAND: int = 1476395013, MPI_BAND: int = 1476395014, MPI_LOR: int = 1476395015, MPI_BOR: int = 1476395016, MPI_LXOR: int = 1476395017, MPI_BXOR: int = 1476395018, MPI_MINLOC: int = 1476395019, MPI_MAXLOC: int = 1476395020, MPI_REPLACE: int = 1476395021, MPI_NO_OP: int = 1476395022, MPI_Comm_size: int = 4, MPI_COMM_WORLD: int = 1140850688, MPI_COMM_SELF: int = 1140850689, MPI_Request_size: int = 4, MPI_Status_size: int = 20, MPI_STATUS_IGNORE: int = 1, MPI_STATUSES_IGNORE: int = 1, MPI_Status_field_MPI_SOURCE: int = 8, MPI_Status_field_MPI_TAG: int = 12, MPI_Status_field_MPI_ERROR: int = 16, MPI_IN_PLACE: int = -1) -> None
¶
LowerMpiInit
dataclass
¶
Bases: _MPIToLLVMRewriteBase
Source code in xdsl/transforms/lower_mpi.py
match_and_rewrite(op: mpi.InitOp, rewriter: PatternRewriter)
¶
lower(op: mpi.InitOp) -> tuple[list[Operation], list[SSAValue | None]]
¶
We currently don't model any argument passing to MPI_Init() and pass two nullptrs.
Source code in xdsl/transforms/lower_mpi.py
LowerMpiFinalize
dataclass
¶
Bases: _MPIToLLVMRewriteBase
Source code in xdsl/transforms/lower_mpi.py
LowerMpiWait
dataclass
¶
Bases: _MPIToLLVMRewriteBase
Source code in xdsl/transforms/lower_mpi.py
match_and_rewrite(op: mpi.WaitOp, rewriter: PatternRewriter)
¶
lower(op: mpi.WaitOp) -> tuple[list[Operation], list[SSAValue | None]]
¶
Relatively straight forward lowering of mpi.wait operation.
Source code in xdsl/transforms/lower_mpi.py
LowerMpiWaitall
dataclass
¶
Bases: _MPIToLLVMRewriteBase
Source code in xdsl/transforms/lower_mpi.py
match_and_rewrite(op: mpi.WaitallOp, rewriter: PatternRewriter)
¶
lower(op: mpi.WaitallOp) -> tuple[list[Operation], list[SSAValue | None]]
¶
Relatively straight forward lowering of mpi.waitall operation.
Source code in xdsl/transforms/lower_mpi.py
LowerMpiReduce
dataclass
¶
Bases: _MPIToLLVMRewriteBase
Source code in xdsl/transforms/lower_mpi.py
match_and_rewrite(op: mpi.ReduceOp, rewriter: PatternRewriter)
¶
lower(op: mpi.ReduceOp) -> tuple[list[Operation], list[SSAValue | None]]
¶
Lowers the MPI Reduce operation
Source code in xdsl/transforms/lower_mpi.py
LowerMpiAllreduce
dataclass
¶
Bases: _MPIToLLVMRewriteBase
Source code in xdsl/transforms/lower_mpi.py
match_and_rewrite(op: mpi.AllreduceOp, rewriter: PatternRewriter)
¶
lower(op: mpi.AllreduceOp) -> tuple[list[Operation], list[SSAValue | None]]
¶
Lowers the MPI Allreduce operation
Source code in xdsl/transforms/lower_mpi.py
LowerMpiBcast
dataclass
¶
Bases: _MPIToLLVMRewriteBase
Source code in xdsl/transforms/lower_mpi.py
match_and_rewrite(op: mpi.BcastOp, rewriter: PatternRewriter)
¶
lower(op: mpi.BcastOp) -> tuple[list[Operation], list[SSAValue | None]]
¶
Lowers the MPI Bcast operation
Source code in xdsl/transforms/lower_mpi.py
LowerMpiIsend
dataclass
¶
Bases: _MPIToLLVMRewriteBase
Source code in xdsl/transforms/lower_mpi.py
match_and_rewrite(op: mpi.IsendOp, rewriter: PatternRewriter)
¶
lower(op: mpi.IsendOp) -> tuple[list[Operation], list[SSAValue | None]]
¶
This method lowers mpi.isend
int MPI_Isend(const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request)
Source code in xdsl/transforms/lower_mpi.py
LowerMpiIrecv
dataclass
¶
Bases: _MPIToLLVMRewriteBase
Source code in xdsl/transforms/lower_mpi.py
match_and_rewrite(op: mpi.IrecvOp, rewriter: PatternRewriter)
¶
lower(op: mpi.IrecvOp) -> tuple[list[Operation], list[SSAValue | None]]
¶
This method lowers mpi.irecv operations
int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request *request)
Source code in xdsl/transforms/lower_mpi.py
LowerMpiSend
dataclass
¶
Bases: _MPIToLLVMRewriteBase
Source code in xdsl/transforms/lower_mpi.py
match_and_rewrite(op: mpi.SendOp, rewriter: PatternRewriter)
¶
lower(op: mpi.SendOp) -> tuple[list[Operation], list[SSAValue | None]]
¶
This method lowers mpi.send operations
MPI_Send signature:
int MPI_Send(const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)
Source code in xdsl/transforms/lower_mpi.py
LowerMpiRecv
dataclass
¶
Bases: _MPIToLLVMRewriteBase
Source code in xdsl/transforms/lower_mpi.py
match_and_rewrite(op: mpi.RecvOp, rewriter: PatternRewriter)
¶
lower(op: mpi.RecvOp) -> tuple[list[Operation], list[SSAValue | None]]
¶
This method lowers mpi.recv operations
MPI_Recv signature:
int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status)
Source code in xdsl/transforms/lower_mpi.py
LowerMpiUnwrapMemRefOp
dataclass
¶
Bases: _MPIToLLVMRewriteBase
Source code in xdsl/transforms/lower_mpi.py
match_and_rewrite(op: mpi.UnwrapMemRefOp, rewriter: PatternRewriter)
¶
lower(op: mpi.UnwrapMemRefOp) -> tuple[list[Operation], list[SSAValue | None]]
¶
Source code in xdsl/transforms/lower_mpi.py
LowerMpiGetDtype
dataclass
¶
Bases: _MPIToLLVMRewriteBase
Source code in xdsl/transforms/lower_mpi.py
LowerMpiAllocateType
dataclass
¶
Bases: _MPIToLLVMRewriteBase
Source code in xdsl/transforms/lower_mpi.py
match_and_rewrite(op: mpi.AllocateTypeOp, rewriter: PatternRewriter)
¶
lower(op: mpi.AllocateTypeOp) -> tuple[list[Operation], list[SSAValue | None]]
¶
Allocation operation, allocates the required memory as an LLVM pointer
Source code in xdsl/transforms/lower_mpi.py
LowerMpiVectorGet
dataclass
¶
Bases: _MPIToLLVMRewriteBase
Source code in xdsl/transforms/lower_mpi.py
match_and_rewrite(op: mpi.VectorGetOp, rewriter: PatternRewriter)
¶
lower(op: mpi.VectorGetOp) -> tuple[list[Operation], list[SSAValue | None]]
¶
This lowers the get array at index MPI operation in the dialect. Converts the pointer to an integer and then increments this to find the correct location before going back to a pointer and setting this as the result
Source code in xdsl/transforms/lower_mpi.py
LowerMpiCommRank
dataclass
¶
Bases: _MPIToLLVMRewriteBase
Source code in xdsl/transforms/lower_mpi.py
match_and_rewrite(op: mpi.CommRankOp, rewriter: PatternRewriter)
¶
lower(op: mpi.CommRankOp) -> tuple[list[Operation], list[SSAValue | None]]
¶
This method lowers mpi.comm.rank operation
int MPI_Comm_rank(MPI_Comm comm, int *rank)
Source code in xdsl/transforms/lower_mpi.py
LowerMpiCommSize
dataclass
¶
Bases: _MPIToLLVMRewriteBase
Source code in xdsl/transforms/lower_mpi.py
match_and_rewrite(op: mpi.CommSizeOp, rewriter: PatternRewriter)
¶
lower(op: mpi.CommSizeOp) -> tuple[list[Operation], list[SSAValue | None]]
¶
This method lowers mpi.comm.size operation
int MPI_Comm_size(MPI_Comm comm, int *size)
Source code in xdsl/transforms/lower_mpi.py
LowerNullRequestOp
dataclass
¶
Bases: _MPIToLLVMRewriteBase
Source code in xdsl/transforms/lower_mpi.py
match_and_rewrite(op: mpi.NullRequestOp, rewriter: PatternRewriter)
¶
lower(op: mpi.NullRequestOp) -> tuple[list[Operation], list[SSAValue | None]]
¶
This method lowers mpi.comm.size operation
int MPI_Comm_size(MPI_Comm comm, int *size)
Source code in xdsl/transforms/lower_mpi.py
LowerMpiGatherOp
dataclass
¶
Bases: _MPIToLLVMRewriteBase
Source code in xdsl/transforms/lower_mpi.py
match_and_rewrite(op: mpi.GatherOp, rewriter: PatternRewriter)
¶
lower(op: mpi.GatherOp) -> tuple[list[Operation], list[SSAValue | None]]
¶
This method lowers mpi.gather operation.
int MPI_Gather(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)
Source code in xdsl/transforms/lower_mpi.py
LowerMPIPass
dataclass
¶
Bases: ModulePass
Source code in xdsl/transforms/lower_mpi.py
name = 'lower-mpi'
class-attribute
instance-attribute
¶
__init__() -> None
¶
apply(ctx: Context, op: builtin.ModuleOp) -> None
¶
Source code in xdsl/transforms/lower_mpi.py
add_external_func_defs(module: builtin.ModuleOp)
¶
This rewriter adds all external function definitions for MPI calls to the module.
It does so by first walking the whole module to discover MPI_ calls. Then
it inserts a func.Func.external() op with the correct types at the end of the module.
Make sure to apply this in a separate pass after the lowerings, otherwise this will match first and find no inserted MPI calls.