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

ドキュメントの情報

はじめに

1.  C コンパイラの紹介

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

3.  C コードの並列化

3.1 並列化の概要

3.2 OpenMP に対する並列化

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

3.2.2 環境変数

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

3.3 データの依存性と干渉

3.3.1 並列実行モデル

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

3.3.3 ストアバック

3.3.4 縮約変数

3.4 処理速度の向上

3.4.1 アムダールの法則

3.4.1.1 オーバーヘッド

3.4.1.2 ガスタフソンの法則

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

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

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

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

3.6 ループの変換

3.6.1 ループの分散

3.6.2 ループの融合

3.6.3 ループの交換

3.7 別名と並列化

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

3.7.2 制限付きポインタ

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

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.  Oracle Solaris Studio C: K&R C と ISO C の違い

索引

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

コンパイラには、SPARC プロセッサと x86 プロセッサ用のさまざまなメモリーバリアー組み込み関数を定義する、ヘッダーファイル mbarrier.h が用意されています。これらの組み込み関数は、独自の同期プリミティブを使用してマルチスレッドコードを記述する開発者に役立つ場合があります。これらの組み込み関数がいつ必要になるか、また特定の状況で必要かどうかを判断するには、プロセッサのドキュメントを参照してください。

mbarrier.h によってサポートされるメモリーオーダリング組み込み関数を次に示します。

__compiler_barrier() 組み込み関数以外のバリアー組み込み関数はすべて、メモリーオーダリング命令を生成します。x86 プラットフォームの場合、これらは mfencesfence、または lfence 命令です。SPARC プラットフォームの場合、これらは membar 命令です。

__compiler_barrier() 組み込み関数は、命令を生成せず、代わりに今後メモリー操作を開始する前にそれまでのメモリー操作をすべて完了する必要があることをコンパイラに通知します。実際の結果としては、局所でない変数と、static 記憶クラス指定子を持つ局所変数はすべて、バリアー前にメモリーに戻され、バリアー後に再ロードされます。コンパイラがバリアー前からのメモリー操作とバリアー後からのメモリー操作を混在させることはありません。ほかのすべてのバリアーには、__compiler_barrier() 組み込み関数の動作が暗黙的に含まれています。

次の例では、__compiler_barrier() 組み込み関数が存在しているため、コンパイラによる 2 つのループのマージが止まります。

#include "mbarrier.h"
int thread_start[16];
void start_work()
{
/* Start all threads */
   for (int i=0; i<8; i++)
   {
     thread_start[i]=1;
   }
   __compiler_barrier();
/* Wait for all threads to complete */
   for (int i=0; i<8; i++)
   {
      while (thread_start[i]==1){}
   }
}