2011-03-12 36 views
3

我有一个C++程序,它使用OpenMP并行执行一些冗长的计算。现在该程序还必须响应用户输入并更新一些图形。到目前为止,我一直从主/ GUI线程开始我的计算,仔细平衡工作负载,以便既不掩盖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

您是否必须使用OpenMP?您可以尝试使用pthread来处理所有事情,并且可以很容易地创建“显示”线程和“计算”线程。 – 2011-03-12 00:39:21

+1

当然,没有人严格*使用OpenMP,但我宁愿解决这个问题,并学习一些放弃OpenMP并将其替换为更详细的手动管理线程池的代码 – ASD1 2011-03-12 00:45:29

回答

0

没有教科书解决方案。 OpenMP的教科书应用程序是非交互式程序,它们读取输入文件,执行大量计算并写入输出文件,所有这些程序都使用超级计算机中相同大小的〜#CPU线程池。它不是为交互式和计算代码的并发执行而设计的,我不认为与规范保证任何线程库互操作。

抛开理论,您似乎遇到了OpenMP的GCC实现中的一个错误。请向GCC维护人员提交错误报告,并且暂时寻找不同的编译器或在单独的进程中运行GUI代码,并通过某种IPC机制与OpenMP程序进行通信。 (例如,在套接字上的异步I/O)。

+0

这就是我对OpenMP的期望。但在你的例子中,我将如何实际实现与我的GUI程序的通信?我仍然可能需要有一个独立的线程来异步运行我的IPC机制,与OpenMP线程同步以提取数据等。这似乎使我处于和我一样的位置。错误I链接被关闭为“已解决无效”,因此我认为再次提交完全相同的问题不会有多大帮助。 – ASD1 2011-03-12 00:59:17

+0

@ ASD1:您不一定需要异步I/O的线程;你可以尝试使用'poll' /'select',也许信号来监视/终止/重启主程序,运行多个实例等等。这取决于需要多少交互性。 (正如我所说的,你可以尝试一种不同的编译器,Intel C++可能是一种选择,尽管以我的经验来看,它的输出在AMD内核上表现非常糟糕。) – 2011-03-12 01:26:05

+0

是的,我可以使用轮询或aysnc方法进行通信,但是这个OpenMP的巨大局限性会让我放弃当前的计划,并可能在未来的所有工作中使用。我从来没有想过要处于一个完全工作的程序中,因为我想添加一些GUI /网络/等线程而必须重写线程代码。这是一个耻辱,因为我认为OpenMP非常整洁。 – ASD1 2011-03-12 01:47:16