Process groups (Work in progress)
Scheduler operations - C+=A*B is always executed using EC of
C. - A or B can either be distributed on a PG larger than
C’s PG or replicated. - C can be either distributed on a PG
smaller than A or B’s PG or replicated. - Entire contraction
can be executed on a sub-group when A,B,C are allocated on world
group.
Utility routines A call to a utility routine assumes that the routine is executed on the process group (PG) within an ExecutionContext (EC) on which the tensor is created. If not, two possibilties exist:
A
tensoris created on a larger PG and the routine is executed on a smaller PG in which case the execution context representing the smaller PG must be passed to the routine. If not passed, this can result in MPI runtime errors and cannot be error-checked within TAMM.Execute routine using (smaller) EC passed.
U_NT: If smaller EC is passed, the new tensor returned is created using it.Todo: Check if EC passed is actually a subset of larger EC, if not this is case 2 (ignore EC passed).Possible Soln: maintain global context that tracks which PG/EC is currently active?
A tensor is created on a smaller PG and the routine is executed by a larger PG - new tensor returned always on smaller PG. Ignore optionally passed larger EC.
Execute routine on smaller PG extracted from tensor as usual.
It will work if the tensor is replicated per rank ie smaller PG=
MPI_Comm_SELFU_NT: return new replicated tensor created using smaller PG - already handled
If not replicated, for all other cases not possible to write such code with
group_incl? - can write ifcomm_splitis used
ProcGroup gpg{GA_MPI_Comm()}; //Create subcomm using group_incl // ranks not in subcomm have MPI_COMM_NULL if (subcomm != MPI_COMM_NULL) { ProcGroup pg{subcomm}; ... //Create tensor on smaller pg call util_name(tensor) } // if comm_split is used - all ranks have a valid comm, unless color=MPI_UNDEFINED which is eqv. to above code snippet. ProcGroup pg{subcomm}; // create tensor using pg - ranks that dont need the tensor also create it call util_name(tensor) - this should already work?Solution: Don’t worry sincegroup_inclcase is not possible to write andcomm_splitwill always work?