你好亲爱的公报,
我正在为我正在开发的并行软件创建终端动画状态报告 . 我正在使用NCurses . 我遇到了与恢复终端标准行为有关的问题 . 在运行我的软件之后,终端只有24行,无论我调用endwin()还是不调用 . 这里是简化的代码:
int size=10;
initscr();
refresh();
while(KeepAlive){
int j=1;
mvprintw(j,0,/*Blah blah header*/));
for(int i=0;i<size;i++){
j++;
mvprintw(j,0,/*Some blah blah*/);
}
refresh();
usleep(1000000);
}
endwin();
KeepAlive是由另一个线程更改的控件变量(因此while不是无限循环,而是受控循环) . 运行此软件后,我的终端只有24行,echo工作,但有足够的空白 .
非常感谢您的帮助,玩得开心
编辑:
我想在尝试解决问题时与您分享一些我发现的信息:
-
curses(ncurses)在openMP下运行完美,然后你可以想象一些执行数学计算的线程和一个线程(只有一个,请注意)给出一些运行时信息 .
-
curse(ncurses)与MPI不兼容 . 好吧,正确的陈述是与MPI兼容 . MPI对stdin / stdout / stderr非常复杂,因为所有MPI进程的所有输出都可以重定向到显示器(可以指定) . 使用任何高级终端输出覆盖库将导致代码错误或意外行为 .
这是由MPI常见问题支持的:
也许吧 . 但可能不是 . Open MPI提供相当复杂的stdin / stdout / stderr转发 . >但是,对于通常需要直接控制终端的curses,ncurses,readline或其他>复杂的I / O包,它不能很好地工作 . 每个应用程序和I / O库都不同 - 您应该尝试查看是否支持您的应用程序 . 但有可能它不会起作用 . 抱歉 . :-(
我发现即使你只指定一个MPI进程来管理所有的curses输出(只是那个进程在开始时调用initscr()而在他的代码部分结束时调用endwin())也没办法强制curses使用完整终端(只有默认的UNIX 24x80可用) . 一旦MPI完成,您的整个终端将继续以24x80模式工作,直到调用复位 .
感谢所有帮助我的公报,
玩得开心
GF
2 回答
一种可能的解决方案是将文本GUI与其余MPI代码完全分离,并使两个部分通过MPI-2的客户端/服务器机制相互通信 . 这意味着:
将GUI作为单例MPI程序运行,即调用
MPI_Init{_thread}
但不通过mpiexec
启动的程序 . 然后它应该通过调用MPI_Open_port
打开一个监听端口 . 该调用返回一个字符串端口名称,该名称必须提供给应用程序的计算部分 . 然后,GUI部分应该通过调用阻塞MPI_Comm_accept
来开始侦听连接 .计算部件通常通过
mpiexec
启动 . 它应该通过从(1)给出端口名称调用MPI_Comm_connect
来连接到GUI .GUI中的
MPI_Comm_accept
和计算部分中的MPI_Comm_connect
的组合 Build 了一个可用于在两个部分之间发送消息的内部通信器 . 计算部分可以是例如将定期状态消息发送到GUI . 如有必要,互通机构可以进一步向内部通信人员发送 .计算完成后,通信部分应通过调用
MPI_Comm_disconnect
断开连接 .GUI应调用
MPI_Close_port
并完成自己的执行 .在这种情况下,GUI部分可以是文本模式curses应用程序本地启动或通过SSH,X11 GUI应用程序或其他任何其他方式远程启动 .
它应该工作 . 关于“并行”的评论表明多线程,这可能意味着您的输出没有像人们预期的那样被刷新 .
可能这是同一个问题(Ncurses limited output size),为此提供了更多信息 . 这两个问题都没有提供足够的细节来提供更多的通用建议 .