in astra-sim-alibabacloud/astra-sim/system/LogGP.cc [119:317]
void LogGP::call(EventType event, CallData* data) {
if (event == EventType::Send_Finished) {
last_trans = Sys::boostedTick();
prevState = curState;
curState = State::Free;
subsequent_reads++;
} else if (event == EventType::Rec_Finished) {
assert(receives.size() > 0);
receives.front().total_transfer_time +=
Sys::boostedTick() - receives.front().start_time;
receives.front().start_time = Sys::boostedTick();
last_trans = Sys::boostedTick();
prevState = curState;
if (receives.size() < 2) {
curState = State::Free;
}
if (receives.front().processed == true) {
if (NPU_MEM != nullptr) {
receives.front().processed = false;
receives.front().loggp = this;
receives.front().callEvent = EventType::Consider_Process;
pre_process.push_back(receives.front());
receives.pop_front();
pre_process.back().wait_wait_for_mem_bus(--pre_process.end());
NPU_MEM->send_from_NPU_to_MA(
MemBus::Transmition::Usual,
pre_process.back().size,
false,
true,
&pre_process.back());
} else {
receives.front().processed = false;
processing.push_back(receives.front());
receives.pop_front();
}
if (processing_state == ProcState::Free && processing.size() > 0) {
processing.front().total_processing_queue_time +=
Sys::boostedTick() - processing.front().start_time;
processing.front().start_time = Sys::boostedTick();
generator->register_event(
this,
EventType::Processing_Finished,
nullptr,
((processing.front().size / 100) * local_reduction_delay) + 50);
processing_state = ProcState::Processing;
}
} else if (receives.front().send_back == true) {
if (NPU_MEM != nullptr) {
receives.front().send_back = false;
receives.front().callEvent = EventType::Consider_Send_Back;
receives.front().loggp = this;
pre_send.push_back(receives.front());
receives.pop_front();
pre_send.back().wait_wait_for_mem_bus(--pre_send.end());
NPU_MEM->send_from_NPU_to_MA(
MemBus::Transmition::Usual,
pre_send.back().size,
false,
true,
&pre_send.back());
} else {
receives.front().send_back = false;
sends.push_back(receives.front());
receives.pop_front();
}
} else {
if (NPU_MEM != nullptr) {
receives.front().callEvent = EventType::Consider_Retire;
receives.front().loggp = this;
retirements.push_back(receives.front());
retirements.back().wait_wait_for_mem_bus(--retirements.end());
NPU_MEM->send_from_NPU_to_MA(
MemBus::Transmition::Usual,
retirements.back().size,
false,
false,
&retirements.back());
receives.pop_front();
} else {
SharedBusStat* tmp = new SharedBusStat(
BusType::Shared,
receives.front().total_transfer_queue_time,
receives.front().total_transfer_time,
receives.front().total_processing_queue_time,
receives.front().total_processing_time);
tmp->update_bus_stats(BusType::Mem, receives.front());
receives.front().callable->call(trigger_event, tmp);
receives.pop_front();
}
}
} else if (event == EventType::Processing_Finished) {
assert(processing.size() > 0);
processing.front().total_processing_time +=
Sys::boostedTick() - processing.front().start_time;
processing.front().start_time = Sys::boostedTick();
processing_state = ProcState::Free;
if (processing.front().send_back == true) {
if (NPU_MEM != nullptr) {
processing.front().send_back = false;
processing.front().loggp = this;
processing.front().callEvent = EventType::Consider_Send_Back;
pre_send.push_back(processing.front());
processing.pop_front();
pre_send.back().wait_wait_for_mem_bus(--pre_send.end());
NPU_MEM->send_from_NPU_to_MA(
MemBus::Transmition::Usual,
pre_send.back().size,
false,
true,
&pre_send.back());
} else {
processing.front().send_back = false;
sends.push_back(processing.front());
processing.pop_front();
}
} else {
if (NPU_MEM != nullptr) {
processing.front().callEvent = EventType::Consider_Retire;
processing.front().loggp = this;
retirements.push_back(processing.front());
retirements.back().wait_wait_for_mem_bus(--retirements.end());
NPU_MEM->send_from_NPU_to_MA(
MemBus::Transmition::Usual,
retirements.back().size,
false,
false,
&retirements.back());
processing.pop_front();
} else {
SharedBusStat* tmp = new SharedBusStat(
BusType::Shared,
processing.front().total_transfer_queue_time,
processing.front().total_transfer_time,
processing.front().total_processing_queue_time,
processing.front().total_processing_time);
tmp->update_bus_stats(BusType::Mem, processing.front());
processing.front().callable->call(trigger_event, tmp);
processing.pop_front();
}
}
if (processing.size() > 0) {
processing.front().total_processing_queue_time +=
Sys::boostedTick() - processing.front().start_time;
processing.front().start_time = Sys::boostedTick();
processing_state = ProcState::Processing;
generator->register_event(
this,
EventType::Processing_Finished,
nullptr,
((processing.front().size / 100) * local_reduction_delay) + 50);
}
} else if (event == EventType::Consider_Retire) {
SharedBusStat* tmp = new SharedBusStat(
BusType::Shared,
retirements.front().total_transfer_queue_time,
retirements.front().total_transfer_time,
retirements.front().total_processing_queue_time,
retirements.front().total_processing_time);
MemMovRequest movRequest = *talking_it;
tmp->update_bus_stats(BusType::Mem, movRequest);
movRequest.callable->call(trigger_event, tmp);
retirements.erase(talking_it);
delete data;
} else if (event == EventType::Consider_Process) {
MemMovRequest movRequest = *talking_it;
processing.push_back(movRequest);
pre_process.erase(talking_it);
if (processing_state == ProcState::Free && processing.size() > 0) {
processing.front().total_processing_queue_time +=
Sys::boostedTick() - processing.front().start_time;
processing.front().start_time = Sys::boostedTick();
generator->register_event(
this,
EventType::Processing_Finished,
nullptr,
((processing.front().size / 100) * local_reduction_delay) + 50);
processing_state = ProcState::Processing;
}
delete data;
} else if (event == EventType::Consider_Send_Back) {
assert(pre_send.size() > 0);
MemMovRequest movRequest = *talking_it;
sends.push_back(movRequest);
pre_send.erase(talking_it);
delete data;
}
if (curState == State::Free) {
if (sends.size() > 0) {
if (subsequent_reads > THRESHOLD && partner->sends.size() > 0 &&
partner->subsequent_reads <= THRESHOLD) {
if (partner->curState == State::Free) {
partner->call(EventType::General, nullptr);
}
return;
}
process_next_read();
}
}
}