/* Functions regarding broadcat op that sends to every one else except me */ void CmiSyncBroadcastFn1(int size, char *msg) { int i, mype; CQdCreate(CpvAccess(cQdState), CmiNumPes()-1); /*record the rank to avoid re-sending the msg in spanning tree or hypercube*/ CMI_DEST_RANK(msg) = CmiMyRank(); #if CMK_BROADCAST_SPANNING_TREE CMI_SET_BROADCAST_ROOT(msg, CmiMyNode()+1); SendSpanningChildrenProc(size, msg); #elif CMK_BROADCAST_HYPERCUBE CMI_SET_BROADCAST_ROOT(msg, CmiMyNode()+1); SendHyperCubeProc(size, msg); #else mype = CmiMyPe(); #if CMK_SMP /* In SMP, this function may be called from comm thread with a larger pe */ if(mype >= _Cmi_numpes){ for(i=0; i<_Cmi_numpes; i++) CmiSyncSendFn(i, size, msg); return; } #endif for ( i=mype+1; i<_Cmi_numpes; i++ ) CmiSyncSendFn(i, size, msg) ; for ( i=0; i<mype; i++ ) CmiSyncSendFn(i, size, msg) ; #endif /*CmiPrintf("In SyncBroadcast broadcast\n");*/ }
CmiCommHandle CmiAsyncBroadcastFn(int size, char *msg) { #if ENSURE_MSG_PAIRORDER /* Not sure how to add the msg seq no for async broadcast messages --Chao Mei */ /* so abort here ! */ CmiAssert(0); return 0; #else int i, rank; int mype = CmiMyPe(); #if ENABLE_CONVERSE_QD CQdCreate(CpvAccess(cQdState), CmiNumPes()-1); #endif MACHSTATE1(3,"[%d] Sending async broadcast message from {",CmiMyNode()); CMI_BROADCAST_ROOT(msg) = 0; void *handle = malloc(sizeof(int)); *((int *)handle) = CmiNumPes()-1; for (i=mype+1; i<CmiNumPes(); i++) { CMI_DEST_RANK(msg) = CmiRankOf(i); lapiSendFn(CmiNodeOf(i), size, msg, DeliveredMsg, handle); } for (i=0; i<mype; i++) { CMI_DEST_RANK(msg) = CmiRankOf(i); lapiSendFn(CmiNodeOf(i), size, msg, DeliveredMsg, handle); } MACHSTATE(3,"} Sending async broadcast message end"); return handle; #endif }
void CmiSyncSendPersistent(int destPE, int size, char *msg, PersistentHandle h) { char *dupmsg = (char *) CmiAlloc(size); memcpy(dupmsg, msg, size); /* CmiPrintf("Setting root to %d\n", 0); */ if (CmiMyPe()==destPE) { CQdCreate(CpvAccess(cQdState), 1); CdsFifo_Enqueue(CpvAccess(CmiLocalQueue),dupmsg); } else CmiSendPersistentMsg(h, destPE, size, dupmsg); }
void CmiSyncNodeBroadcastFn(int size, char *msg) { int mynode = CmiMyNode(); int i; CQdCreate(CpvAccess(cQdState), CmiNumNodes()-1); #if CMK_BROADCAST_SPANNING_TREE CMI_SET_BROADCAST_ROOT(msg, -CmiMyNode()-1); SendSpanningChildrenNode(size, msg); #elif CMK_BROADCAST_HYPERCUBE CMI_SET_BROADCAST_ROOT(msg, -CmiMyNode()-1); SendHyperCubeNode(size, msg); #else for (i=mynode+1; i<CmiNumNodes(); i++) CmiSyncNodeSendFn(i, size, msg); for (i=0; i<mynode; i++) CmiSyncNodeSendFn(i, size, msg); #endif }
CmiCommHandle CmiAsyncNodeBroadcastFn(int size, char *msg) { int i; #if ENABLE_CONVERSE_QD CQdCreate(CpvAccess(cQdState), CmiNumNodes()-1); #endif MACHSTATE1(3,"[%d] Sending async node broadcast message from {",CmiMyNode()); CMI_BROADCAST_ROOT(msg) = 0; CMI_DEST_RANK(msg) =DGRAM_NODEMESSAGE; void *handle = malloc(sizeof(int)); *((int *)handle) = CmiNumNodes()-1; for (i=CmiMyNode()+1; i<CmiNumNodes(); i++) { lapiSendFn(i, size, msg, DeliveredMsg, handle); } for (i=0; i<CmiMyNode(); i++) { lapiSendFn(i, size, msg, DeliveredMsg, handle); } MACHSTATE(3,"} Sending async broadcast message end"); return handle; }