環境変数は、「アクセラレータ・リージョン」を実行する際に使用するデフォルトのデバイス番号を指定するものである。環境変数の値は、0~正の整数でなければならない。順番に付されて管理されている。コマンドを実行すると、各GPUデバイスのロプロパティが論理番号順に表示できる。指定した場合、システム実装時のデフォルトが使用される。アクセラレータ上で実行された際に、そのイベントを標準出力としてショートメッセージで印字するために使用される。環境変数の値は、負の整数であってはなりません。0を指定するとこの機能を抑止する(デフォルト)。0以外の正数の場合は、カーネルを実行する毎に、ショートメッセージを標準出力に印字する。環境変数は、ビットマスクとして利用する整数定数をセットして、デバイス上の実行イベントの情報を出力するためのものです。イベントを標準出力として出力します。イベントを出力します。0を指定するとこの機能を抑止します(デフォルト)。環境変数は、実行後に簡易プロファイル情報を標準出力に出力するために使用される。環境変数の値は、負の整数であってはなりません。指定するとこの機能を抑止します(デフォルト)。以外の正数の場合は、プロファイル情報を標準出力に印字する。ライブラリパスを設定する必要がある。具体的には、64ビット環境では、$PGI/linux86-64/{バージョン番号}/libをセット、32ビット環境では、$PGI/linux86/{バージョン番号}/libをセットして、当該プログラムを実行する。memory上)のサイズを指定するものである。最大数を指定するものである。バッファの最大値を指定するものである。この最大値は、ターゲット・デバイスによって制限される場合がある。その指定方法は以下の形をとる。directive-name(構文名)は必ず一つ指定すること。指定する場合はカンマあるいは空白で区切る。clause(節)とは、構文の細かな機能を指定するためのオプションと考えれば良い。以下に記載している「構造化ブロック」の意味については、こちらを参照のこと。その指定方法は以下の形をとる。言語のコメント用のプリフィックスである。一つの単語として指定する。この文字の間に空白を入れてはならない。前が空白かタブである限り、どのカラムから記述を開始しても良い。カラムまでに記述することが必要である。カラム目は継続記述子用のカラムとなる。directive-name(構文名)は必ず一つ指定すること。指定する場合は、カンマあるいは空白で区切る。72カラム固定形式で記述されている場合は、以下の形態となる。ディレクティブを継続する場合は、以下のような形態をとる。以降の自由形式の二つの記述書式がある。古いレガシーなプログラムでは、固定形式で記述したプログラムが多いと思うが、この二つの書式の違いによって、アクセラレータ・ディレクティブを「継続」するための書式の書き方が異なる。6カラム目に任意の文字を入れる方法となる。継続を行わなければならない。その方法は以下の通り。6カラム目に「継続文字」を入れて、継続することを指示する。文字を継続文字として使っている。以下のように、7カラム目に空白欄を入れた方が見えやすいかもしれない。入れることで、継続することを指示する。入れると、次の行は継続することを意味する。場合だけは、固定形式となる。カラム形式で記述したプログラムでなければならない。場合は、固定形式あるいは自由形式のどちらの書式であってもソースファイルとして認識する。ディレクティブの説明の中に、「カーネル」あるいは「カーネルコード」という言葉が頻繁に現れる。この言葉の意味を最初に説明しておく。以下の図で説明しているとおり、「カーネル」とはアクセラレータ側で動作するコードのことを意味する。procedure(ルーチン)として切り出し、アクセラレータの並列構造に応じたデバイス・コードとして生成する。ディレクティブの全体像を掴むために、この章では主なディレクティブの機能について概説する。ディレクティブとして三つの構文を覚えることから始めることをお勧めする。以下の図を見て欲しい。構文で、アクセラレータ上にオフロードするループ対象部分を指定するためのディレクティブである。当該対象とするものは、ベクトル化・並列化可能なループであり、ループ文の直前にディレクティブを置くことにより、コンパイラは、自動的にアクセラレータ用の並列化コードを生成する。構文で、ホストとアクセラレータ間のメモリデータの転送(場所)を明示的に指示するためのディレクティブである。使ったプログラミングにおいて最も重要な作業タスクとなる。構文で指示したループに対して、当該ループのベクトル長や並列分割の方法をユーザが明示的に指示するために使用される。これを使って並列実行単位をハードウェアの並列演算コアにマッピングする際の分割等の調整を行うことができる。一般的には、性能をチューニングする際に使用する。ユーザが行うプログラミング・タスクとして、上記の1~3を具体的に述べると以下のようなことになる。どのループをオフロードの対象とするか?これは、ユーザが行う最初のステップとなる。データ転送マネージメントを行う。データ転送の指示を行う。データ転送の最小化を行うために必要な措置。並列処理の分割方法を明示的に指示する。チューンングを行う目的で使用。オフロードの対象となるループ構造の形態アクセラレータ上に処理をオフロードする対象部分に関する概要は、1章において説明した。For」ループを対象とするが、そのループ構造はネスティングの状態により以下の図に表すような形態となる。並列化の対象とすることが出来る。構文を挿入することにより、コンパイラはアクセラレータ上の並列化コードを作成する。構文を挿入する部分を具体的に示してみよう。反復法のプログラムを一部切り出したものである。外側のループ内に、個々に線形計算を行う並列化可能なループが順番に記述されている。構文を挿入する形となる。よる並列化はできない。以下の図に示すような形態である。ルーチンのソース内容をインライン展開して並列化するしかない。仕様では、この制約がなくなる。よる並列化が出来るようになる。以降でリリースされる予定である。構文を挿入することにより、コンパイラはアクセラレータ用のコードを作成する。プログラムの一部を示した。側で処理するよりも遅くなるのが一般的であるが、ここでは単に説明の目的のために使用することにする。ディレクティブで囲むだけである。コンパイラはこのヒントをもとに、当該ループのアクセラレータ用の並列コードのみならず、ホスト~アクセラレータ間のデータ転送のためのコードも生成する。構文を指示するだけで、アクセラレータ用のコードを生成することが出来る。構文は、本来「個々のループ本体」に対して指定するために使うものではない。構文」の二つが用意されている。ここでは簡単に説明しておこう。構文の領域にあるネストループは、アクセラレータ上の(複数の)カーネルのシーケンスに分解される。基本的に各ループネストは、個別のカーネルとなる。構文に到達すると「カーネル」のシーケンスを順番に実行する形となる。構文から使い始めることをお勧めする。階層の並列化を試みる。ネストループの場合は、並列化コードの生成を行わない場合がある。変数が存在すると、そのままだとコンパイラは並列化を行わない。構文を利用することができる。コンパイラはループ内で「カーネル」を生成する場所を特定し、その並列マッピングを通してループ・スケジューリングを実施する。構文等で、ループ・スケジューリング等を明示的に変更することもできる。含む全てのループである。コンパイラは当該ループの全体を「シングル・カーネル」コードとして生成する。対象としたループの中にネストされた複数のループ存在しても、個々のループのカーネルは作成せず、当該ループ全体を一つのカーネルコードとして作成する。構文との大きな違いの一つに、まずはこの点が挙げられる。構文とほぼ同じような挙動を想定したものである。