次の方法で共有


E. OpenMP C/C++ の実装で定義されている動作

この付録では、この API で "実装で定義されている" と記述されている動作について説明します。各動作について、仕様内のそれぞれ該当する参照箇所が記載されています。

解説

以下の場合について、実装側でその動作を定義および文書化する必要があります。ただし、この一覧ですべてというわけではありません。

  • スレッド数: スレッド数の動的な調整が無効になっているときに並行領域が検出され、その並行領域に対して要求されるスレッド数が、ランタイム システムが提供できるスレッド数を超えている場合、プログラムの動作は実装によって定義されます (9 ページを参照)。

    Visual C++ では、入れ子になっていない並行領域については、最大 64 スレッドが提供されます。

  • プロセッサ数: 任意の時点でスレッドを実際にホストする物理的なプロセッサ数は実装で定義されます (10 ページを参照)。

    Visual C++ では、この数は定数ではなく、オペレーティング システムによって制御されます。

  • スレッド チームの作成: 入れ子になった並行領域を実行するチーム内のスレッド数は実装で定義されています (10 ページを参照)。

    Visual C++ では、これはオぺレーティング システムによって決定されます。

  • schedule(runtime): スケジュールに関する設定は実行時に決定されます。スケジュールのタイプとチャンク サイズは OMP_SCHEDULE 環境変数を設定することによって、実行時に選択できます。この環境変数が設定されていない場合、選択されるスケジュールは実装で定義されます (13 ページを参照)。

    Visual C++ では、スケジュールのタイプは、チャンク サイズ指定のない static になります。

  • 既定のスケジュール: schedule 句が指定されていない場合、既定のスケジュールは実装で定義されます (13 ページを参照)。

    Visual C++ では、既定のスケジュール タイプは、チャンク サイズ指定のない static です。

  • ATOMIC: 実装が、すべての atomic ディレクティブを、同じ一意の名前を持つ critical ディレクティブと置き換えるかどうかは、実装で定義されています (20 ページを参照)。

    Visual C++ では、atomic によって変更されるデータが自然の配置にない場合、あるには 1 バイトまたは 2 バイト長である場合、そのプロパティを満たすすべての分割不可能な操作が 1 つのクリティカル セクションを使用します。それ以外の場合、クリティカル セクションは使用されません。

  • omp_get_num_threads: スレッド数が開発者によって明示的に設定されていない場合、既定値は実装で定義されます (9 ページおよび 37 ページのセクション 3.1.2 を参照)。

    Visual C++ では、スレッド数の既定値は、プロセッサ数と等しくなります。

  • omp_set_dynamic: 動的なスレッド調整の既定の設定は実装で定義されています (39 ページのセクション 3.1.7)。

    Visual C++ では、既定値は FALSE です。

  • omp_set_nested: 入れ子になった並列化が有効な場合、入れ子になった並行領域を実装するスレッド数は実装で定義されます (40 ページのセクション 3.1.9)。

    Visual C++ では、このスレッド数はオぺレーティング システムによって決定されます。

  • OMP_SCHEDULE 環境変数: この環境変数の既定値は実装で定義されています (48 ページのセクション 4.1 を参照)。

    Visual C++ では、スケジュールのタイプは、チャンク サイズ指定のない static です。

  • OMP_NUM_THREADS 環境変数: OMP_NUM_THREADS 環境変数に値が指定されていない場合、指定されている値が正の整数でない場合、またはその値がシステムがサポートしている最大スレッド数を超えている場合は、使用できるスレッド数は実装で定義されます (48 ページのセクション 4.2 を参照)。

    Visual C++ では、指定されている値が 0 以下の場合、スレッド数はプロセッサ数と等しくなります。値が 64 を超えている場合、スレッド数は 64 になります。

  • OMP_DYNAMIC 環境変数: 既定値は実装で定義されています (49 ページのセクション 4.3 を参照)。

    Visual C++ では、既定値は FALSE です。