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 未并行运行的主要内容,如果未能解决你的问题,请参考以下文章

在 Openmp (C++) 中销毁线程

C++ OpenMP 和 gcc 4.8.1 - 并行化循环时的性能问题

C++ openMP 并行矩阵乘法

在 C++ 中使用 OpenMP 并行化递归函数

C++:OpenMP 并行循环内存泄漏

C++ openmp并行程序在多核linux上如何最大化使用cpu