Boost」など、さまざまなカンファレンスを企画・運営しています。BOOKS(コードジン・ブックス)は、CodeZineの連載からカットアップした、開発現場の課題解決に役立つ書籍シリーズです。書籍WebサイトインテルTBBの決まりごとインテルTBBを使用するプログラムには、いくつかの決まりごとがありますので、それを最初に解説します。initオブジェクトを初期化せねばなりません。このオブジェクトを初期化しないと、インテルTBBは正常に動作しません。"tbb/task_scheduler_init.h"が必要となります。最後に標準テンプレート・ライブラリー(STL)のコンテナはインテルTBBと一緒に使用しないで下さい。STLのコンテナは並列化を意識したものではないので、インテルTBBと一緒に使うと壊れてしまいます。vectorなどのSTLコンテナを使用せずに、今後紹介するインテルTBB用のコンテナを使用して下さい。ParallelForSampleの並列処理についてこのサンプルでは、処理を並列化するためにインテルTBBのparallel_forテンプレートを使用しています。parallel_forテンプレートはループを並列化するためのもので、並列化する処理が互いに独立している場合に使用します。ループ内の処理が互いに干渉しあう場合に使用すると正しい結果を得られませんので注意して下さい。parallel_forを正常に動作させるためには3つの要件を満たさねばなりません。1つ目は、コピー・コンストラクターを用意する必要があるということです。2つ目にデストラクタがなければなりません。3つ目に、operator()「関数呼び出し演算子」を多重定義しなくてはなりません。コピー・コンストラクターとデストラクターは、コンパイラが自動で用意してくれますが、これは自分で定義しなくてはなりません。関数呼び出し演算子にあまり馴染みがない方は、サンプルFunctionCallのコードを読んで実行して見て下さい。すれば、関数呼び出し演算子の定義方法と大まかな動作が分かると思います。"関数呼び出し演算子が呼ばれました。0;}インテルTBBでは関数呼び出し演算子の多重定義を多用します。慣れていない方は、関数呼び出し演算子の多重定義方法を身につけておくことをお勧めします。今回のParallelForSampleでは関数呼び出し演算子を多重定義して、直列のものとほぼ同じ計算プログラムをコーディングしているだけです。比較して見ると定義方法以外はプログラムがほぼ同じです。}};operator()にconstが指定されている点に注意して下さい。parallel_forは内部で、処理範囲を分割し、その分割した範囲内に指定されたオブジェクトのコピーを作成して、operator()を呼び出します。この時にもし変更を許してしまうと、複数のコピーを矛盾なく並列処理させることが困難になります。いった理由がありますので、対象となるオブジェクトのデータメンバーを変更することができません。そこで変更できないようにconstを必ず指定せねばなりません。この点に注意して下さい。constを指定すると、どのような動きをするのか確認したい場合は、FunctionCallプロジェクト内のコメントを取り除いてみて下さい。すればコンパイラエラーが発生します。parallel_forは誤りを事前に防いでくれるわけです。this->datas;のプログラムがあるのは、constが定義がされているからです。constが定義されている時に直接メンバーを変更することはできませんが、間接的に変更することはできます。それでこのプログラムで間接的に変更しているのです。間接的に変更するだけならば、複数のコピーの値を同じにすることができるので安全です。これで呼ばれるオブジェクトの準備は終わりです。後はparallel_forでそのオブジェクトを呼ぶだけです。);のようにparallel_forテンプレートで、blocked_rangeオブジェクトを初期化したものと、並列処理をするオブジェクト(今回はSales)のインスタンスを指定するだけです。売上明細で算出するべき項目を【並列で】計算します。//ここに注目};blocked_rangeオブジェクトは、範囲を表すオブジェクトです。開始地点・繰り返し回数・粒度を指定します。粒度を簡単にいうと、処理を分割する基準となる値です。この値を変更することにより並列処理のパフォーマンスが変化します。粒度については高度な概念なので今回は10000にするとよいと考えて下さい。これでParallelForSampleの説明は終わりです。実行してみてください。すると、直列処理よりも並列処理の方がかなり効率が良いことを体験できます。一つ注意するべき点があります。それはスピードは一定ではなくある程度の幅がある点です。実務でインテルTBBを使用する際には、何度か実行して処理効率を確認して下さい。次項では少し複雑な並列化処理を採り上げます。インテルTBBのスレッドクラスマルチスレッドを安全に実行するスレッドセーフとインテルTBBのコンテナもっと読むこの記事の著者インドリ(インドリ)分析・設計・実装なんでもありのフリーエンジニア。ブログ「無差別に技術をついばむ鳥(http://indori.blog32.fc2.com/)」の作者です。アドバイザーをしたり、システム開発したり、情報処理技術を研究したりと色々しています。モブプログラミングを取り入れて開発を効率化させるヒント9企業の7割超が「2025年の崖」を理解していないことが明らかに。モブプログラミングを取り入れて開発を効率化させるヒント9企業の7割超が「2025年の崖」を理解していないことが明らかに。モブプログラミングを取り入れて開発を効率化させるヒント9企業の7割超が「2025年の崖」を理解していないことが明らかに。5.0」がリリース新着記事一覧を見るイベント今後の予定を見るCodeZineは、株式会社翔泳社が運営するソフトウェア開発者向けのWebメディアです。「デベロッパーの成長と課題解決に貢献するメディア」をコンセプトに、現場で役立つ最新情報を日々お届けします。イラストの無断転載を禁じます。記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標です。