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

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

新規登録して質問してみよう
ただいま回答率
85.50%
並列処理

複数の計算が同時に実行される手法

C++

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

Q&A

解決済

1回答

1005閲覧

Openmpを用いた際のCPU時間計測方法について

nanashino

総合スコア7

並列処理

複数の計算が同時に実行される手法

C++

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

0グッド

0クリップ

投稿2017/11/07 05:22

###前提・実現したいこと
openmpを用いた際、for文内の各関数の処理時間(CPU時間)を計測したい。

###発生している問題
時間計測に関することは初心者であり、以下のコードでCPU時間が本当に正しく計測できているのかがわからない。
また、正しい数値が得られているかを確認する方法がわからない。

###該当のソースコード

C++

1#include <time.h> 2#pragma omp parallel for reduction 3for (size_t x = 0; x < pathes.size(); ++x) { 4 struct tp1, tp2; 5 const auto& p = pathes[x]; 6 cv::Mat image = cv::imread(p.string()); 7 ////// 8 clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp1) 9 func1(image); 10 clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp2) 11 long sec1 = tp2.tv_sec - tp1.tv_sec; 12 long nsec1 = tp2.tv_nsec - tp1.tv_nsec; 13 if (nsec1 < 0){ 14 sec1--; 15 nsec1 += 1000000000L; 16 } 17 //////関数2 18 clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp1) 19 func2(image); 20 clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp2) 21 long sec2 = tp2.tv_sec - tp1.tv_sec; 22 long nsec2 = tp2.tv_nsec - tp1.tv_nsec; 23 if (nsec2 < 0){ 24 sec2--; 25 nsec2 += 1000000000L; 26 } 27 ofstream ofs_res(fs::path(path).stem().string() + "_result1.txt"); 28 ofs_res << "func1\t" << (double)sec1 + (double)nsec1 / 1.0e9 << "sec" << endl; 29 ofs_res << "func2\t\t" << (double)sec2 + (double)nsec2 / 1.0e9 << "sec" << endl; 30 31 32}

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

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

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

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

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

guest

回答1

0

ベストアンサー

各関数の処理時間(CPU時間)を計測したい。

CLOCK_THREAD_CPUTIME_IDで計測される"CPU時間"は、該当スレッド実行のためにCPUが稼動状態にあった累積時間という意味合いになります。実世界における経過時間(WallClock)とは異なる旨を認識していればOKです。

以下のコードでCPU時間が本当に正しく計測できているのかがわからない。

計測用のソースコードそのものは正しく見えます。(題意とは無関係ですが、ompプラグマreduction節には(演算子:変数名)と続く必要があります。)

正しい数値が得られているかを確認する方法がわからない。

そもそも"CPU時間"は直接観測できないため、値の正しさ確認は困難です。一つの目安として、計測対象がI/Oを伴わない計算主体(CPU bound)であれば、経過時間と"CPU時間"はほぼ同じ値となります。逆にネットワークやディスクアクセス主体(I/O bound)であれば、"CPU時間"は経過時間に比べて小さな値となります。

投稿2017/11/07 06:26

yohhoy

総合スコア6189

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

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

nanashino

2017/11/07 06:45

早速の回答ありがとうございます。 計算もディスクアクセスも行っているので、 経過時間よりもやや速い値になると考えて調査してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問