這是我第一次在這裏發佈,所以請原諒任何格式問題。STDIN似乎在打電話給「系統」後調用mpiexec
我有一個交互式程序,它產生外部進程並監視它們的IO。事情工作正常,直到我用「mpiexec」產生了一些東西,之後STDIN似乎中斷了。
我意識到這對大多數人來說很難重現,但如果任何人看到任何明顯的或知道這個問題....請幫助!
這裏有一個片段:
int main(...)
{
std::string choice;
while(std::getline(std::cin,choice)){
if(!choice.empty()){
if(choice == "Parallel"){
system("mpiexec ./aprogram");
}
if(choice == "Serial"){
system("./aprogram");
}
// Now the external process is done... so far, so good
std::cout << "Program is done. Press ENTER to continue."
<< std::endl;
// This next line *works* if the external process was serial
// But *fails* when "mpiexec" was invoked
std::getline(std::cin,choice);
if(std::cin.eof()){
std::cout << "STDIN has been closed." << std::endl;
exit(1);
}
}
}
}
我已經試過各種事情很多,例如管道,明確的分支,精細的描述符管理。最奇怪的是,如果我複製並保存stdin,然後在「mpiexec」返回後恢復它,那麼我不再在std :: cin上獲得EOF,而是std :: getline(std :: cin,...) )不再阻止!程序進入一個無限循環,在std :: readline調用中讀取std :: cin中的零字節。
如果當外部進程在mpiexec下運行時,我將一堆數據堆棧到std :: cin(例如,通過鍵入),然後對std :: readline的後續調用正確地解析了我卡住的數據行在那裏,但是再次......一旦讀完這些數據,它就會繼續進入一個無限循環(即不會阻止std :: readline(std :: cin,..),即使沒有數據閱讀!唉,太煩人。
任何幫助深表感謝。
乾杯!
您在哪個平臺上使用哪種MPI實現? –
我們目前在幾個不同的基於Linux的平臺(大多數是基於S.L.或CentOS的平臺)上使用基於MPICH的MPI實現(包括MVAPICH,vanilla MPICH2和MPICH-MX)。我還沒有嘗試過使用OpenMPI,但是這個集成系統中的一些應用程序對OpenMPI並不滿意。我相信問題必須圍繞「mpiexec」與STDIN所做的事情爲中心。我會嘗試獲得更好的片段,以便可以用香草mpich輕鬆複製。 – user1950175
我可以用您的示例代碼和MPICH-3.0.1重現您的問題。我正在研究它。 –