簡體   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