C++ OpenMP 未并行运行
Posted
技术标签:
【中文标题】C++ OpenMP 未并行运行【英文标题】:C++ OpenMP not running in parallel 【发布时间】:2020-11-30 18:38:59 【问题描述】:我正在制作一个利用 GTK 的程序,并在该程序中创建了一个服务器。 GUI 和服务器运行良好。我也可以穿线。 OMP 已编译,我已经用 C 计算的OMP Hello World 对其进行了测试。它可以工作,并且输出显然是随机的。但是,当我按下带有此代码的按钮后尝试并行运行服务器时:
char * ip;
int por;
#pragma omp parallel num_threads(1) private(ip, por)
ip = (char *)gtk_entry_get_text(GTK_ENTRY(IP));
por = atoi((char *)gtk_entry_get_text(GTK_ENTRY(port)));
startServer(ip, por);
显然包含文件#include <omp.h>
。
GTK 做它应该做的事,服务器启动并建立连接。但是它不是并行运行的。我知道这是因为 GUI 变得无响应和冻结。
这是我用来编译它的命令:clang++ -std=c++11 -Xpreprocessor -fopenmp -L/usr/local/opt/llvm/lib httpServerv2.cpp `pkg-config --cflags --libs gtk+-3.0` -lomp
httpServerv2.cpp 是我的 c++ 文件的名称。我必须使用带有标签 -std=c++11 的 clang++,这样线程才能工作。哪个有效。其余标签用于 gtk 和 openmp。我开始的方式有问题吗?因为它不是并行运行的。
更新
所以我发现它是并行运行的,而不是我认为应该的方式。我认为会发生的是程序只会调用 omp 并行,然后程序的其余部分将能够继续运行,而我想要并行运行的程序,在这种情况下,我的服务器,只是运行另一个CPU。我没有意识到的是,在您调用并行程序之后,它实际上会等待进程完成,然后代码才能继续。有没有办法让程序不等待进程完成?
类似于线程模块的东西,用于线程分离,仅用于 OMP。
【问题讨论】:
【参考方案1】:经过一些尝试和更多的研究后,我发现 OpenMP 并没有做我希望它做的事情。但是,简单的叉子和管道可以。这是我使用 fork 的新代码:
char * ip;
int por;
pid_t pid = fork();
if (pid == 0)
ip = (char *)gtk_entry_get_text(GTK_ENTRY(IP));
por = atoi((char *)gtk_entry_get_text(GTK_ENTRY(port)));
startServer(ip, por);
【讨论】:
【参考方案2】:首先你强制并行块只使用一个线程,即实际上是主线程。如此有效,这里不会并行执行任何操作。此外,OpenMP 的 fork-join 模型通常不太适合这类问题,因为在并行块结束时,线程总是重新加入,因此可能并不真正适用。在这里(几乎)任何情况下,您都必须通过进一步的异步分离方案来“帮助”OpenMP。从 C++11 开始,有大量的标准库支持。
【讨论】:
以上是关于C++ OpenMP 未并行运行的主要内容,如果未能解决你的问题,请参考以下文章