SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

インテルソフトウェア開発製品による並列化プログラミング(AD)

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

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

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

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サンプル

次のページ
Parallel Inspector 2011の新機能

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
インテルソフトウェア開発製品による並列化プログラミング連載記事一覧

もっと読む

この記事の著者

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5484 2010/10/13 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング