OpenMPとクリティカルセクション

 atomic構文は、単一の単純なプログラムのみ適用できます。しかし、関係がある複数のプログラムを、不可分に処理したい場合があります。不可分とは、複数のスレッドが、共有するリソースを同時に操作しない事です。
 並列プログラミングでは、共有リソースは不可分に処理しないと、正常な結果を得られません。この場合は、クリティカルセクションを使用します。OpenMPを使って、クリティカルセクションを実現したい場合、critical構文(#pragma omp critical)を使用します。
 文章だけでは分かりにくいと思いますので、サンプル(C言語使用)を元に解説を続けます。
#include <stdio.h>

int main()
{
    int i, x, y, max;
    max = 10000;

    /* クリティカルセクションなしで計算 */
    x = y = 0;
    #pragma omp parallel for shared( x, y )
    for ( i = 0; i < max; i++ ) {
        ++x;
        y += x;
    }
    printf( "critical構文を、指定していない場合の値は[x:%d][y:%d]です。\n", x, y );

    /* クリティカルセクション内で計算 */
    x = y = 0;
    #pragma omp parallel for shared( x, y )
    for ( i = 0; i < max; i++ ) {
        #pragma omp critical
        {
            ++x;
            y += x;
        }
    }
    printf( "critical構文を、指定した場合の値は[x:%d][y:%d]です。\n\n", x, y );
    return 0;
}

 このサンプルは、共有変数xとyの値を計算しています。変数xとyは、互いに関係が深いと仮定して下さい。サンプルを実行すれば、critical構文を使用しないと、更新の喪失が起こる事が確認できます。
 atomic構文を複数使えばいいと思う方もいるでしょうが、変数xとyの関係が深い場合、それぞれの変数がアトミックに更新されても、処理結果は予想外のものになり、正常な処理ではなくなる可能性があります
 何故ならば、並列処理では、同時に複数の処理が実行されますので、他のスレッドが処理した結果が混ざってしまう場合があるからです。処理A内で、処理Bが更新したyの値を使用してしまった場合、処理結果は予想もつかないものになるでしょう。まとまった処理は、クリティカルセクションで一度に指定しましょう。
 critical構文は#pragma omp critical( name )のように、クリティカルセクションに名前を付ける事が出来ます。名前を付ける事により、同時に実行できる処理を増やす事が出来ます。
例えば、#pragma omp critical( critical0 )と#pragma omp critical( critical1 )を指定したとします。この場合、名前を付けなかった時とは違い、クリティカルセクション0とクリティカルセクション1内のプログラムが同時に実行されます。一方、名前を付けなかった場合、未指定の名前(unspecified name)と看做され、同時に一つのクリティカルセクション内のプログラムしか処理する事が出来ません。
 ただし、複数のクリティカルセクションは、互いに関係がない処理に指定して下さい。関係がある処理に対して、複数のクリティカルセクションを使用すると、正常な処理結果を得られません。
 最後に、critical構文を使用するにあたって、一つ注意するべきことを述べます。critical構文を多用しないでください。クリティカルセクションは、共有リソースを単一スレッドのみ処理できるようにする技術なので、並列処理のパフォーマンスを下げます。本当に必要な時だけ使用するようにして下さい。


【参考資料】

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

お久しぶりです

お久しぶりです。又コメントがヒートアップされていたようなので眺めておりました。

さて…
>atomic構文は、単一の単純なプログラムのみ適用できます
いいえ。
「単一の単純なプログラム」ではなく「後続の複合代入文を不可分的に実行」します。

>不可分とは、複数のスレッドが、共有するリソースを同時に操作しない事
いいえ。
不可分とはdo or not doです。
complete or nothingでも可でしょうか。
「共有するリソースを同時に操作しない事」は排他です。

>クリティカルセクションを実現したい場合
クリティカルセクションは排他が必要なエリアを指します。
排他制御を実現したい場合、が正しいでしょう。
クリティカルセクションとクリティカルリージョンを誤認されていませんか?

お一人で開発を長くされていると、
どうしても言葉の解釈や表現が独自ルールになってしまいますね。

インドリさんを指摘する方はどうも、
論拠を示さず楽しんで指摘する方が多いように見えましたので、
修正例もあわせ、コメントさせていただきました。

暑い日が続きますが、お体等壊されませんよう。

Re: お久しぶりです

> お久しぶりです。又コメントがヒートアップされていたようなので眺めておりました。
>
お久しぶりです。

> さて…
> >atomic構文は、単一の単純なプログラムのみ適用できます
> いいえ。
> 「単一の単純なプログラム」ではなく「後続の複合代入文を不可分的に実行」します。
>
正確さに拘るのであれば、残念ながらその表現も不正確です。
あくまでも正確さに拘るのであれば、OpenMPの仕様書を読むべきだと私は考えております。
また、深く追求するときりがありませんので、簡単な表現にとどめている次第です。
余りにも正確さに拘ると、仕様書と同じように読みにくくなりますし、前後の文章で「一見単純に見える命令文」と書いているのでこう表現しております。

> >不可分とは、複数のスレッドが、共有するリソースを同時に操作しない事
> いいえ。
> 不可分とはdo or not doです。
> complete or nothingでも可でしょうか。
> 「共有するリソースを同時に操作しない事」は排他です。
>
そうです排他制御の事を言っております。
この場面で排他制御というと、「同期処理とどう違うのか?」などと言った疑問がわくと思いましたので、敢えて排他制御とは言いませんでした。
また、排他制御を記述すると、OS理論も絡み非常に話しが長くなりますので、それを避ける意味合いもあります。
不可分の部分ですが、前の文を受けて、「どのような事をしたいのか」を表現しております。


> >クリティカルセクションを実現したい場合
> クリティカルセクションは排他が必要なエリアを指します。
> 排他制御を実現したい場合、が正しいでしょう。
> クリティカルセクションとクリティカルリージョンを誤認されていませんか?
残念ながらそれは不正確な表現です。
共有変数を参照/更新するソースコード部分をクリティカルセクションと呼びます。
また、その範囲を排他制御する仕組みもクリティカルセクションと呼ばれております。
クリティカルリージョンも同じ意味合いで使用され、著者が好みで選んでいるのが現状です。
この記事の場合、クリティカルリージョンの方を使用すると、読者が混乱する恐れがあります。
「何故、クリティカルセクション構文でクリティカルリージョンを扱うんだ?」

> お一人で開発を長くされていると、
> どうしても言葉の解釈や表現が独自ルールになってしまいますね。
>
いいえ。独りでシステムを構築できるだけであって、当然チーム開発も請け負っています。
独りでシステムを構築できるのですから、どの作業工程でも請け負っています。
独りで出来るからと言って、仕事の窓口を自分で狭める意味はありません。
それに、当然複数の専門書を参考にしております。
こういった記事は、正確に書くときりがない上に、相手に伝えるという目的が達成できませんので、情報量をコントロールしております。
エンドユーザーや、管理職の方を話しをする時、正確さに拘ると趣旨が伝わりません。
また、誰かに教える時も同様で、情報量をコントロールしないと、「基礎を教える」という目的を達成できません。
これは、コンサルティング業務や、集団開発で身に付いたテクニックの一種です。
どうやら、貴方様は何らかの先入観を持っておられるようなので言っておきます。
誹謗中傷集団は、知識と語彙が少なく、理解できない専門用語を全て「インドリ独自の言葉」と吹聴しているだけです。
彼らは理解できない事や、違う意見を言う人全てをインドリと呼ぶ、一種の病気に罹っています。

> インドリさんを指摘する方はどうも、
> 論拠を示さず楽しんで指摘する方が多いように見えましたので、
> 修正例もあわせ、コメントさせていただきました。
>
> 暑い日が続きますが、お体等壊されませんよう。
記事の目的とは違っているだけであって、貴方の言う事は特に間違っていないので、気にしないでください。
ごきげんよう。

かの宗教組織には困ったものだ

誹謗中傷集団が妄想を吹聴し、他者に先入観を埋め込んでいるので困っております。
誹謗中傷集団は、自分たちと違う意見を言う人は「インドリ」、分からない専門用語は全て「インドリが言っている」との妄想に取りつかれております。
その妄想を世間に広めるものですから、非常にたちが悪い。
これは明らかに名誉棄損です。
犯罪を行う事を目的とするあの教団には困ったものです。
賢明なる皆様は、妄想で動いている教団の言う事は真に受けないでください。

No title

>正確さに拘るのであれば、残念ながらその表現も不正確です。
x binop= expr
x++
++x
x--
--x
ですから、複合代入文と申しております。不正確ではありません。
>「一見単純に見える命令文」
一寸意味が判りません。

>OpenMPの仕様書を読むべき
ええ、勿論拝読しております。日本語化もいたしました。

>そうです排他制御の事を言っております。
排他制御と不可分は同じではありません。
ですので、「不可分とは、複数のスレッドが、共有するリソースを同時に操作しない事」というのは誤りです。
共有するリソースを同時に操作しない事=排他制御
不可分=complete or nothing
です。一致するべき意味合いは一つもありません。

>この場面で排他制御というと、「同期処理とどう違うのか?」などと言った疑問
沸きません。全くと言っても沸くわけがありません。
同期処理と排他制御はまったく別の概念です。
この場面の何処にタイミング合わせが必要なのでしょう?

>この記事の場合、クリティカルリージョンの方を使用すると、読者が混乱する恐れがあります。
なるほど。私の場合、クリティカルリージョンを使わない事で混乱してしまいましたが(笑)。。。

>エンドユーザーや、管理職の方を話しをする時、正確さに拘ると趣旨が伝わりません。
>また、誰かに教える時も同様で、情報量をコントロールしないと、「基礎を教える」という目的を達成できません。
大いに同意しますが、この記事を見れば、明らかなミスリーディングであり、明らかに言葉を軽視しています。
判りやすさの為、正確さを無視する事は良くあります。
けれど、あまりに正確ではありません。

色々な方とのやり取りでお疲れの為に、
ケアレスミスで記述されていたのかと思いましたが…
再度、言葉の意味を確認していただけると。





レスをし忘れました…

>どうやら、貴方様は何らかの先入観を持っておられるようなので言っておきます。
>誹謗中傷集団は、知識と語彙が少なく、理解できない専門用語を全て「インドリ独自の言葉」と吹聴しているだけです。
>彼らは理解できない事や、違う意見を言う人全てをインドリと呼ぶ、一種の病気に罹っています。

随分と厄介な病気にかかっていらっしゃるのですね。
ですが、先入観は持ち合わせておりません。
と言いますのも、「誹謗中傷集団」と仰っている方が、どなたに当たるのか良く判りません。
E氏、と言うお名前は先日のエントリで拝見しましたが、
その方と特にお話させていただいた事はありませんし、
その方がこちらのブログで先だってお話されているところを見たことはございません。

私が認識しているのは、インドリさんへの指摘をなさる方はどうも、
インドリさんを見下したような物言いをするなぁ、と言う事だけです。

私が指摘しているのは、専門用語というほどの言葉でもございませんし、お気遣いなさらず、素直に言葉と向き合っていただければと思います^^

No title

>誹謗中傷集団は、自分たちと違う意見を言う人は「インドリ」、分からない専門用語は全て「インドリが言っている」との妄想に取りつかれております。

2,3か月くらい前、関数型言語使いの俺としては墳飯もんのやりとりを見たわ。
彼らはインドリを通して知った知識にバイアスが掛かってしまうんだろうな。
一応知らないことはwikipediaで調べてるようだが、インドリがwikipediaの知識で知ったかぶっている、関数型言語に感化されてる、みたいこと言っていた。
あんな基本的なことは当然wikipediaに載ってるだろうし、感化されているとはどういう意味なのやら。まあ悪意なんだろうけど。

あいつらインドリを通して知らないこと知ることができたんだからインドリに感謝すべきだろ。
というか、自分たちとはレイヤーの違う話をしているってこと理解して欲しいわ。
関数型のコミュニティでも見てみればいいのにな。
今まで言ってきたことが恥ずかしいことだったかわかるから。

No title

あいつらってインドリがたまにかくネタを一般的じゃないとして知ったかぶりだの何だの文句言ってくるけど
なんで一般的じゃないネタを書いちゃダメなんだよw
一般的だろうが何だろうが結局自分たちが知らないだけだろ。

Re: No title

> >正確さに拘るのであれば、残念ながらその表現も不正確です。
> x binop= expr
> x++
> ++x
> x--
> --x
> ですから、複合代入文と申しております。不正確ではありません。
> >「一見単純に見える命令文」
> 一寸意味が判りません。
>
困りました。
単純に見えるという意味が分からないと、言われるとは思いませんでした。
大概の人は++countの様な命令文を簡単で、並列処理で問題が生じるとは思わないものです。

> >OpenMPの仕様書を読むべき
> ええ、勿論拝読しております。日本語化もいたしました。
>
> >そうです排他制御の事を言っております。
> 排他制御と不可分は同じではありません。
> ですので、「不可分とは、複数のスレッドが、共有するリソースを同時に操作しない事」というのは誤りです。
> 共有するリソースを同時に操作しない事=排他制御
> 不可分=complete or nothing
> です。一致するべき意味合いは一つもありません。
>
文章の意味が分からないと・・・
うーん、これにも困りました。
なんといえばいいのだろう。

> >この場面で排他制御というと、「同期処理とどう違うのか?」などと言った疑問
> 沸きません。全くと言っても沸くわけがありません。
> 同期処理と排他制御はまったく別の概念です。
> この場面の何処にタイミング合わせが必要なのでしょう?
>
あのですね、クリティカル構文は、OpenMPの仕様書では同期処理に分類されています。

> なるほど。私の場合、クリティカルリージョンを使わない事で混乱してしまいましたが(笑)。。。
>
並列処理の初心者は、クリティカルリージョンを知らないから、それも解説しなくてはならなくなります。

> >エンドユーザーや、管理職の方を話しをする時、正確さに拘ると趣旨が伝わりません。
> >また、誰かに教える時も同様で、情報量をコントロールしないと、「基礎を教える」という目的を達成できません。
> 大いに同意しますが、この記事を見れば、明らかなミスリーディングであり、明らかに言葉を軽視しています。
> 判りやすさの為、正確さを無視する事は良くあります。
> けれど、あまりに正確ではありません。
>
貴方の指摘も正確ではありません。
OS理論から言えば、全く不正確と言ってもいいでしょう。
ようは、対象を良く考えるのが大事なのです。

> 色々な方とのやり取りでお疲れの為に、
> ケアレスミスで記述されていたのかと思いましたが…
> 再度、言葉の意味を確認していただけると。
だから、多数の専門書を参考にしていると言っているのですが・・・
この方も文章が分からないのでしょうか?
困ったものです。

Re: No title

> あいつらってインドリがたまにかくネタを一般的じゃないとして知ったかぶりだの何だの文句言ってくるけど
> なんで一般的じゃないネタを書いちゃダメなんだよw
> 一般的だろうが何だろうが結局自分たちが知らないだけだろ。
同感です。
彼らは自分たちだけが読んでいるとでも思っているのでしょうか(笑)
映画館で勝手に叫ぶ迷惑な人みたいですね。

Re: No title

AlexAndRite さんの1つ目の書き込みに返信
そうですね。彼らの無恥ぶりには困ったものです。
しかも、自分の無恥さ/無知さを私の責任にしてしまう。
私が関数型言語や、マルチパラダイム言語の書籍を紹介しているのを無視しているんですよね・・・
彼らは「自分が知らない事が専門書に書かれている」と考えないのでしょうか(笑)
そして、OpenMPの仕様書とかをちょっと読んだだけで有頂天になる。
彼らは、知っている人から見ればどう見えるかを考えた方がいいと思います。
私が言及している事は、同じ専門書や文献を読んだ人には分かるから、AlexAndRiteさんの様にその話題を知っている人から見れば、正しく墳飯もんですよね。
そういえば、私も似た経験をしています。
私が言った事が、マイクロソフト公式解説書に書いている事を知らなくて、「間違っている」だとか「インドリの思いこみだ」等と騒いでいた時があります。
この時、私は爆笑してしまいました。
彼らは凄いですよね♪
マイクロソフト公式解説書に書いている事実も、彼らにとっては「インドリの妄想」なんだからw
マイクロソフト社の開発者たちに対して謝罪するべきだと思うw

Re: まぁまぁ

> 落ち着いて下さい。
>
> >大概の人は++countの様な命令文を簡単で、並列処理で問題が生じるとは思わないものです。
> なるほど、そうなのですね。
> だとしても、
> 一見単純に見える命令文=複合代入文ではありません。
複合代入文という用語は、C言語では次の演算子です。
・+=、/=、%=、+=、-=、<<=、>>=、&=、^=、|=
++は前置増分演算子の前置式もしくは後置増分演算子の後置式です。
ですから、複合代入文だけならば不正確です。

> >あのですね、クリティカル構文は、OpenMPの仕様書では同期処理に分類されています
> さて、私はそんな分類をした覚えはありません。
> OpenMP Application Program Interfaceを再読していただけると。
> きっと、OpenMP Application Program Interfaceには書かれていません。
>
2.8.マスター・同期構文と書かれています。

> >並列処理の初心者は、クリティカルリージョンを知らないから、それも解説しなくてはならなくなります。
> インドリさんのその手の解説をぜひお聞きしたいものです。
>
初心者に伝えるのが目的ですから、目的とはそいません。

> >OS理論から言えば、全く不正確と言ってもいいでしょう
> OS理論とは何でしょう?
>
OSに関する情報処理技術の領域です。
OSを学習している人にとっては、まだ不正確です。
それに、より厳密に定義をするのであれば、歴史から語らねばなりません。
しかし、それは「OpenMPと並列処理の基礎を教える」という目的外の事であって、やらない方が良い事です。

> >だから、多数の専門書を参考にしていると言っているのですが・・・
> >この方も文章が分からないのでしょうか?
> 誰にものを言っているのでしょう?
> インドリさんであれば、私が誰か位お分かりかと思いましたが…
>
> 非常に残念です。
>
私も残念です。
普通の人は専門書を参照して書いており、敢えて参照しないで書く人はいません。
どうして、敢えて専門書を読まずに書いていると考えたのか不思議でなりません。

> これ以上OpenMPを辱めるような物言いはしたくないので、
> お邪魔する事は避けます。
>
> 最後に。
> includeが抜けて居るので補ってください。
> ご存知のように、動かないプログラムはただのゴミです。
> #紅の豚風に。
もしomp.hの事ならば、実行時ライブラリルーチンを使用していないので必要ありません。
プロフィール

Author:インドリ
みなさん、はじめまして、
コンニチハ。

ボクは、無限の夢(infinity dream)を持つネタ好きな虹色の鳥インドリ(in dre)です。
色々な情報処理技術を啄ばむから楽しみにしてね。

http://twitter.com/indori
は別人による嫌がらせ行為です。
私とは関係ないので注意して下さい。
次はなりすましブログなどをするかもしれませんが、ここ以外でブログをするつもりがないので、ここ以外にインドリのブログがあったとしても無視してください。


何度言っても分からない人が多いので、ここにコメント欄へ書き込むときの注意事項を書きます。


一、社会人としてのマナーをわきまえましょう。
一、妄想に基づく書き込みを止めてください。
一、暴言の類は書かないで下さい。
一、某誹謗中傷サイトの書き込みは彼らの妄想に基づく書き込みですから無視して、ここへ書き込まないで下さい。
一、コメント書く前に他のコメントよく読んでから行って下さい。
一、その他常識的に考えて迷惑なコメントはしないで下さい。


以上のルールを守れない人のコメントは削除します。



利用上の注意
ここに紹介してある文章およびプログラムコードは正確であるように心がけておりますが、内容を保証するものではありません。当サイトの内容によって生じた損害については、一切の責任を負いませんので御了承ください。


執筆したCodeZineの記事


【VB.NETで仮想CPUを作ろう】

  1. VB.NETで仮想CPUを作ろう
  2. レジスタの実装
  3. 仮想CPUのGUI化
  4. テストドライバの改良
  5. CPUの基礎動作の実装
  6. MOV命令の実装
  7. ADD命令実装
  8. SUB命令実装
  9. INC命令&DEC命令の実装と命令長
  10. MLU命令の実装とModR/Mについて
  11. DIV命令の実装とイベント設計について
  12. 機械語駆動式 関数電卓を作ろう!
  13. 機械語駆動式 関数電卓を作ろう! 解答編(前半)
  14. 機械語駆動式 関数電卓を作ろう! 解答編(後半)


【仮想ネットワーク実装でTCP/IPを学ぼう】
  1. TCP/IPの基礎と勘所
  2. ネットワークアクセス層の勘所
  3. インターネット層の勘所
  4. トランスポート層の勘所
  5. アプリケーション層の勘所
  6. セキュリティの基礎と仮想ネットワークの仕様
  7. GDI+と独自プロトコルの定義



【並列化】
インテル Parallel Studioを使って並列化プログラミングを試してみた
並列プログラミングの効率的なデバッグを実現する「Parallel Inspector」


【TBBシリーズ】
  1. インテル スレッディング・ビルディング・ブロックの概要
  2. インテルTBBから学ぶループの並列化
  3. スレッドセーフとインテルTBBのコンテナ
  4. インテルTBBのスレッドクラス


【OpenMPシリーズ】
  1. OpenMPの基礎構文
  2. OpenMPの実行時ライブラリと並列ループ
  3. OpenMPのメモリモデルとfork- joinモデル

最近の記事
最近のコメント
月別アーカイブ
カテゴリ
Ada (9)
COBOL (5)
C (6)
C++ (10)
C# (36)
D (25)
Java (8)
Perl (1)
Ruby (14)
PHP (2)
Boo (2)
Cobra (2)
LISP (6)
F# (10)
HTML (0)
XHTML (0)
CSS (0)
XML (0)
XSLT (0)
Scala (1)
WPF (0)
WF (0)
WCF (0)
LINQ (4)
MONO (5)
Linux (0)
MySQL (0)
ブログ内検索
リンク
最近のトラックバック
RSSフィード
By FC2ブログ

今すぐブログを作ろう!

Powered By FC2ブログ

ブロとも申請フォーム

この人とブロともになる

QRコード
FC2カウンター