OPENMPの処理速度について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ruria

OPENMPの処理速度について

#1

投稿記事 by ruria » 13年前

  1. C言語にて、openMPを導入し、処理速度を加速させるプログラムを作成しようとしています。

  2. 1行の配列と行列の内積を計算するプログラムをopenMPで加速させる。
自分でいまこのようなプログラムを作成しOpenMPを導入しました。

コード:

#include<omp.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>

int main(int argc,char **argv){
        int n=1;
        if(argc == 2)
                sscanf(argv[1], "%d",&n);
        int *xl_val,*xr_val,*a_val,*ax_val;
        int x=25165824;
        int i,j;
        //omp_set_num_threads(n);

        //行列用変数
        xr_val = malloc(sizeof(int *) * x);
        xl_val = (int *) malloc(sizeof(int) * x);

        //計算配列
        a_val = (int *)malloc(sizeof(int) * x);

        //内積計算格納配列
        ax_val = (int *)malloc(sizeof(int) * x);

        for(i=0; i<x; i++){
                ax_val[i] = 0;
                a_val[i] = random()%10;

        }

        #pragma omp parallel for  private(i) num_threads(n)
        for(i=0; i<x; i++){
                xl_val[i] = i;
                xr_val[i] = xl_val[i] * i;
                ax_val[i] += xr_val[i]*a_val[i];
                }
        free(xl_val);
        free(xr_val);
        free(a_val);
        free(ax_val);
        return 0;
}

  3. スレッド数を1、2、4とあげていくと、処理速度が逆に低下してしまい、加速ができない状態になっています。

  4. 加速するために何が必要か、なにがだめなのかがわからなく、調べてもよくわからないためここに質問しにきました。

  5. Cの一通りのメソッドや、基本的な部分は大半理解をしています。
OpenMpについては今回始めて触ったため、あまり理解ができてないですが、
   スレッドの指定、forの並列化などの本当に基本構造あたりは理解しました。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: OPENMPの処理速度について

#2

投稿記事 by h2so5 » 13年前

変数 i を private に指定する必要はないんじゃないでしょうか。
OpemMPのサンプルコードでループカウンタをprivateにしている例はありません。

ruria

Re: OPENMPの処理速度について

#3

投稿記事 by ruria » 13年前

h2so5 さんが書きました:変数 i を private に指定する必要はないんじゃないでしょうか。
OpemMPのサンプルコードでループカウンタをprivateにしている例はありません。
privateとshareの意味を取り違えていました。修正してみましたがやはり処理速度は増加してしまいました・・・。
2スレッドの時で約0.94、4スレッドの時だと1.2ほどになってしまいます。
なにが原因なのでしょうか・・・

Ryo

Re: OPENMPの処理速度について

#4

投稿記事 by Ryo » 13年前

OpenMPは、おおざっぱにいうと
複数のスレッドを立てて、計算を並列化することで計算を早く終わらせるための
「プログラムを書くのが楽」になるものです。
で、実際に処理する際は、スレッドを立てるのにも処理時間が必要となります。
そのため、もともと短い計算を分割すると、並列することで得られるメリットよりも
スレッドを立てて管理する処理が増える分のデメリットのほうが大きくなります。

私の経験で申し訳ありませんが、
1秒程度で済むような処理は、スレッド数2で、0.7~0.8秒程度に縮まるけど
それ以上増やすと逆効果

ruria

Re: OPENMPの処理速度について

#5

投稿記事 by ruria » 13年前

Ryo さんが書きました:OpenMPは、おおざっぱにいうと
複数のスレッドを立てて、計算を並列化することで計算を早く終わらせるための
「プログラムを書くのが楽」になるものです。
で、実際に処理する際は、スレッドを立てるのにも処理時間が必要となります。
そのため、もともと短い計算を分割すると、並列することで得られるメリットよりも
スレッドを立てて管理する処理が増える分のデメリットのほうが大きくなります。

私の経験で申し訳ありませんが、
1秒程度で済むような処理は、スレッド数2で、0.7~0.8秒程度に縮まるけど
それ以上増やすと逆効果

