Entry

プログラミングメモ - Intel TBB の性能がヤバい件について

2009年07月25日

せっかく Intel TBB の製品版を持っているから,どれくらいパフォーマンスが上がるのか試してみたんですけれど,これはすごい。ここでは TBB の使い方について詳しい話はできないんですけれど,実行結果だけ紹介しておきます。

試してみたのは,いわゆる RLSA アルゴリズムというもの。これはこれで興味のある方は調べてもらいたいんですけれど,その界隈では有名なアルゴリズム(というほどのものでもないが)です。ざっくりと説明すると,画像データの画素を走査する類の処理で,普通の書き方で描くとこんなモノ。

void
doHorizontalRLSA(BitmapImage& bitmapImage) const throw (std::exception) {
    Int32 width = bitmapImage.getWidth();
    Int32 height = bitmapImage.getHeight();
    for (Int32 i = 0; i < height; ++i) {
        bool isInLine = false;
        Int32 bgCount = 0;
        // horizontal RLSA
        for (Int32 j = 0; j < width; ++j) {
            UInt32& pixel = bitmapImage(j, i);
            if (isInLine) {
                if (isForeground(pixel)) {
                    // do nothing
                } else {
                    ++bgCount;
                    isInLine = false;
                }
            } else {
                if (isForeground(pixel)) {
                    if (bgCount <= thresh_) {
                        // fill background with foreground color
                        for (Int32 k = j - bgCount; k < j; ++k) {
                            bitmapImage(k, i) = 0;
                        }
                    }
                    bgCount = 0;
                    isInLine = true;
                } else {
                    ++bgCount;
                }
            }
        }
    }
}

何をやってるかは雰囲気で分かると思います。

で,これを Intel TBB 版と自前のシングルスレッド版でそれぞれ作ってみました。対象の画像は,2480 x 3507 ピクセルで,実行環境は,Windows xp sp3 + Intel Core2 Duo E8400 (3.00 GHz) + 3.25 GB RAM という構成。TBB による並列処理は tbb::parallel_for を使い,グレンサイズは tbb::auto_partitioner に任せています。時間計測には,tbb::tick_count を使いました。

で,結果。それぞれ,5回実行時の平均です。

シングルスレッド版0.191009 (sec)
TBB 版0.106045 (sec)

約1.80倍も性能が向上しました。今回は,特にハンドオプティマイズはしていなくて,アルゴリズムの説明にあったものをそのまま実装しただけなんですけれど,それでもかなり性能が向上しています。すごいな,これ。

画像処理は,メモリアクセスが頻繁に起きるので,演算装置(CPU)で並列化しても I/O がボトルネックになると思っていたんですけれど,そんな心配はまったくありませんでした。ほぼ,コアの数と同じくらいの速度比が出ている。また,実装面からいっても,ループになる箇所のファンクタクラスを用意するだけでいいので,とてもお手軽に作ることができました。IA32 の Windows/Linux システムで並列処理を手軽に組み込む場合,これは超お勧めです。

TBB はフリーのライブラリも出ているので,興味のある方はチェックしてみるといいかも。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN