現在のところ、プログラムの初期実行を行うスレッドが結合スレッドを作成します。作成されたこれらの結合スレッドは、プログラムの並列部分 (並列ループ、並列領域など) の実行に加わり、プログラムの順次実行部分が実行される間スピン待ち状態を維持します。これらの結合スレッドは、プログラムが終了するまで休眠または停止することはありません。並列化されたプログラムを 1 つのシステム上で実行する場合は、結合スレッドをスピン待ちにすると最高のパフォーマンスが得られます。ただし、スピン待ちのスレッドはシステム資源を使用します。
SUNW_MP_THR_IDLE 環境変数は、各スレッドが並列ジョブの分担部分を終えたあとの各スレッドの状態を制御するために使用してください。
% setenv SUNW_MP_THR_IDLE 値 |
値には、spin または sleep[n s|n ms] のどちらかを指定できます。デフォルトは spin です。並列化タスクの完了したスレッドは、新しい並列化タスクが到着するまでスピン (busy-wait) します。
そのほかに、n 単位をスピン (busy-wait) してから、sleep[n s|n ms] によりスレッドをスリープ状態にすることもできます。待ち時間の単位は秒 (s、デフォルトの単位) かミリ秒 (ms) で、1s は 1 秒、10ms は 10 ミリ秒を意味します。引数を取らずに sleep を指定すると、スレッドは並列化タスクの完了直後にスリープ状態に入ります。sleep、sleep0、sleep0s、および sleep0ms はすべて同等です。
n 単位が到着する前に新しいジョブが到着すると、スレッドはスピンを停止し、新しいジョブを開始します。SUNW_MP_THR_IDLE に不正な値が含まれているか、設定されていない場合は、デフォルトとして spin が使用されます。
この環境変数を TRUE に設定すると、OpenMP そのほかの並列化ランタイムシステムから発行された警告メッセージを出力できます。
% setenv SUNW_MP_WARN TRUE |
sunw_mp_register_warn() を使用して、警告メッセージを処理する関数を登録してある場合、SUNW_MP_WARN は警告メッセージを出力しません。これは、環境変数を TRUE に設定してある場合も同様です。関数を登録しておらず、SUNW_MP_WARN を TRUE に設定してある場合、SUNW_MP_WARN は警告メッセージを stderr に出力します。関数を登録しておらず、SUNW_MP_WARN を設定していない場合、警告メッセージは発行されません。sunw_mp_register_warn() の詳細については、「3.2.1 OpenMP の実行時の警告の処理」を参照してください。
プログラムを実行すると、マスタースレッドにはメインメモリースタックが、各スレーブスレッドには個別のスタックが保持されます。スタックとは、サブプログラムが呼び出されている間、引数と自動変数を保持するために使用される一時的なメモリーアドレス空間です。
メインスタックのデフォルトサイズは、およそ 8M バイトです。現在のスタックサイズの確認と設定には、limit コマンドを使用します。次に例を示します。
% limit cputime 制限なし filesize 制限なし datasize 2097148 kbytes stacksize 8192 kbytes <- 現在のメインスタックのサイズ coredumpsize 0 kbytes descriptors 256 memorysize 制限なし % limit stacksize 65536 <- メインスタックのサイズを 64M バイトに設定 |
マルチスレッド化されたプログラムの各スレーブスレッドは、それ自体のスレッドスタックを持ちます。このスタックはマスタースレッドのメインスタックに似ていますが、各スレッド固有のものです。スレッドのスタックには、スレッド固有の配列とその (スレッドに対して局所的な) 変数が割り当てられます。
スレーブスレッドはすべて、同じスタックサイズを持ちます。デフォルトのスタックサイズは、32 ビットアプリケーションの場合は 4M バイト、64 ビットアプリケーションの場合は 8M バイトです。このサイズは、STACKSIZE 環境変数で設定します。
% setenv STACKSIZE 16483 <- スレッドのスタックサイズを 16M バイトに設定 |
並列化されたコードでは、通常、スレッドのスタックサイズをデフォルト値より大きな値に設定する必要があります。
時折、スタックサイズを増やす必要があるという警告メッセージがコンパイラによって表示されることがあります。しかし、通常 (とりわけスレッド固有 / 局所の配列が関わる場合)、設定すべきサイズは試行錯誤でしか把握できません。スタックサイズがスレッドを実行するには小さすぎる場合、プログラムはセグメント例外を生成して終了します。