つまり、プログラムのが間違えているというより、OpenMPに適応する処理をしているものではないということであってますか?

処理秒数を増やすために、xの値を50万などにして単純に処理量増やすというのは、無意味なことでしょうか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: OPENMPの処理速度について

#6

投稿記事 by h2so5 » 13年前

私の環境で時間を測ってみました。
それぞれ100回計算したときの平均時間です。

1スレッド 0.418501s
2スレッド 0.332463s
4スレッド 0.302700s
8スレッド 0.302567s
16スレッド 0.304918s

Mac OS X 10.7.5
Intel Core i7
4GB RAM
LLVM GCC 4.2
最適化レベル Os

16スレッドの時を除いてスレッドを増やすほど遅くなるということはないようです。
4コア8スレッドのCPUなのでこれくらいが妥当なんでしょうか。

ruria

Re: OPENMPの処理速度について

#7

投稿記事 by ruria » 13年前

h2so5 さんが書きました:私の環境で時間を測ってみました。
それぞれ100回計算したときの平均時間です。

1スレッド 0.418501s
2スレッド 0.332463s
4スレッド 0.302700s
8スレッド 0.302567s
16スレッド 0.304918s

Mac OS X 10.7.5
Intel Core i7
4GB RAM
LLVM GCC 4.2
最適化レベル Os

16スレッドの時を除いてスレッドを増やすほど遅くなるということはないようです。
4コア8スレッドのCPUなのでこれくらいが妥当なんでしょうか。
というのは、上記のプログラムを100回ということですか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: OPENMPの処理速度について

#8

投稿記事 by h2so5 » 13年前

誤解を与える表現ですみません。
上の時間は1回計算したときの平均時間で、サンプル数が100という意味です。

ruria

Re: OPENMPの処理速度について

#9

投稿記事 by ruria » 13年前

h2so5 さんが書きました:誤解を与える表現ですみません。
上の時間は1回計算したときの平均時間で、サンプル数が100という意味です。
いえ、そうではなく計る対象のプログラムのことです。
私のとかなり違う時間が出てるためなんのプログラムの時間を計測しているのかがわからなくて・・・。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: OPENMPの処理速度について

#10

投稿記事 by h2so5 » 13年前

もちろんruriaさんが最初に投稿したプログラムです。
時間計測には Mac OS X の高分解能タイマである mach_absolute_time() をベースにしたものを使用しています。

ruriaさんの環境が分かりませんがPCのスペックが違えば差が出るのは当然だと思いますよ。

ruria

Re: OPENMPの処理速度について

#11

投稿記事 by ruria » 13年前

h2so5 さんが書きました:もちろんruriaさんが最初に投稿したプログラムです。
時間計測には Mac OS X の高分解能タイマである mach_absolute_time() をベースにしたものを使用しています。

ruriaさんの環境が分かりませんがPCのスペックが違えば差が出るのは当然だと思いますよ。
私のはOSがUbuntu10.0、1.8GBのメモリでi3、プロセッサが4つですね。

i3では加速化がしづらいのでしょうか・・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: OPENMPの処理速度について

#12

投稿記事 by softya(ソフト屋) » 13年前

1.8GBのメモリでi3と言うことはモバイル向けですね。
それなら、デスクトップ向けのIntel Core i7とはだいぶと性能が違います。
そもそもCPU内部アーキテクチャが違うので比較するのが間違ってますし、1から2コアの時はインテル ターボ・ブーストと言う機能が動作してクロック上限を引き上げてます。
「CPU知識/ターボ・ブースト・テクノロジー/パソコン購入知識」
http://www.pasonisan.com/customnavi/cpu ... boost.html
なので単純には比較にならないのです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ruria

Re: OPENMPの処理速度について

#13

投稿記事 by ruria » 13年前

