ダウンロード サンプルファイル (2.9 MB)
インテルTBBのコンテナを使用する理由
TBBなどの高度な並列処理ライブラリや機能が登場するまでは、マルチスレッドプログラミングは排他制御などの技法を駆使して行われていました。そのため、古くからマルチスレッドプログラミングをしていた人の中には、どうせロックをかけるのだからスレッドセーフではないコンテナでも別にかまわないという方がいるでしょう。しかし筆者は、並列処理時には極力インテルTBBのコンテナを使用することをお勧めします。理由はインテルTBBのコンテナクラスがファイングレイン・ロック(細粒度ロック)とロックフリー・アルゴリズムで実装されているからです。
細粒度ロックとは、絶対に必要となる部分だけをロックする技法のことです。ロックは広い範囲でかけると安全性が増しますが、ロックしているコードは、他のスレッドが実行できないのでパフォーマンスが落ちます。また、ロックをかけることによりデッドロックやプライオリティの逆転現象が起きる危険性が高まります。そこで考え出されたのが細粒度ロックです。細粒度ロックでは、従来の様にコンテナ全体にロックをかけるのではなく、必要な部分だけロックをかけます。そうすることにより、ロックに起因する問題が発生する確率を下げ、同時に実行できるスレッドを増やしてパフォーマンスをアップさせます。
ロックフリー・アルゴリズムは、アトミックな命令を駆使して極力ロックをかけない技法です。ロックを最小限にするので、デッドロックによる危険性を下げ、パフォーマンスをアップさせます。
この2つの技法は非常に高度なものです。スレッドセーフでないコンテナを使用し、排他制御を駆使してプログラミングするよりも安全性とパフォーマンスが増すため、並列プログラミングでは積極的に使いましょう。
ただし、スレッドセーフなコンテナは、スレッドセーフでないコンテナと比べて大変複雑なものなので、逐次プログラミングで使用するとパフォーマンスが落ちます。逐次プログラミングの部分は従来のコンテナを使用するべきです。
おわり
今回はインテルTBBのコンテナとスレッドセーフについて解説しました。インテルTBBは変化が早く、現在の最新版2.2はTBB2.0からかなり変更されています。インテルTBB2.2はまだ情報が少ないので、できるだけ最新情報を盛り込みました。少しでも皆さまのお役にたてれば幸いです。
次回もインテルTBBの最新情報を盛り込みつつ、並列処理についての解説を行います。お楽しみに。
参考資料
書籍
- 『インテル スレッディング・ビルディング・ブロック』 James Reinderss著、菅原清文・エクセルソフト訳、オライリー・ジャパン、2008年2月26日
Webサイト
この記事は参考になりましたか?
既に会員の方はを行ってください。
- インテルTBBを通じて学ぶ並列処理連載記事一覧
-
- インテルTBBのスレッドクラス
- マルチスレッドを安全に実行する
- スレッドセーフとインテルTBBのコンテナ
- この記事の著者
-
インドリ(インドリ)
分析・設計・実装なんでもありのフリーエンジニア。ブログ「無差別に技術をついばむ鳥(http://indori.blog32.fc2.com/)」の作者です。アドバイザーをしたり、システム開発したり、情報処理技術を研究したりと色々しています。座右の銘は温故知新で、新旧関係なく必要だと考えたものは全て学...
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
