void trace_communicationAt (unsigned ptask, unsigned task_s, unsigned thread_s, unsigned vthread_s, unsigned task_r, unsigned thread_r, unsigned vthread_r, event_t *send_begin, event_t *send_end, event_t *recv_begin, event_t *recv_end, int atposition, off_t position) { thread_t *thread_r_info, *thread_s_info; unsigned long long log_s, log_r, phy_s, phy_r; unsigned cpu_r, cpu_s; /* Look for the receive partner ... in the sender events */ thread_r_info = GET_THREAD_INFO(ptask, task_r, thread_r); cpu_r = thread_r_info->cpu; /* Look for the sender partner ... in the receiver events */ thread_s_info = GET_THREAD_INFO(ptask, task_s, thread_s); cpu_s = thread_s_info->cpu; /* Synchronize event times */ log_s = TIMESYNC(ptask-1, task_s-1, Get_EvTime (send_begin)); phy_s = TIMESYNC(ptask-1, task_s-1, Get_EvTime (send_end)); log_r = TIMESYNC(ptask-1, task_r-1, Get_EvTime (recv_begin)); phy_r = TIMESYNC(ptask-1, task_r-1, Get_EvTime (recv_end)); #if defined(DEBUG) fprintf (stderr, "trace_communicationAt: %u.%u.%u -> %u.%u.%u atposition=%d position=%llu\n", ptask, task_s, thread_s, ptask, task_r, thread_r, atposition, position); #endif trace_paraver_communication (cpu_s, ptask, task_s, thread_s, vthread_s, log_s, phy_s, cpu_r, ptask, task_r, thread_r, vthread_r, log_r, phy_r, Get_EvSize (recv_end), Get_EvTag (recv_end), atposition, position); }
int trace_pending_communication (unsigned int ptask, unsigned int task, unsigned int thread, unsigned vthread, event_t * begin_s, event_t * end_s, unsigned int recvr) { unsigned long long log_s, phy_s; /* Synchronize event times */ log_s = TIMESYNC (ptask-1, task-1, Get_EvTime (begin_s)); phy_s = TIMESYNC (ptask-1, task-1, Get_EvTime (end_s)); trace_paraver_pending_communication (task, ptask, task, thread, vthread, log_s, phy_s, recvr + 1, ptask, recvr + 1, thread /* 1? */ , thread /*vthread_r?*/, 0ULL, 0ULL, Get_EvSize (begin_s), Get_EvTag (begin_s)); return 0; }
int main(int argc, char **argv) { int ntasks = 4; TimeSync_Initialize (1, &ntasks); TimeSync_SetInitialTime (0, 0, 20, 80, "node1"); TimeSync_SetInitialTime (0, 1, 10, 30, "node1"); TimeSync_SetInitialTime (0, 2, 5, 75, "node2"); TimeSync_SetInitialTime (0, 3, 15, 60, "node2"); TimeSync_CalculateLatencies (TS_NODE); fprintf(stderr, "TIMESYNC(0, 0, 20) = %llu\n", TIMESYNC(0, 0, 20)); fprintf(stderr, "TIMESYNC(0, 0, 80) = %llu\n", TIMESYNC(0, 0, 80)); fprintf(stderr, "TIMESYNC(0, 1, 10) = %llu\n", TIMESYNC(0, 1, 10)); fprintf(stderr, "TIMESYNC(0, 1, 30) = %llu\n", TIMESYNC(0, 1, 30)); fprintf(stderr, "TIMESYNC(0, 2, 5) = %llu\n", TIMESYNC(0, 2, 5)); fprintf(stderr, "TIMESYNC(0, 2, 75) = %llu\n", TIMESYNC(0, 2, 75)); fprintf(stderr, "TIMESYNC(0, 3, 15) = %llu\n", TIMESYNC(0, 3, 15)); fprintf(stderr, "TIMESYNC(0, 3, 60) = %llu\n", TIMESYNC(0, 3, 60)); return 0; }
int MPI_PersistentRequest_Event (event_t * current_event, unsigned long long current_time, unsigned int cpu, unsigned int ptask, unsigned int task, unsigned int thread, FileSet_t *fset) { thread_t *thread_info; task_t *task_info, *task_info_partner; event_t *recv_begin, *recv_end; event_t *send_begin, *send_end; off_t send_position; unsigned recv_thread, send_thread, recv_vthread, send_vthread; int EvComm; EvComm = Get_EvComm( current_event ); thread_info = GET_THREAD_INFO(ptask, task, thread); task_info = GET_TASK_INFO(ptask, task); trace_paraver_state (cpu, ptask, task, thread, current_time); /* If this is a send, look for the receive */ if (Get_EvValue (current_event) == MPI_ISEND_EV) { thread_info->Send_Rec = current_event; if (MatchComms_Enabled(ptask, task)) { if (MPI_PROC_NULL != Get_EvTarget (current_event)) { int target_ptask = intercommunicators_get_target_ptask( ptask, task, EvComm ); if (isTaskInMyGroup (fset, target_ptask-1, Get_EvTarget(current_event))) { #if defined(DEBUG) fprintf (stderr, "PERS_REQ_ISEND_CMD(%u): TIME/TIMESTAMP %lld/%lld IAM %d PARTNER %d tag %d\n", Get_EvValue (current_event), current_time, Get_EvTime(current_event), task-1, Get_EvTarget(current_event), Get_EvTag(current_event)); #endif task_info_partner = GET_TASK_INFO(target_ptask, Get_EvTarget(current_event)+1); CommunicationQueues_ExtractRecv (task_info_partner->recv_queue, task-1, Get_EvTag (current_event), &recv_begin, &recv_end, &recv_thread, &recv_vthread, 0); if (recv_begin == NULL || recv_end == NULL) { off_t position; #if defined(DEBUG) fprintf (stderr, "PER_REQ_ISEND_CMD DID NOT find a partner\n"); #endif position = WriteFileBuffer_getPosition (thread_info->file->wfb); CommunicationQueues_QueueSend (task_info->send_queue, current_event, current_event, position, thread, thread_info->virtual_thread, Get_EvTarget(current_event), Get_EvTag(current_event), 0); trace_paraver_unmatched_communication (1, ptask, task, thread, thread_info->virtual_thread, current_time, Get_EvTime(current_event), 1, target_ptask, Get_EvTarget(current_event)+1, 1, Get_EvSize(current_event), Get_EvTag(current_event)); } else { #if defined(DEBUG) fprintf (stderr, "PER_REQ_ISEND_CMD DID NOT find a partner\n"); #endif trace_communicationAt (ptask, task, thread, thread_info->virtual_thread, target_ptask, 1+Get_EvTarget(current_event), recv_thread, recv_vthread, current_event, current_event, recv_begin, recv_end, FALSE, 0); } } #if defined(PARALLEL_MERGE) else { #if defined(DEBUG) fprintf (stdout, "SEND_CMD(%u): TIME/TIMESTAMP %lld/%lld IAM %d PARTNER %d tag %d >> PENDING\n", Get_EvEvent(current_event), current_time, Get_EvTime(current_event), task-1, Get_EvTarget(current_event), Get_EvTag(current_event)); #endif trace_pending_communication (ptask, task, thread, thread_info->virtual_thread, thread_info->Send_Rec, current_event, target_ptask, Get_EvTarget (current_event)); } #endif } } } /* If this is a receive, look for the send */ if (Get_EvValue(current_event) == MPI_IRECV_EV) { thread_info->Recv_Rec = current_event; if (MatchComms_Enabled(ptask, task)) { event_t *receive = Search_MPI_IRECVED (current_event, Get_EvAux (current_event), thread_info->file); if (NULL != receive) { int target_ptask = intercommunicators_get_target_ptask( ptask, task, EvComm ); if (MPI_PROC_NULL != Get_EvTarget(receive)) { if (isTaskInMyGroup (fset, target_ptask-1, Get_EvTarget(receive))) { #if defined(DEBUG) fprintf (stderr, "PERS_REQ_IRECV_CMD(%u): TIME/TIMESTAMP %lld/%lld IAM %d PARTNER %d tag %d\n", Get_EvValue (current_event), current_time, Get_EvTime(current_event), task-1, Get_EvTarget(receive), Get_EvTag(receive)); #endif task_info_partner = GET_TASK_INFO(ptask, Get_EvTarget(receive)+1); CommunicationQueues_ExtractSend (task_info_partner->send_queue, task-1, Get_EvTag (receive), &send_begin, &send_end, &send_position, &send_thread, &send_vthread, 0); if (NULL == send_begin || NULL == send_end) { #if defined(DEBUG) fprintf (stderr, "PER_REQ_IRECV_CMD DID NOT find a partner\n"); #endif CommunicationQueues_QueueRecv (task_info->recv_queue, current_event, receive, thread, thread_info->virtual_thread, Get_EvTarget(current_event), Get_EvTag(current_event), 0); } else if (NULL != send_begin && NULL != send_end) { #if defined(DEBUG) fprintf (stderr, "PERS_REQ_IRECV_CMD find partner (send position = %llu)\n", (unsigned long long) send_position); #endif trace_communicationAt (target_ptask, 1+Get_EvTarget(receive), send_thread, send_vthread, ptask, task, thread, thread_info->virtual_thread, send_begin, send_end, current_event, receive, TRUE, send_position); } else fprintf (stderr, "mpi2prv: Attention CommunicationQueues_ExtractSend returned send_begin = %p and send_end = %p\n", send_begin, send_end); } #if defined(PARALLEL_MERGE) else { UINT64 log_r, phy_r; log_r = TIMESYNC (ptask-1, task-1, Get_EvTime(current_event)); phy_r = TIMESYNC (ptask-1, task-1, Get_EvTime(receive)); AddForeignRecv (phy_r, log_r, Get_EvTag(receive), ptask-1, task-1, thread-1, thread_info->virtual_thread-1, target_ptask-1, Get_EvTarget(receive), fset, MatchComms_GetZone(ptask, task)); } #endif } } } } return 0; }
static int IRecv_Event (event_t * current_event, unsigned long long current_time, unsigned int cpu, unsigned int ptask, unsigned int task, unsigned int thread, FileSet_t *fset) { event_t *send_begin, *send_end; off_t send_position; unsigned EvType, EvValue, send_thread, send_vthread; thread_t *thread_info; task_t *task_info, *task_info_partner; int EvComm; thread_info = GET_THREAD_INFO(ptask, task, thread); task_info = GET_TASK_INFO(ptask, task); EvType = Get_EvEvent (current_event); EvValue = Get_EvValue (current_event); EvComm = Get_EvComm (current_event); Switch_State (STATE_IWAITMESS, (EvValue == EVT_BEGIN), ptask, task, thread); if (EvValue == EVT_END) { if (MatchComms_Enabled(ptask, task)) { event_t *receive = Search_MPI_IRECVED (current_event, Get_EvAux (current_event), thread_info->file); if (NULL != receive) { if (MPI_PROC_NULL != Get_EvTarget(receive)) { int target_ptask = intercommunicators_get_target_ptask( ptask, task, EvComm ); if (isTaskInMyGroup (fset, target_ptask-1, Get_EvTarget(receive))) { #if defined(DEBUG) fprintf (stderr, "IRECV_CMD: TIME/TIMESTAMP %lld/%lld IAM %d PARTNER %d tag %d\n", current_time, Get_EvTime(current_event), task-1, Get_EvTarget(receive), Get_EvTag(receive)); #endif task_info_partner = GET_TASK_INFO(target_ptask, Get_EvTarget(receive)+1); CommunicationQueues_ExtractSend (task_info_partner->send_queue, task-1, Get_EvTag (receive), &send_begin, &send_end, &send_position, &send_thread, &send_vthread, 0); if (NULL == send_begin || NULL == send_end) { #if defined(DEBUG) fprintf (stderr, "IRECV_CMD DID NOT find COMM\n"); #endif CommunicationQueues_QueueRecv (task_info->recv_queue, current_event, receive, thread, thread_info->virtual_thread, Get_EvTarget(receive), Get_EvTag(receive), 0); } else if (NULL != send_begin && NULL != send_end) { #if defined(DEBUG) fprintf (stderr, "IRECV_CMD find COMM (partner times = %lld/%lld)\n", Get_EvTime(send_begin), Get_EvTime(send_end)); #endif trace_communicationAt (target_ptask, 1+Get_EvTarget(receive), send_thread, send_vthread, ptask, task, thread, thread_info->virtual_thread, send_begin, send_end, current_event, receive, TRUE, send_position); } else fprintf (stderr, "mpi2prv: Attention CommunicationQueues_ExtractSend returned send_begin = %p and send_end = %p\n", send_begin, send_end); } #if defined(PARALLEL_MERGE) else { UINT64 log_r, phy_r; log_r = TIMESYNC (ptask-1, task-1, Get_EvTime(current_event)); phy_r = TIMESYNC (ptask-1, task-1, Get_EvTime(receive)); AddForeignRecv (phy_r, log_r, Get_EvTag(receive), ptask-1, task-1, thread-1, thread_info->virtual_thread-1, target_ptask-1, Get_EvTarget(receive), fset, MatchComms_GetZone(ptask, task)); } #endif } } } } trace_paraver_state (cpu, ptask, task, thread, current_time); trace_paraver_event (cpu, ptask, task, thread, current_time, EvType, EvValue); return 0; }
static int SendRecv_Event (event_t * current_event, unsigned long long current_time, unsigned int cpu, unsigned int ptask, unsigned int task, unsigned int thread, FileSet_t *fset) { thread_t *thread_info; task_t *task_info, *task_info_partner; #if !defined(AVOID_SENDRECV) unsigned recv_thread, send_thread, recv_vthread, send_vthread; event_t *recv_begin, *recv_end, *send_begin, *send_end; off_t send_position; #endif int EvComm = Get_EvComm (current_event); Switch_State (STATE_SENDRECVOP, (Get_EvValue(current_event) == EVT_BEGIN), ptask, task, thread); trace_paraver_state (cpu, ptask, task, thread, current_time); trace_paraver_event (cpu, ptask, task, thread, current_time, Get_EvEvent(current_event), Get_EvValue(current_event)); thread_info = GET_THREAD_INFO(ptask, task, thread); task_info = GET_TASK_INFO(ptask, task); if (!get_option_merge_SkipSendRecvComms()) { if (Get_EvValue (current_event) == EVT_BEGIN) { thread_info->Send_Rec = current_event; /* Treat the send part */ if (MatchComms_Enabled(ptask, task)) if (MPI_PROC_NULL != Get_EvTarget (thread_info->Send_Rec)) { int target_ptask = intercommunicators_get_target_ptask( ptask, task, EvComm ); if (isTaskInMyGroup (fset, target_ptask-1, Get_EvTarget(thread_info->Send_Rec))) { #if defined(DEBUG) fprintf (stderr, "SENDRECV/SEND: TIME/TIMESTAMP %lld/%lld IAM %d PARTNER %d tag %d\n", current_time, Get_EvTime(thread_info->Send_Rec), task-1, Get_EvTarget(thread_info->Send_Rec), Get_EvTag(thread_info->Send_Rec)); #endif task_info_partner = GET_TASK_INFO(target_ptask, Get_EvTarget(thread_info->Send_Rec)+1); CommunicationQueues_ExtractRecv (task_info_partner->recv_queue, task-1, Get_EvTag (thread_info->Send_Rec), &recv_begin, &recv_end, &recv_thread, &recv_vthread, 0); if (recv_begin == NULL || recv_end == NULL) { off_t position; #if defined(DEBUG) fprintf (stderr, "SENDRECV/SEND DID NOT find partner\n"); #endif position = WriteFileBuffer_getPosition (thread_info->file->wfb); CommunicationQueues_QueueSend (task_info->send_queue, thread_info->Send_Rec, current_event, position, thread, thread_info->virtual_thread, Get_EvTarget(thread_info->Send_Rec), Get_EvTag(thread_info->Send_Rec), 0); trace_paraver_unmatched_communication (1, ptask, task, thread, thread_info->virtual_thread, current_time, Get_EvTime(current_event), 1, target_ptask, Get_EvTarget(current_event)+1, 1, Get_EvSize(current_event), Get_EvTag(current_event)); } else if (recv_begin != NULL && recv_end != NULL) { #if defined(DEBUG) fprintf (stderr, "SENDRECV/SEND found partner\n"); #endif trace_communicationAt (ptask, task, thread, thread_info->virtual_thread, target_ptask, 1+Get_EvTarget(thread_info->Send_Rec), recv_thread, recv_vthread, thread_info->Send_Rec, current_event, recv_begin, recv_end, FALSE, 0); } else fprintf (stderr, "mpi2prv: Attention CommunicationQueues_ExtractRecv returned recv_begin = %p and recv_end = %p\n", recv_begin, recv_end); } #if defined(PARALLEL_MERGE) else { #if defined(DEBUG) fprintf (stdout, "SEND_CMD(%u): TIME/TIMESTAMP %lld/%lld IAM %d PARTNER %d tag %d >> PENDING\n", Get_EvEvent(current_event), current_time, Get_EvTime(current_event), task-1, Get_EvTarget(current_event), Get_EvTag(current_event)); #endif trace_pending_communication (ptask, task, thread, thread_info->virtual_thread, thread_info->Send_Rec, current_event, target_ptask, Get_EvTarget (thread_info->Send_Rec)); } #endif /* PARALLEL_MERGE */ } } else if (Get_EvValue (current_event) == EVT_END) { thread_info->Recv_Rec = current_event; /* Treat the receive part */ if (MatchComms_Enabled(ptask, task)) if (MPI_PROC_NULL != Get_EvTarget (thread_info->Recv_Rec)) { int target_ptask = intercommunicators_get_target_ptask( ptask, task, EvComm ); if (isTaskInMyGroup (fset, target_ptask-1, Get_EvTarget(thread_info->Recv_Rec))) { #if defined(DEBUG) fprintf (stderr, "SENDRECV/RECV: TIME/TIMESTAMP %lld/%lld IAM %d PARTNER %d tag %d\n", current_time, Get_EvTime(thread_info->Recv_Rec), task-1, Get_EvTarget(thread_info->Recv_Rec), Get_EvTag(thread_info->Recv_Rec)); #endif task_info_partner = GET_TASK_INFO(target_ptask, Get_EvTarget(thread_info->Recv_Rec)+1); CommunicationQueues_ExtractSend (task_info_partner->send_queue, task-1, Get_EvTag (thread_info->Recv_Rec), &send_begin, &send_end, &send_position, &send_thread, &send_vthread, 0); if (NULL == send_begin && NULL == send_end) { #if defined(DEBUG) fprintf (stderr, "SENDRECV/RECV DID NOT find partner\n"); #endif CommunicationQueues_QueueRecv (task_info->recv_queue, thread_info->Send_Rec, current_event, thread, thread_info->virtual_thread, Get_EvTarget(thread_info->Recv_Rec), Get_EvTag(thread_info->Recv_Rec), 0); } else if (NULL != send_begin && NULL != send_end) { #if defined(DEBUG) fprintf (stderr, "SENDRECV/RECV found partner\n"); #endif trace_communicationAt (target_ptask, 1+Get_EvTarget(thread_info->Recv_Rec), send_thread, send_vthread, ptask, task, thread, thread_info->virtual_thread, send_begin, send_end, thread_info->Send_Rec, thread_info->Recv_Rec, TRUE, send_position); } else fprintf (stderr, "mpi2prv: Attention CommunicationQueues_ExtractSend returned send_begin = %p and send_end = %p\n", send_begin, send_end); } #if defined(PARALLEL_MERGE) else { UINT64 log_r, phy_r; log_r = TIMESYNC (ptask-1, task-1, Get_EvTime(thread_info->Send_Rec)); phy_r = TIMESYNC (ptask-1, task-1, Get_EvTime(current_event)); AddForeignRecv (phy_r, log_r, Get_EvTag(current_event), ptask-1, task-1, thread-1, thread_info->virtual_thread-1, target_ptask-1, Get_EvTarget(current_event), fset, MatchComms_GetZone(ptask, task)); } #endif /* PARALLEL_MERGE */ } } } return 0; }