Examples
Example 1
In this example we show basic operations how to create and access specific sets or processor groups. To start we begin by importing the necessary modules.
# ==============================================================================
# Import modules
# ==============================================================================
from mpi4py import MPI
from multipoint import multiPointSparse
In this example we assume we have two codes or processor sets, codeA
and codeB
.
We assume 3 instances of codeA
where each instance requires 3, 2, and 1 processors.
For set codeB
we assume only 1 instance that requires 4 processors.
Following the creation of the points sets the communicators are created.
# ==============================================================================
# Processor allocation
# ==============================================================================
# Instantiate the multipoint object
MP = multiPointSparse(MPI.COMM_WORLD)
# Add all processor sets and create the communicators
MP.addProcessorSet("codeA", 3, [3, 2, 1])
MP.addProcessorSet("codeB", 1, 4)
comm, setComm, setFlags, groupFlags, ptID = MP.createCommunicators()
# Extract setName on a given processor for convenience
setName = MP.getSetName()
# Create all directories for all groups in all sets
ptDirs = MP.createDirectories("./output")
# For information, print out all values on all processors
print(
f"setName={setName}, comm.rank={comm.rank}, comm.size={comm.size}, setComm.rank={setComm.rank}, setComm.size={setComm.size}, setFlags={setFlags}, groupFlags={groupFlags}, ptID={ptID}"
)
Printing all values gives the following:
setName=codeA, comm.rank=1, comm.size=3, setComm.rank=1, setComm.size=6, setFlags={'codeA': True, 'codeB': False}, groupFlags=[ True False False], ptID=0
setName=codeA, comm.rank=2, comm.size=3, setComm.rank=2, setComm.size=6, setFlags={'codeA': True, 'codeB': False}, groupFlags=[ True False False], ptID=0
setName=codeA, comm.rank=0, comm.size=2, setComm.rank=3, setComm.size=6, setFlags={'codeA': True, 'codeB': False}, groupFlags=[False True False], ptID=1
setName=codeA, comm.rank=1, comm.size=2, setComm.rank=4, setComm.size=6, setFlags={'codeA': True, 'codeB': False}, groupFlags=[False True False], ptID=1
setName=codeA, comm.rank=0, comm.size=1, setComm.rank=5, setComm.size=6, setFlags={'codeA': True, 'codeB': False}, groupFlags=[False False True], ptID=2
setName=codeB, comm.rank=0, comm.size=4, setComm.rank=0, setComm.size=4, setFlags={'codeA': False, 'codeB': True}, groupFlags=[ True], ptID=0
setName=codeB, comm.rank=1, comm.size=4, setComm.rank=1, setComm.size=4, setFlags={'codeA': False, 'codeB': True}, groupFlags=[ True], ptID=0
setName=codeB, comm.rank=2, comm.size=4, setComm.rank=2, setComm.size=4, setFlags={'codeA': False, 'codeB': True}, groupFlags=[ True], ptID=0
setName=codeB, comm.rank=3, comm.size=4, setComm.rank=3, setComm.size=4, setFlags={'codeA': False, 'codeB': True}, groupFlags=[ True], ptID=0
setName=codeA, comm.rank=0, comm.size=3, setComm.rank=0, setComm.size=6, setFlags={'codeA': True, 'codeB': False}, groupFlags=[ True False False], ptID=0
To perform operations on all processors in a set we can use the setFlags.
This is convenient if we want to perform the same operation on all processors in a given set.
Furthermore, if we want to access only a specific group in a set, the ptID
can be conveniently used as shown.
# ==============================================================================
# Problem setup
# ==============================================================================
# To perform operations on all processors in a set we can use the setFlags
if setFlags["codeA"]: # Alternatively, setName == "codeA" could be used here
# ...
# To access a particular group within the set can be done using the ptID
# Here we access only the processors in the first group
if 0 == ptID:
print(f"setName={setName} comm.rank={comm.rank} ptID={ptID}")
# To access all groups (but still a specific one) we simply loop over the size of the set
for i in range(setComm.size):
if i == ptID:
print(f"setName={setName} comm.rank={comm.rank} ptID={ptID} i={i}")
# Similarly, for the other processor set
if setFlags["codeB"]:
for i in range(setComm.size):
if i == ptID:
print(f"setName={setName} comm.rank={comm.rank} ptID={ptID} i={i}")