並列アプリケーションを作ってみよう

 インテルのCoreシリーズCPUが登場して以来、マルチコアCPUは爆発的に普及している。現在では比較的低価格なCPUでも複数のコアを搭載するようになり、現在販売されているPCのほとんどはマルチコアに対応しているといっても過言ではない。しかし、まだマルチコアCPUの性能を生かす、並列処理を行っているアプリケーションは多くない。

 並列処理は、一般には実装が難しい、という印象があるようだ。確かにスレッドを駆使して処理を並列化する場合、スレッドの管理やスレッド毎の連携など、考慮しなければならないことが増え面倒ではある。しかし、プログラムを並列化するための言語規格「OpenMP」や、C++用の並列化ライブラリ「Threading Building Blocks」といった並列化支援技術を利用することで、プログラムの並列化へのハードルは大幅に低くなる。また、インテルの開発製品「Parallel Studio」に含まれる「Parallel Composer」には、独自の並列化支援機能を備えたC/C++コンパイラーが含まれている。このような技術や製品を利用すれば、手軽に並列処理を実装することが可能だ。

 本記事では、このような技術を利用した並列処理の実装方法を、簡単な画像処理アプリケーションを例に説明していこう。

スレッドを利用した並列化

 今回サンプルに使用するアプリケーションは、画像に対して「メディアンフィルタ」と呼ばれるフィルタ処理を行うものだ(ソースコード全文は記事末にリスト1として掲載)。メディアンフィルタとは、ノイズ除去等を目的に利用される画像処理フィルタで、あるピクセルに対し、そのピクセルの周辺にあるピクセルの値の中央値をそのピクセルの値とするものである(図1)。これにより、図2のように単発的に発生するノイズ(ごましおノイズとも呼ばれる)を軽減する効果がある。

図1 メディアンフィルタの概要
図1 メディアンフィルタの概要
図2 メディアンフィルタの適用例
図2 メディアンフィルタの適用例

 今回作成したアプリケーションでは、指定したカラーJPEG画像に対してメディアンフィルタを適用し、JPEG形式で保存するコマンドラインアプリケーションだ。対象画像ファイルおよびフィルタを適用後の画像ファイルはコマンドライン引数で指定する。処理の流れは図3のようになる(ソースコード全文は記事末にリスト1として掲載)。

図3 今回作成するアプリケーションの処理の流れ
図3 今回作成するアプリケーションの処理の流れ