インテル® C++ コンパイラー 19.0 デベロッパー・ガイドおよびリファレンス

オペレーティング・システムに関する注意事項

インテル® Cilk™ Plus は古い機能 (非推奨) です。代わりに、OpenMP* またはインテル® TBB を使用してください。詳細は、「インテル® Cilk™ Plus の代わりに OpenMP* またはインテル® TBB を使用するためのアプリケーションの移行」 (英語) を参照してください。

その他のツールでのインテル® Cilk™ Plus プログラムの使用

インテル® Cilk™ Plus は古い機能 (非推奨) です。代わりに、OpenMP* またはインテル® TBB を使用してください。詳細は、「インテル® Cilk™ Plus の代わりに OpenMP* またはインテル® TBB を使用するためのアプリケーションの移行」 (英語) を参照してください。

インテル® Cilk™ Plus プログラムのスタックレイアウトは、C および C++ の標準規則と異なります。そのため、バイナリー形式のプログラム実行ファイルを解析するツール (valgrind やコードカバレッジ・ツールなどのメモリーチェッカーを含む) では、インテル® Cilk™ Plus プログラムの並列処理を解析できないことがあります。通常、そのような場合には、ワーカーを 1 にしてプログラムをシリアル実行すると良いでしょう (つまり、CILK_NWORKERS 環境変数を 1 に設定します)。それでも解析できない場合は、インテル® Cilk™ Plus プログラムをシリアル化してから、解析ツールを使用してみてください。

OS スレッドとの相互作用

インテル® Cilk™ Plus は古い機能 (非推奨) です。代わりに、OpenMP* またはインテル® TBB を使用してください。詳細は、「インテル® Cilk™ Plus の代わりに OpenMP* またはインテル® TBB を使用するためのアプリケーションの移行」 (英語) を参照してください。

OS スレッドを使用する場合、次の点に注意する必要があります。

ワーカースレッドは OS スレッドである

ランタイムシステムは、ネイティブ OS の機能を使用してワーカースレッドのセットを割り当てます。

インテル® Cilk™ Plus プログラムは常に利用可能なすべてのプロセッサーを 100% 使用するわけではない

インテル® Cilk™ Plus プログラムを実行すると、並列処理がない場合でも、プログラムがシステムのすべてのプロセッサーのリソースを消費しているかのように見えることがあります。特に、Windows* タスク・マネージャーの [パフォーマンス] タブで、1 つのストランドのみ実行している場合に、すべての CPU がビジー状態になることがあります。

実際には、ランタイム・スケジューラーは、CPU をほかのプログラムに譲ります。ただし、プロセッサーを必要としているプログラムがない場合は、スチールする作業を探すために直ちにワーカーが実行され、これにより CPU がビジー状態になります。そのため、プログラムが常にすべてのプロセッサーを使用しているように見えますが、システムやほかのプログラムの妨げとなることはありません。

ネイティブ・スレッド・インターフェイスを使用する場合には注意が必要である

インテル® Cilk™ Plus のストランドは OS スレッドではありません。実行中に、ストランドがワーカー間を移動することはありません。ただし、cilk_spawncilk_sync、または cilk_for は 1 つまたは複数のストランドを終了し、1 つまたは複数の新しいストランドを作成するため、これらの文の後にワーカーが変わることがあります。また、特定のストランドを実行するワーカーを制御する方法もありません。

これは、プログラムにいくつかの影響を与えますが、次の点が最も重要です。

Microsoft* Foundation Class とインテル® Cilk™ Plus プログラム

インテル® Cilk™ Plus は古い機能 (非推奨) です。代わりに、OpenMP* またはインテル® TBB を使用してください。詳細は、「インテル® Cilk™ Plus の代わりに OpenMP* またはインテル® TBB を使用するためのアプリケーションの移行」 (英語) を参照してください。

このトピックは、Windows* 開発者向けです。

Microsoft* Foundation Class (MFC) ライブラリーは、クラスラッパーからオブジェクトの GDI ハンドラーをマップするスレッド・ローカル・ストレージに依存します。インテル® Cilk™ Plus のストランドは、どの OS スレッドでも実行できるわけではないため、インテル® Cilk™ Plus を使用する並列コードでは MFC 関数を安全に呼び出すことができません。

通常、MFC ベースのアプリケーションで計算集約的なタスクを実行する方法は 2 つあります。

ランタイムシステムは OS スレッドを切り替えることができるため、インテル® Cilk™ Plus コードはスレッド・ローカル・ストレージに依存する MFC などのコードと分離する必要があります。

MFC プログラムに演算スレッドを追加するには、次の操作を実行します。

  1. OS 機能 (_beginthreadexAfxBeginThread) を使用して演算スレッドを作成します。インテル® Cilk™ Plus に変換する C++ コードはすべてこのスレッドで実行する必要があります。演算スレッドによりメイン (UI) スレッドは計算集約的なタスクから解放され、メッセージポンプを実行して、ウィンドウメッセージの処理と UI の更新を行うことができます。

  2. UI ウィンドウのハンドル (HWND) を演算スレッドに渡します。UI の更新が必要になると、演算スレッドは PostMessage を呼び出して UI スレッドにメッセージを送信します。PostMessage はメッセージをマーシャリングして、ウィンドウハンドルを作成したスレッドに関連付けられているメッセージキューに追加します。SendMessage は使用しないでください。SendMessage は、正しい (UI) スレッドではない現在実行中のスレッドで実行されます。

  3. C++ プログラムをテストして、ロジックとスレッド管理が正しいことを確認します。

  4. 演算スレッドのロジックにインテル® Cilk™ Plus 構造を追加します。

  5. 終了する前に、メイン (UI) スレッドは WaitForSingleObject() を使用して、演算スレッドが完了するのを待機しなければなりません。

製品に含まれる QuickDemo サンプルプログラムは、インテル® Cilk™ Plus アプリケーションで MFC を使用する例を示します。

その他の推奨事項: