インテルTBBのコンテナを使用する理由
TBBなどの高度な並列処理ライブラリや機能が登場するまでは、マルチスレッドプログラミングは排他制御などの技法を駆使して行われていました。そのため、古くからマルチスレッドプログラミングをしていた人の中には、どうせロックをかけるのだからスレッドセーフではないコンテナでも別にかまわないという方がいるでしょう。しかし筆者は、並列処理時には極力インテルTBBのコンテナを使用することをお勧めします。理由はインテルTBBのコンテナクラスがファイングレイン・ロック(細粒度ロック)とロックフリー・アルゴリズムで実装されているからです。
細粒度ロックとは、絶対に必要となる部分だけをロックする技法のことです。ロックは広い範囲でかけると安全性が増しますが、ロックしているコードは、他のスレッドが実行できないのでパフォーマンスが落ちます。また、ロックをかけることによりデッドロックやプライオリティの逆転現象が起きる危険性が高まります。そこで考え出されたのが細粒度ロックです。細粒度ロックでは、従来の様にコンテナ全体にロックをかけるのではなく、必要な部分だけロックをかけます。そうすることにより、ロックに起因する問題が発生する確率を下げ、同時に実行できるスレッドを増やしてパフォーマンスをアップさせます。
ロックフリー・アルゴリズムは、アトミックな命令を駆使して極力ロックをかけない技法です。ロックを最小限にするので、デッドロックによる危険性を下げ、パフォーマンスをアップさせます。
この2つの技法は非常に高度なものです。スレッドセーフでないコンテナを使用し、排他制御を駆使してプログラミングするよりも安全性とパフォーマンスが増すため、並列プログラミングでは積極的に使いましょう。
ただし、スレッドセーフなコンテナは、スレッドセーフでないコンテナと比べて大変複雑なものなので、逐次プログラミングで使用するとパフォーマンスが落ちます。逐次プログラミングの部分は従来のコンテナを使用するべきです。
おわり
今回はインテルTBBのコンテナとスレッドセーフについて解説しました。インテルTBBは変化が早く、現在の最新版2.2はTBB2.0からかなり変更されています。インテルTBB2.2はまだ情報が少ないので、できるだけ最新情報を盛り込みました。少しでも皆さまのお役にたてれば幸いです。
次回もインテルTBBの最新情報を盛り込みつつ、並列処理についての解説を行います。お楽しみに。
参考資料
書籍
- 『インテル スレッディング・ビルディング・ブロック』 James Reinderss著、菅原清文・エクセルソフト訳、オライリー・ジャパン、2008年2月26日