繁体   English   中英

C++ OpenMP 未并行运行

[英]C++ OpenMP not running in parallel

我正在制作一个利用 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++,这样线程才能工作。 哪个有效。 标签的 rest 适用于 gtk 和 openmp。 我开始的方式有问题吗? 因为它不是并行运行的。

更新

所以我发现它是并行运行的,而不是我认为应该的方式。 我认为会发生的是程序只会调用 omp 并行,然后程序的 rest 将能够继续运行,而我想并行运行的程序,在这种情况下,我的服务器,只是运行另一个CPU。 我没有意识到的是,在您调用并行程序之后,它实际上会等待进程完成,然后代码才能继续。 有没有办法让程序不等待进程完成?

线程模块之类的东西可以让线程分离,仅用于 OMP。

之后,经过一些尝试和更多的研究,我发现 OpenMP 并没有做我想做的事情。 但是,简单的叉子和 pipe 可以。 这是我使用 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);
}

首先,您强制并行块仅使用一个线程,即实际上是主线程。 如此有效,这里不会并行执行任何操作。 此外,OpenMP 的 fork-join model 通常不太适合这个 class 问题,因为在并行块的末尾,线程总是重新加入,因此可能并不真正适用。 在这里(几乎)任何情况下,您都必须通过进一步的异步分离方案来“帮助”OpenMP。 自 C++11 以来,为此提供了大量的标准库支持。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM