Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

マルチコア時代の定番チューニングツール
「インテルParallel Studio 2011」

インテルParallel Studio 2011の新機能紹介

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2010/10/13 14:00
目次

Parallel Composer 2011の新機能

 Parallel Composer 2011は、高性能なコードを出力するインテルC++コンパイラーとデバッガ、並列化のための各種ライブラリを含み、並列化アプリケーション実装の中心となる製品です。

 今回のバージョンでは、以下のような新機能が追加されています。

  • インテルC++コンパイラーがC++の次期標準であるC++0xのサポートを拡大
  • 並列化のためのC/C++言語拡張であるインテルCilk Plus(シルクプラス)
  • 並列化ライブラリであるArray Building Blocks(ベータ版)

 本記事では、注目株のインテルCilk Plus(以下、Cilk Plus)を解説します。

Cilk Plus

 Cilk Plusは並列化処理のためのC/C++言語拡張です(綴りはClickやClikではなくCilkなのでタイプミスに注意)。

 シンプルな記法で、ループや特定の関数呼び出しなどを並列化処理することができます。Cilk Plusで定義されているキーワードは以下の3つです。

表3 Cilk Plusのキーワードと機能
キーワード 機能 別名
_Cilk_for 並列でfor文を処理する cilk_for
_Cilk_spawn 並列で関数を呼び出す cilk_spawn
_Cilk_sync _Cilk_spawnの結果を待つ cilk_sync

 なお、各キーワードは<cilk/cilk.h>で別名でも定義されています。

 このようにCilk Plusのキーワードはわずか3つで、使い方も実にシンプルです。

 例えば、これまで逐次処理していたfor文を並列処理する際は、以下のようにコードを書き換えます。

cilk_forによるループの並列処理
for(int i = 0 ; i < LOOP_MAX ; i++){
  //処理内容
}

 ↓

cilk_for(int i = 0 ; i < LOOP_MAX ; i++){
  //並列処理内容
}

 同様に、逐次的に関数呼び出しを行っていた部分を並列処理する際は、以下のようにコードを置き換えます。

cilk_spawnによる関数呼び出しの並列処理
someMethod1(); //1番目のメソッド呼び出し
someMethod2(); //1番目のメソッド終了後、2番目のメソッド呼び出し
someMethod3(); //同上

 ↓

cilk_spawn someMethod1(); //メソッドを並列に呼び出し
cilk_spawn someMethod2(); //someMethod1の終了を待たず、メソッドを並列に呼び出し
cilk_spawn someMethod3(); //同上
cilk_sync; //すべてのメソッド終了まで待つ

 Parallel Composer 2011には、よく知られたアルゴリズムであるクイックソートをcilk_spawnを使って並列化したサンプルが含まれています({Parallel Studio 2011をインストールしたフォルダ}\Composer\Samples\en_US\C++\Cilk\qsort)。

 クイックソートはソート対象を小さな問題に分割しながら処理を行う分割統治法を用いていますが、このサンプルでは、分割した前半部分を並列に再帰呼び出ししています。

cilk_spawnによるクイックソートの並列処理
//クイックソートを行う再帰関数
void sample_qsort(int * begin, int * end)
{
    if (begin != end) {
        --end;
        int * middle = std::partition(begin, end,
                          std::bind2nd(std::less<int>(), *end));
        using std::swap;
        swap(*end, *middle);

        //前半部分をcilk_spawnで並列処理
        cilk_spawn sample_qsort(begin, middle);
        //後半部分は逐次処理(直後にcilk_syncがあるため、並列処理する意味がない)
        sample_qsort(++middle, ++end);
        //並列処理結果を待つ
        cilk_sync;
    }
}

 この並列処理クイックソートと、cilk_spawn,cilk_syncを除いた逐次処理クイックソートで、100,000,000個の数字を処理したところ、以下のように17%ほどの高速化が確認できました(筆者の環境はIntel Core 2 Duo T9300 2.5GHz デュアルコア)。

表4 100,000,000個の数字のクイックソート処理
逐次処理 13375ms
並列処理 11140ms

 また、Parallel Composer同梱のQuickDemoサンプル({Parallel Studio 2011をインストールしたフォルダ}\Composer\Samples\en_US\C++\Cilk\QuickDemo)では、並列処理と逐次処理の処理速度を並列度を変えながら視覚的に比較することができます。

図2 並列処理と逐次処理を比較できるQuickDemoサンプル
図2 並列処理と逐次処理を比較できるQuickDemoサンプル

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

  • WINGSプロジェクト 土井 毅(ドイ ツヨシ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

バックナンバー

連載:インテルソフトウェア開発製品による並列化プログラミング
All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5