0
저는 MPI 라이브러리가있는 C++로 프로그램을 작성하고 있습니다. 하나의 노드 만 작동하는 교착 상태가 있습니다! 집단 작업을 보내거나 사용하지 않고 두 가지 집단 기능 (MPI_Allreduce
및 MPI_Bcast
) 만 사용합니다. 노드가 다른 노드가 무언가를 보내거나받을 때까지 대기하는 경우 실제로이 교착 상태의 원인을 이해하지 못합니다. 다른 하나는 여전히 루프를 실행하는 모든 "마스터"과정으로MPI 교착 상태로 인한 교착 상태
void ParaStochSimulator::first_reacsimulator() {
SimulateSingleRun();
}
double ParaStochSimulator::deterMinTau() {
//calcualte minimum tau for this process
l_nLocalMinTau = calc_tau(); //min tau for each node
MPI_Allreduce(&l_nLocalMinTau, &l_nGlobalMinTau, 1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD);
//min tau for all nodes
//check if I have the min value
if (l_nLocalMinTau <= l_nGlobalMinTau && m_nCurrentTime < m_nOutputEndPoint) {
FireTransition(m_nMinTransPos);
CalculateAllHazardValues();
}
return l_nGlobalMinTau;
}
void ParaStochSimulator::SimulateSingleRun() {
//prepare a run
PrepareRun();
while ((m_nCurrentTime < m_nOutputEndPoint) && IsSimulationRunning()) {
deterMinTau();
if (mnprocess_id == 0) { //master
SimulateSingleStep();
std::cout << "current time:*****" << m_nCurrentTime << std::endl;
broad_casting(m_nMinTransPos);
MPI_Bcast(&l_anMarking, l_nMinplacesPos.size(), MPI_DOUBLE, 0, MPI_COMM_WORLD);
//std::cout << "size of mani place :" << l_nMinplacesPos.size() << std::endl;
}
}
MPI_Bcast(&l_anMarking, l_nMinplacesPos.size(), MPI_DOUBLE, 0, MPI_COMM_WORLD);
PostProcessRun();
}
이 도와 주셔서 감사하지만 불행히도 내가 마스터를 형성하는 방송 제거하고 여전히 교착 상태입니다 -_- –