JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
Oracle Solaris Studio 12.2: C ユーザーガイド
search filter icon
search icon

ドキュメントの情報

はじめに

1.  C コンパイラの紹介

2.  C コンパイラ実装に固有の情報

3.  C コードの並列化

3.1 概要

3.1.1 使用例

3.2 OpenMP に対する並列化

3.2.1 OpenMP の実行時の警告の処理

3.3 環境変数

3.3.1 PARALLEL または OMP_NUM_THREADS

3.3.2 SUNW_MP_THR_IDLE

3.3.3 SUNW_MP_WARN

3.3.4 STACKSIZE

3.3.5 並列コードでの restrict の使用

3.4 データの依存性と干渉

3.4.1 並列実行モデル

3.4.2 固有スカラーと固有配列

3.4.3 ストアバック変数の使用

3.4.4 縮約変数の使用

3.5 処理速度の向上

3.5.1 アムダールの法則

3.5.1.1 オーバーヘッド

3.5.1.2 ガスタフソンの法則

3.6 負荷バランスとループのスケジューリング

3.6.1 静的 (チャンク) スケジューリング

3.6.2 セルフスケジューリング

3.6.3 ガイド付きセルフスケジューリング

3.7 ループの変換

3.7.1 ループの分散

3.7.2 ループの融合

3.7.3 ループの交換

3.8 別名と並列化

3.8.1 配列およびポインタの参照

3.8.2 制限付きポインタ

3.8.3 明示的な並列化およびプラグマ

3.8.3.1 直列プラグマ

3.8.3.2 並列プラグマ

for ループの入れ子

並列化の適切性

プロセッサの数

変数の分類

スレッド private 変数と shared 変数のデフォルトのスコープの規則

private 変数

shared 変数

readonly 変数

storeback 変数

savelast

reduction 変数

スケジューリングの制御

3.9 メモリーバリアー組み込み関数

4.  lint ソースコード検査プログラム

5.  型に基づく別名解析

6.  ISO C への移行

7.  64 ビット環境に対応するアプリケーションへの変換

8.  cscope: 対話的な C プログラムの検査

A.  機能別コンパイラオプション

B.  C コンパイラオプションリファレンス

C.  ISO/IEC C 99 の処理系定義の動作

D.  C99 でサポートされている機能

E.  ISO/IEC C90 の処理系定義の動作

F.  ISO C データ表現

G.  パフォーマンスチューニング

H.  K&R Solaris Studio C と Solaris Studio ISO C の違い

索引

3.3 環境変数

並列化された C には、関連する環境変数として次の 4 つが存在します。

3.3.1 PARALLEL または OMP_NUM_THREADS

マルチプロセッサ実行を活用できる場合は、PARALLEL 環境変数を設定します。PARALLEL 環境変数には、プログラムの実行に使用できるプロセッサの数を指定します。次は、PARALLEL を 2 に設定する例を示しています。

% setenv PARALLEL 2

対象マシンに複数のプロセッサが搭載されている場合は、スレッドは個々のプロセッサにマップできます。この例では、プログラムを実行すると、2 個のスレッドが生成され、各スレッド上でプログラムの並列化された部分が実行されるようになります。

PARALLEL OMP_NUM_THREADS のどちらかを使用できます。これらは同等です。

3.3.2 SUNW_MP_THR_IDLE

現在のところ、プログラムの初期実行を行うスレッドが結合スレッドを作成します。作成されたこれらの結合スレッドは、プログラムの並列部分 (並列ループ、並列領域など) の実行に加わり、プログラムの順次実行部分が実行される間スピン待ち状態を維持します。これらの結合スレッドは、プログラムが終了するまで休眠または停止することはありません。並列化されたプログラムを 1 つのシステム上で実行する場合は、結合スレッドをスピン待ちにすると最高のパフォーマンスが得られます。ただし、スピン待ちのスレッドはシステム資源を使用します。

SUNW_MP_THR_IDLE 環境変数は、各スレッドが並列ジョブの分担部分を終えたあとの各スレッドの状態を制御するために使用してください。

