我有一个C ++程序,使用OpenMP并行执行一些冗长的计算。现在该程序还必须响应用户输入并更新一些图形。到目前为止,我一直在从主/ GUI线程开始我的计算,仔细平衡工作负载,这样既不会短路来掩盖OpenMP线程开销也不会很长,因此GUI变得无法响应。
显然,我想通过同时运行所有内容来解决这个问题。据我所知,OpenMP 2.5没有提供这样做的好机制。我认为它不适用于此类问题。我也不想将整个核心专用于GUI线程,它只需要<10%的工作。
我认为可能将计算分成单独的pthread,启动并行结构将是解决此问题的好方法。我编写了这个,但是从pthread调用时有OpenMP崩溃,类似于这个bug:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36242。请注意,我没有尝试一次从多个线程启动并行构造,OpenMP仅在整个程序中的一个pthread中使用。
似乎我既不能使用OpenMP来同时安排我的GUI工作,也不能使用pthreads来并行运行并行结构。我正在考虑在一个单独的线程中处理我的GUI工作,但在我的情况下这恰好相当丑陋,并且由于我使用的各种库,实际上可能无法工作。
这里的教科书解决方案是什么?我确信其他人在一个需要同时处理GUI /网络等的程序中使用OpenMP,但我无法使用Google或OpenMP论坛找到任何信息。
谢谢!
答案 0 :(得分:0)
没有教科书解决方案。 OpenMP的教科书应用程序是读取输入文件,执行大量计算和写入输出文件的非交互式程序,所有这些程序都使用超级计算机中相同大小的#CPU的线程池。它不是为交互式和计算代码的并发执行而设计的,我不认为规范可以保证与任何线程库的互操作。
抛开理论,您似乎遇到了OpenMP的GCC实现中的错误。请向GCC维护人员提交错误报告,并暂时寻找不同的编译器或在单独的进程中运行GUI代码,通过某种IPC机制与OpenMP程序进行通信。 (例如,套接字上的异步I / O.)