質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
g++

g++はGNUコンパイラコレクション(gcc)のC++コンパイラーです。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1705閲覧

[c++]openMPを用いて並列化したforループ内で呼び出した関数内でも並列化した処理を行いたい

merll0573

総合スコア17

g++

g++はGNUコンパイラコレクション(gcc)のC++コンパイラーです。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/11/07 13:50

編集2018/11/07 14:05

前提・実現したいこと

C++で画像データの分類を行い,認識率を計算するプログラムを作成しています.

その中で,下記プログラムのようにopenMPを用いてfor文を並列化し,そのfor文内で呼び出している関数内でもopenMPを用いた並列処理を使用しています.

Windows上でVC++を用いてコンパイルした際には呼び出した関数内の並列処理も並列化されていたのですが,
同様にUbuntu上でg++を用いてコンパイルすると,最初のfor文しか並列化されず,呼び出した関数内での処理が並列化されません.

Ubuntu上でもfor文から呼び出した関数内の処理を並列化したいのですが,なにか方法はないでしょうか.

該当のソースコード

C++

1#include <iostream> 2#ifdef _OPENMP 3#include <omp.h> 4#endif 5 6using namespace std; 7 8void func(int i); 9 10int main(void){ 11 int i; 12#ifdef _OPENMP 13#pragma omp parallel for 14#endif 15 for(i = 0; i < 5; i++){ 16 func(i); 17 } 18 19 return 0; 20} 21 22void func(int i){ 23 int j; 24#ifdef _OPENMP 25#pragma omp parallel for 26#endif 27 for(j = 0; j < 100; j++){ 28 cout << "i:" << i << "j:" << j << endl; 29 /*計算処理*/ 30 } 31}

補足情報(FW/ツールのバージョンなど)

windows PC:
CPU : Intel Core i7-5960X (コア数:8,スレッド数:16)
OS : windows 10
IDE : visual studio 2017

Ubuntu PC:
CPU : Intel Xeon E5-2690 v4 (コア数:14,スレッド数:28)
OS : Ubuntu 18.04 LTS
コンパイラ : g++ 7.3.0
リンク:

g++ -c main.cpp main.o -fopenmp

コンパイル:

g++ -o main main.o -fopenmp -lpthread

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

main()関数の先頭に「omp_set_nested(1);」を追加するとどうでしょうか?

投稿2018/11/07 14:16

rtr1950x

総合スコア298

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

merll0573

2018/11/07 14:28

上手くいきました! 入れ子を有効にする関数があったんですね,知りませんでした. 大変ありがとうございました.
rtr1950x

2018/11/10 04:35

余分かもしれませんが、補足させて頂きます。 OpenMPでネストする場合は 1. omp_set_nested()関数を呼び出す。 2. OMP_NESTED環境変数を".TRUE."に設定する。 の2通りのやり方があるようです。(私は1しか試したことがないのですが…) で、ご質問文にある、OSの違いによるネストした並列化の動作の違いは環境変数によるものかと思われます。 一度、WindowsとUbuntuで環境変数の値を調べられてみてはいかがでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問