% setenv SUNW_MP_THR_IDLE value

valueには、spin または sleep[n s|n ms] のどちらかを指定できます。デフォルトは sleep であり、スレッドを n 単位のスピン待ちにしたあと、休眠させます。待ち時間の単位は秒 (s、デフォルトの単位) かミリ秒 (ms) で、1s は 1 秒、10ms は 10 ミリ秒を意味します。引数を取らずに sleep を指定すると、スレッドは並列化タスクの完了直後にスリープ状態に入ります。sleepsleep0sleep0s、および sleep0ms はすべて同等です。n 単位が到着する前に新しいジョブが到着すると、スレッドはスピンを停止し、新しいジョブを開始します。

もう 1 つの選択肢は spin です。並列化タスクの完了したスレッドは、新しい並列化タスクが到着するまでスピン (busy-wait) します。

SUNW_MP_THR_IDLE に不正な値が含まれているか、設定されていない場合は、デフォルトとして sleep が使用されます。

3.3.3 SUNW_MP_WARN

この環境変数を TRUE に設定すると、OpenMP そのほかの並列化ランタイムシステムから発行された警告メッセージを出力できます。

% setenv SUNW_MP_WARN TRUE

sunw_mp_register_warn() を使用して、警告メッセージを処理する関数を登録してある場合、SUNW_MP_WARN は警告メッセージを出力しません。これは、環境変数を TRUE に設定してある場合も同様です。関数を登録しておらず、SUNW_MP_WARNTRUE に設定してある場合、SUNW_MP_WARN は警告メッセージを stderr に出力します。関数を登録しておらず、SUNW_MP_WARN を設定していない場合、警告メッセージは発行されません。sunw_mp_register_warn() の詳細については、「3.2.1 OpenMP の実行時の警告の処理」を参照してください。

3.3.4 STACKSIZE

プログラムを実行すると、マスタースレッドにはメインメモリースタックが、各スレーブスレッドには個別のスタックが保持されます。スタックとは、サブプログラムが呼び出されている間、引数と自動変数を保持するために使用される一時的なメモリーアドレス空間です。

メインスタックのデフォルトサイズは、およそ 8M バイトです。現在のスタックサイズの確認と設定には、limit コマンドを使用します。次に例を示します。

% limit
cputime unlimited
filesize unlimited
datasize 2097148 kbytes
stacksize 8192 kbytes <- current main stack size
coredumpsize 0 kbytes
descriptors 256
memorysize unlimited
% limit stacksize 65536 <- set main stack to 64Mb

マルチスレッド化されたプログラムの各スレーブスレッドは、それ自体のスレッドスタックを持ちます。このスタックはマスタースレッドのメインスタックに似ていますが、各スレッド固有のものです。スレッドのスタックには、スレッド固有の配列とその (スレッドに対して局所的な) 変数が割り当てられます。

スレーブスレッドはすべて、同じスタックサイズを持ちます。デフォルトのスタックサイズは、32 ビットアプリケーションの場合は 4M バイト、64 ビットアプリケーションの場合は 8M バイトです。このサイズは、STACKSIZE 環境変数で設定します。

% setenv STACKSIZE 16483 <- Set thread stack size to 16 Mb

並列化されたコードでは、通常、スレッドのスタックサイズをデフォルト値より大きな値に設定する必要があります。

時折、スタックサイズを増やす必要があるという警告メッセージがコンパイラによって表示されることがあります。しかし、通常 (とりわけスレッド固有 / 局所の配列が関わる場合)、設定すべきサイズは試行錯誤でしか把握できません。スタックサイズがスレッドを実行するには小さすぎる場合、プログラムはセグメント例外を生成して終了します。

STACKSIZE 環境変数の設定は、Solaris pthreads API を使用しているプログラムに影響しません。

3.3.5 並列コードでの restrict の使用

並列化された C では、キーワード restrict を使用できます。キーワード restrict を適切に使用すると、コードシーケンスを並列化できるかどうかを判別するために必要なデータの別名をオプティマイザが認識する場合に有効です。詳細については、「D.1.2 C99 のキーワード」を参照してください。