「Cilk がやってきた」から「さよなら Cilk Plus」へ

同カテゴリーの次の記事

インテル® Parallel Studio XE 2018 に含まれるインテル® C++ コンパイラー 18.0 for Windows* リリースノート

  2017 年 9 月に発表されたインテル® C++ コンパイラー バージョン 18.0 で、インテル® Cilk™ Plus のサポートが将来のインテル® C++ コンパイラーのバージョンでは打ち切られることが正式になりました (V18 ではインテル® Cilk™ Plus の構文を含むソースをコンパイルすると、コンパイラーから警告が出ます))。
 

そして、OpenMP* やインテル® スレッディング・ビルディング・ブロック (インテル® TBB) など他のテクノロジーへの移行が推奨されるようになりました。gcc のブランチにあるインテル® Cilk™ Plus のサポートがどうなるかは不明ですが、日本で唯一のインテル® Cilk™ Plus 書籍 (たぶん) の著者としては若干複雑な思いです。

本稿では、インテル® Cilk™ Plus の過去を少し振り返り、以降 3 回に分けてすべての機能が既存の他のテクノロジーへ移行が可能であるか検討していきます。

上記の書籍が出版されたのは 2011 年 2 月です。インテル® Cilk™ Plus をサポートする最初のインテル® コンパイラー V12 が発表されてから、5 カ月経過していました。その頃、インテル® Cilk™ Plus をサポートするコンパイラーは、インテル® C++ コンパイラーしかなく訴求に苦労したものです。2011 年の 8 月には、インテル® Cilk™ Plus の仕様がオープンソース化され、gcc 4.7 での cilkplus ブランチの開発が発表されました。インテル® Cilk™ Plus がそれほど普及しなかった大きな要因は、Visual C++* でサポートされなかったことをあげてもいいでしょう。対照的に、OpenMP* は Visual C++* 2005 でサポートされたことにより、Windows* 開発者の間で着々とユーザー数を増やしてきました。

インテル® Cilk™ Plus の機能とは?
Cilk というと、cilk_for、cilk_spawn そして cilk_sync の 3 つのキーワードによる簡単なタスク・プログラミングが注目されますが、実は 3 つのテクノロジーで構成されています。

  1. 3 つのキーワード (タスク並列)。
  2. Fortran の配列表記 (Array Notation) を C/C++ で利用できるようにした機能 (ベクトル化)。
  3. #pragma simd による明示的なベクトル化 (ベクトル化)。

2 番目と 3 番目の機能が、インテル® Cilk™ Plus の Plus にあたり、コンパイラーによるベクトル化を支援します。

これらは、開発者がインテル® Cilk™ Plus の機能とは気付かずにコード中で使用している可能性もあります。そのため、インテル® コンパイラー V17 までは、警告も出ずにコンパイルできていたソースに V18 では次のような警告メッセージが山のように表示されることも考えられますので、驚かないでください。

メッセージには、「Please refer to release notes for details and recommended alternatives」とありますが、リリースノートにはほとんど何も書かれていません。下記への記事へのリンクが掲載されているだけです。
https://software.intel.com/en-us/articles/migrate-your-application-to-use-openmp-or-intelr-tbb-instead-of-intelr-cilktm-plus (英語)

上記の記事の翻訳版を以下に用意しましたので参照ください。
「インテル® Cilk™ Plus アプリケーションを OpenMP* もしくはインテル® TBB へ移行する」

さて、コンパイル時に上記のメッセージを受け取った開発者の皆さんは、「さよなら Cilk Plus」へ向けて今後のスケジュールを立てていただくことになります。将来のリリースでサポートされなくなるとは言っても、次の V18 マイナー・アップデートなどとは考えられないので、実際には次期メジャーバージョンの V19、つまりほぼ 1 年後と考えるのが自然かな、と思います (そうでなかったら、ごめんなさい)。ここ数年、インテル® コンパイラーのメジャー・アップデートは 8 月から 10 月の間に毎年行われているようです。

インテル社から公開されている情報では、機能廃止に対する説明があまりにも不十分だと思われるため、本稿では以降 3 回に分けてインテル® Cilk™ Plus の機能を使用するソースを OpenMP* を使用したソースに移行する方法を解説していきます。OpenMP* を優先した理由は、並列化とベクトル化の両方に対応できるためです (インテル® TBB は並列化しかカバーできません)。以下、今後の予定を参照ください。

第 1 回「Cilk がやってきた」から「さよなら Cilk Plus」
第 2 回「さよなら Cilk Plus」インテル® Cilk™ Plus の 3 つのキーワードを使用するケース
第 3 回「さよなら Cilk Plus」インテル® Cilk™ Plus の配列表記 (Array Section) とヘルパー関数を使用するケース
第 4 回「さよなら Cilk Plus」インテル® Cilk™ Plus の #pragma simd と要素関数 (SIMD 対応関数) を使用するケース

次回お楽しみを。

関連記事

  • 「さよなら Cilk Plus」移行の手順 – 明日のためのその 1 2017 年 9 月に発表されたインテル® C++ コンパイラー バージョン 18.0 で、インテル® Cilk™ Plus のサポートが将来のインテル® C++ コンパイラーのバージョンでは打ち切られることが正式になりました (V18 ではインテル® Cilk™ Plus […]
  • 「さよなら Cilk Plus」移行の手順 – 明日のためのその 2 2017 年 9 月に発表されたインテル® C++ コンパイラー バージョン 18.0 で、インテル® Cilk™ Plus のサポートが将来のインテル® C++ コンパイラーのバージョンでは打ち切られることが正式になりました (V18 ではインテル® Cilk™ Plus […]
  • 「さよなら Cilk Plus」移行の手順 – 明日のためのその 3 (最終回) 2017 年 9 月に発表されたインテル® C++ コンパイラー バージョン 18.0 で、インテル® Cilk™ Plus のサポートが将来のインテル® C++ コンパイラーのバージョンでは打ち切られることが正式になりました (V18 ではインテル® Cilk™ Plus […]
  • インテル® Cilk™ Plus 入門 (全4回)インテル® Cilk™ Plus 入門 (全4回) 本シリーズでは、インテル® Cilk™ Plus の使い方を説明します。インテル® Cilk™ Plus は C および C++ […]
  • インテル® Cilk™ Plus の仕様変更インテル® Cilk™ Plus の仕様変更 2011年に登場したインテル® Parallel Studio 2011 に含まれるインテル® C++ コンパイラー V12.0 から実装が始まったインテル® Cilk™ Plus ですが、コンパイラーのバージョンアップに伴いいくつかの機能強化にともなう変更が行われています。ここで、V15 と V14 […]