前へ | 次へ | 目次 | 索引 |
データ型の選択が与えるもう1つ影響としてデータ・アラインメントがあります。アラインメントとは,メモリ内の位置についてのデータの属性です。VAXシステムのアプリケーションでは多くの場合,データ構造体定義や静的データ領域でバイト・サイズ,ワード・サイズ,およびそれ以上のサイズのデータ型が混在していますが,この結果,自然な境界にアラインされないデータが発生します (アドレスがサイズ(バイト数)の整数倍である場合には,データは自然にアラインされます)。
VAXシステムでもAlphaシステムでも,アラインされていないデータをアクセスすると,アラインされているデータをアクセスする場合より多くのオーバーヘッドが発生します。しかし,VAXシステムでは,アラインされていないデータを使用したときの性能に対する影響を最低限に抑えるためにマイクロコードを使用しています。Alphaシステムではこのようなハードウェアの支援はありません。したがって,アラインされていないデータを参照すると,フォルトが発生し,システムのPALcodeによって処理しなければならなくなります。フォルトを処理している間,命令パイプラインは停止しなければなりません。したがって,アラインされていないデータを参照したときの性能の低下は,Alphaシステムではきわめて大きくなります。
Alphaシステムのコンパイラが,アラインされていないデータに対する参照をコンパイル時に認識できる場合には,特殊な命令シーケンスを生成することにより,性能の低下を最低限に抑えようとします。この結果,実行時にアラインメント・フォルトが発生するのを防止できます。実行時にアラインされていないデータに対する参照が発生した場合には,アラインメント・フォルトとして処理しなければなりません。
データ型の選択がコード・サイズと性能に与える影響を考慮した後,バイトとワードのアクセスのために必要な余分な命令を排除し,アラインメントを改善するために,バイト・サイズとワード・サイズのすべてのデータ宣言をロングワードに変更することを考慮しなければなりません。しかし,データ宣言の変更を考慮する前に,次の要素を考慮してください。
データ型の選択を確認する場合には,これらの要因を考慮した上で,次のガイドラインに従ってください。
Alphaシステムのコンパイラは,VAXシステムと同様のバイト・アラインメントの使用を要求することを許可する修飾子や言語プログラムをサポートしています。たとえば,DEC C for OpenVMS Alphaシステムのコンパイラは/NOMEMBER_ALIGNMENT修飾子をサポートし,また,それに対応した,データ・アラインメントの制御を許可するプラグマもサポートします。詳しくは,DEC C のコンパイラ解説書を参照してください。
例 7-1 で定義したデータ構造体は,これらのデータ型の選択に関する問題を示しています。mystructという構造体定義は,次に示すようにバイト・サイズ,ワード・サイズ,およびロングワード・サイズのデータで構成されます。
struct{ char small; short medium; long large; } mystruct ; |
VAX Cを使用してコンパイルした場合には,この構造体は 図 7-1 に示すようにメモリにレイアウトされます。
図 7-1 VAX Cの使用による mystructのアラインメント
DEC C for OpenVMS Alphaシステムのコンパイラを使用してコンパイルした場合には,図 7-2 に示すように,自然なアラインメントを実現するために構造体にパッドが挿入されます。最初のフィールド(small)の後に1バイトのパッドを追加することにより,その後の構造体メンバはどちらもアラインされます。
図 7-2 DEC C for OpenVMS Alphaシステムの使用による mystructのアラインメント
データ構造体の中でバイト・サイズとワード・サイズのフィールドは,アクセスのために複数の命令のシーケンスを必要とします。smallフィールドとmediumフィールドが頻繁に参照され,構造体全体が何度も繰り返されることがない場合には,ロングワード・データ型を使用するようにデータ構造体を再定義することを考慮してください。しかし,フィールドが頻繁に参照されない場合や,データ構造体が何度も繰り返される場合には,バイト参照やワード参照によって発生する性能の低下とメモリ・サイズの拡大のどちらが重要かを判断しなければなりません。
この章では,アプリケーション内の条件処理コードに対して,VAXアーキテクチャと Alphaアーキテクチャの違いがどのような影響を与えるかについて説明します。
8.1 概要
ほとんどの場合,アプリケーションの条件処理コードはAlphaシステムでも正しく機能します。特に,FORTRANのENDやERR,IOSTAT指定子など,アプリケーション開発において,高級言語で提供される条件処理機能を使用している場合には,問題はありません。これらの言語機能はアーキテクチャ固有の条件処理機能からアプリケーションを分離します。
しかし,Alpha条件処理機能とそれに対応するVAX条件処理機能の間にはいくつかの違いがあり,場合によってはソース・コードを変更しなければなりません。次の場合には,ソース・コードの変更が必要です。
この後の節では,これらの変更について詳しく説明し,ソース・コードの変更が必要かどうかを判断するのに役立つガイドラインも示します。
8.2 動的条件ハンドラの設定
OpenVMS Alpha の実行時ライブラリ (RTL) には LIB$ESTABLISH ルーチンがありませんが,OpenVMS VAX の RTL にはこのルーチンがあります。OpenVMS Alpha の呼び出し規則により,条件ハンドラの設定はコンパイラによって行われます。
条件ハンドラを動的に設定しなければならないプログラムのために,一部の Alpha 言語では,LIB$ESTABLISH の呼び出しが特別な方法で取り扱われ,実際に RTL ルーチンを呼び出さずに適切なコードを生成します。次の言語は,対応する VAX 言語と互換性のある方法で LIB$ESTABLISH をサポートします。
OpenVMS Alpha システム用の DEC C と DEC C++ は,LIB$ESTABLISH を組み込み関数として取り扱いますが,OpenVMS VAX または OpenVMS Alpha システムで LIB$ESTABLISH を使用することは望ましくありません。C および C++ のプログラマは,LIB$ESTABLISH の代わりに VAXC$ESTABLISH を呼び出すようにしてください (VAXC$ESTABLISH は,OpenVMS Alpha システム用の DEC C と DEC C++ で提供される組み込み関数です)。
Digital Fortran では,LIB$ESTABLISH および LIB$REVERT 内部関数に対する宣言が可能であり,これらを Digital Fortran RTL 固有のエントリ・ポイントに変換します。
DEC Pascal では,ESTABLISH と REVERT という組み込みルーチンが提供され,LIB$ESTABLISH および LIB$REVERT の代わりに使用できます。LIB$ESTABLISH を宣言して使用しようとすると,コンパイル時に警告が出されます。
MACRO--32 コンパイラは,LIB$ESTABLISH の呼び出しがソース・コードに指定されている場合,これを呼び出そうとします。
MACRO--32 プログラムが 0(FP) のルーチン・アドレスを格納することにより,動的ハンドラを設定する場合には,これらのプログラムは,OpenVMS Alpha システムでコンパイルした場合も正しく動作します。しかし,CALL_ENTRY ルーチンの内部からでなければ,JSB (Jump to Subroutine) ルーチンの内部から条件ハンドラ・アドレスを設定することはできません。
ユーザ作成条件処理ルーチンの呼び出しシーケンスは,Alphaシステムでも VAXシステムのときと同じです。条件処理ルーチンは,例外条件を通知するときにシステムが戻すデータをアクセスするために2つの引数を宣言します。システムはシグナル・アレイとメカニズム・アレイという2つの配列を使用して,どの例外条件がシグナルを起動したかを識別する情報を伝達し,例外が発生したときのプロセッサの状態を報告します。
シグナル・アレイとメカニズム・アレイの形式はシステムで定義され,『OpenVMS Programming Concepts Manual』に説明されています。Alphaシステムでは,シグナル・アレイに戻されるデータとその形式は VAXシステムの場合と同じです。図 8-1 を参照してください。
図 8-1 VAXシステムとAlphaシステム上の32ビット・シグナル・アレイ
引数 | 説明 |
---|---|
引数の数 | AlphaシステムでもVAXシステムでも,この引数には正の整数が格納され,配列内でこの後に続くロングワードの数を示す。 |
状態コード | AlphaシステムでもVAXシステムでも,この引数は32ビットのコードであり,ハードウェアまたはソフトウェア例外条件を一意に識別する。条件コードの形式は Alphaシステムでも変更されておらず,『OpenVMS Programming Interfaces: Calling a System Routine』に説明されているとおりである。しかし,AlphaシステムはVAXシステムで戻されるすべての条件コードをサポートするわけではなく,さらにVAXシステムでは戻されない条件コードを定義している。Alphaシステムで戻すことができないVAX条件コードについては 第 8.4 節 を参照。 |
オプション・メッセージ・シーケンス | これらの引数は戻される例外に関する追加情報を提供し,これは各例外に応じて異なる。VAX例外に対するこれらの引数については,『OpenVMS Programming Concepts Manual』を参照。 |
プログラム・カウンタ (PC) | 例外がトラップである場合には,例外が発生したときに次に実行される命令のアドレス。例外がフォルトの場合には,例外の原因となった命令のアドレス。Alphaシステムでは,この引数には PCの下位32ビットが格納される (Alphaシステムでは,PCは64ビットの長さである)。 |
プロセッサ・ステータス・ロングワード (PSL) | フォーマッティングした32ビットの引数であり,例外が発生したときのプロセッサの状態を記述する。Alphaシステムでは,この引数にはAlphaの64ビットのプロセッサ・ステータス(PS)・クォドワードの下位32ビットが格納される。 |
Alphaシステムでは,メカニズム・アレイにはVAXの場合と同様のデータが戻されます。しかし,その形式は異なります。Alphaシステムで戻されるメカニズム・アレイには,浮動小数点スクラッチ・レジスタだけでなく,整数スクラッチ・レジスタの内容も保存されます。さらに,Alphaのレジスタは64ビットの長さであるため,メカニズム・アレイは,VAXシステムのようにロングワード(32ビット)ではなく,クォドワード(64ビット)で構成されます。図 8-2 は VAXシステムとAlphaシステムでのメカニズム・アレイの形式を比較しています。
図 8-2 VAXシステムと Alphaシステムでのメカニズム・アレイ
次の表はメカニズム・アレイ内の各引数を示しています。
引数 | 説明 |
---|---|
引数の数 | VAXシステムでは,この引数には正の整数が格納され,配列内でその後に続くロングワードの数を示す。Alphaシステムでは,この引数はメカニズム・アレイ内のクォドワードの数を示し,引数カウント・クォドワードの数 (Alphaシステムでは常に43)を示すわけではない。 |
フラグ | Alphaシステムでは,この引数には追加情報を伝達するためのさまざまなフラグが格納される。たとえば,ビット0がセットされている場合には,プロセスがすでに浮動小数点演算を実行し,配列内の浮動小数点レジスタが正しいことを示す (VAXシステムのメカニズム・アレイにはこれに対応する引数はない)。 |
フレーム・ポインタ (FP) | VAXシステムでもAlphaシステムでも,この引数には条件ハンドラを設定したスタックの呼び出しフレームのアドレスが格納される。 |
深さ | VAXシステムでもAlphaシステムでも,この引数には,例外を発生させたフレームを基準にして,条件処理ルーチンを設定したプロシージャのフレーム番号を表現する整数が格納される。 |
リザーブ | 予約されている。 |
ハンドラ・データ・アドレス | Alphaシステムでは,この引数には,ハンドラが存在する場合はハンドラ・データ・クォドワードのアドレスが格納される (VAXシステムのメカニズム・アレイにはこれに対応する引数はない)。 |
例外スタック・フレーム・アドレス | Alphaシステムでは,この引数には例外スタック・フレームのアドレスが格納される (VAXシステムのメカニズム・アレイにはこれに対応する引数はない)。 |
シグナル・アレイのアドレス | Alphaシステムでは,この引数にはシグナル・アレイのアドレスが格納される (VAXシステムのメカニズム・アレイにはこれに対応する引数はない)。 |
レジスタ | VAXシステムでもAlphaシステムでも,メカニズム・アレイにはスクラッチ・レジスタの内容が格納される。Alphaシステムでは,この引数にはるかに大きなレジスタ・セットが格納され,対応する浮動小数点レジスタも格納される。 |
32ビット・シグナル・アレイはAlphaシステムとVAXシステムとで同じであるため,条件処理ルーチンのソース・コードを変更する必要はないでしょう。しかし,メカニズム・アレイは変更されているため,ソース・コードを変更しなければならないかもしれません。特に,次のことを確認してください。
SYS$UNWINDシステム・サービスに対してdepth引数のアドレスを指定することにより,例外処理ハンドラを設定したフレームまで巻き戻すアプリケーションや,SYS$UNWINDシステム・サービスの省略時のdepth引数を使用することにより,例外処理ハンドラを設定したフレームの呼び出し側まで巻き戻すアプリケーションは,今後も正しく動作します。depthを負の値として指定した場合には,例外ベクタを示します(VAXシステムの場合と同じ)。
例 8-1 はCで作成した条件処理ルーチンを示しています。
例 8-1 条件処理ルーチン |
---|
#include <ssdef.h> #include <chfdef.h> . . . (1) int cond_handler( sigs, mechs ) struct chf$signal_array *sigs; struct chf$mech_array *mechs; { int status; (2) status = LIB$MATCH_COND(sigs->chf$l_sig_name, /* returned code */ SS$_INTOVF); /* test against */ (3) if(status != 0) { /* ...Condition matched. Perform processing. */ return SS$_CONTINUE; } else { /* ...Condition does not match. Resignal exception. */ return SS$_RESIGNAL; } } |
次のリストの各項目は 例 8-1 に示した番号に対応しています。
前へ | 次へ | 目次 | 索引 |