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 つのテクノロジーで構成されています。
- 3 つのキーワード (タスク並列)。
- Fortran の配列表記 (Array Notation) を C/C++ で利用できるようにした機能 (ベクトル化)。
- #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 対応関数) を使用するケース
次回お楽しみを。