softya(ソフト屋) さんが書きました:1.8GBのメモリでi3と言うことはモバイル向けですね。
それなら、デスクトップ向けのIntel Core i7とはだいぶと性能が違います。
そもそもCPU内部アーキテクチャが違うので比較するのが間違ってますし、1から2コアの時はインテル ターボ・ブーストと言う機能が動作してクロック上限を引き上げてます。
「CPU知識/ターボ・ブースト・テクノロジー/パソコン購入知識」
http://www.pasonisan.com/customnavi/cpu ... boost.html
なので単純には比較にならないのです。
比較・・・というよりか、私の方では処理が重く、プロセッサが4つあるため4つのスレッド並列なら加速するはずなのに、
上の方が同じことをやると普通に並列化による加速が得られているということに驚きました・・・。
ちなみにノートパソコンです。

ということは、このパソコンでも十分並列化による加速がわかりやすいような内容というのも存在するのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: OPENMPの処理速度について

#14

投稿記事 by softya(ソフト屋) » 13年前

CPU内部アーキテクチャが違うということは同じスレッドの並行性能を持たないということでもあります。
Corei3はターボ・ブースト・テクノロジーに対応していませんので、Corei7と比較してしまうと違いがあるので参考にならないと言うことですね。

一般的にスレッド性能を出すには、各スレッドが全力で動作するようにしてやらないと行けません。
Corei3の動作は想像の範囲を出ませんが一般的には
・スレッド間でアドレスが近いメモリが出来るだけ参照されないようすること(たぶんCPU内部のメモリ同期処理に時間を食います)。
出来るだけprivate化するのが一番だと思います。
・並行で動いている時間を出来るだけ長くすること。


あと他の人がやっている実験と比べてみるのも良いと思います。自分の処理にヒントにもなるでしょう。
「OpenMPで遊んでみた « Network Project 5」
http://kynjp.wordpress.com/2009/05/05/o ... %E3%81%9F/

その他の注意事項。
「OpenMP* 入門 | iSUS」
http://www.isus.jp/article/openmp-speci ... th-openmp/

【追記】 その他にも並列化における問題点などなど。
「マルチコアCPU上の並列化手法、その並列性能と問題点」
http://www.softek.co.jp/SPG/Pgi/TIPS/pu ... -para.html
「OpenMP 入門」
http://olab.is.s.u-tokyo.ac.jp/~reiji/openmp.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ruria

Re: OPENMPの処理速度について

#15

投稿記事 by ruria » 13年前

softya(ソフト屋) さんが書きました:CPU内部アーキテクチャが違うということは同じスレッドの並行性能を持たないということでもあります。
Corei3はターボ・ブースト・テクノロジーに対応していませんので、Corei7と比較してしまうと違いがあるので参考にならないと言うことですね。

一般的にスレッド性能を出すには、各スレッドが全力で動作するようにしてやらないと行けません。
Corei3の動作は想像の範囲を出ませんが一般的には
・スレッド間でアドレスが近いメモリが出来るだけ参照されないようすること(たぶんCPU内部のメモリ同期処理に時間を食います)。
出来るだけprivate化するのが一番だと思います。
・並行で動いている時間を出来るだけ長くすること。


あと他の人がやっている実験と比べてみるのも良いと思います。自分の処理にヒントにもなるでしょう。
「OpenMPで遊んでみた « Network Project 5」
http://kynjp.wordpress.com/2009/05/05/o ... %E3%81%9F/

その他の注意事項。
「OpenMP* 入門 | iSUS」
http://www.isus.jp/article/openmp-speci ... th-openmp/

【追記】 その他にも並列化における問題点などなど。
「マルチコアCPU上の並列化手法、その並列性能と問題点」
http://www.softek.co.jp/SPG/Pgi/TIPS/pu ... -para.html
「OpenMP 入門」
http://olab.is.s.u-tokyo.ac.jp/~reiji/openmp.html


なるほど。簡単に並列化とはいってもパソコン自体のポテンシャルにも依存してるのですね・・・
微妙ながら加速したもので、まとめて、レポートにいろいろ書いてみます。

ながくなってしまい申し訳ありませんでした。質問にお答えいただきありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る