OpenVMS AXP
オペレーティング・システム
OpenVMS AXP オペレーティング・システムへの移行:システム移行の手引き
4.2.3.1.1 データ・アラインメント
データ・アドレスがデータ・サイズ(バイト数)の整数倍である場合には,データは 自然なアラインメントになります。たとえば,ロングワードは4の倍数であるアドレスに自然なアラインメントになり,クォドワードは8の倍数であるアドレスに自然なアラインメントになります。構造体の場合も,すべてのメンバが自然なアラインメントになっているときは,その構造体も自然なアラインメントになります。
メモリ内で自然なアラインメントでないデータをアクセスすると,VAXシステムでもAXPシステムでも性能が大幅に低下します。VAXシステムでは,大部分の言語は省略時の設定により,データを次の使用可能なバイト境界にアラインするため,VAXアーキテクチャでは,アラインされていないデータを参照したときに,性能の低下を最低限に抑えるためのハードウェア・サポートが準備されています。
しかし,AXPシステムでは,各データを自然なアラインメントにすることが省略時の設定であるため,Alpha AXPは他の典型的なRISCアーキテクチャと同様に,アラインされていないデータを使用することによって発生する性能の低下を最低限に抑えるためのハードウェア・サポートを準備していません。この結果,AXPシステムで自然なアラインメントになっているデータを参照する操作は,アラインされていないデータを参照する操作より10〜100倍も速くなります。
AXPコンパイラは,アラインメントに関する大部分の問題を自動的に修正し,修正できない問題には警告を発します。
問題の検出
アラインされていないデータを検出するには,次の方法が有効です。
- 大部分のAXPコンパイラが提供するスイッチを使用する方法。このスイッチを使用すれば,コンパイラはアラインされていないデータのコンパイル時参照を報告できます。たとえば,DEC CおよびDEC Fortranプログラムの場合には,/WARNING=ALIGNMENT修飾子を使用してコンパイルします。
- 実行時にアラインされていないデータを検出するために,OpenVMS デバッガまたは DEC PCA(Performance and Coverage Analyzer)を使用する方法。
問題への対処方法
アラインされていないデータに対処するには,次に示す方法を用います。
- データをクォドワード境界にアラインすることにより,性能を最大限に向上する方法。これは,AXPシステムが一般にクォドワード粒度(granularity) のみをサポートするからです(第 4.2.3.2.2 項 を参照)。
- 自然なアラインメントでコンパイルするか,または言語がこの機能を備えていない場合には,自然なアラインメントになるようにデータを移動する方法。データが確実にアラインされるように間隔をあけると,メモリ・サイズが拡大するという問題があります。メモリを節約すると同時に,確実にデータを自然にアラインする(naturally aligned)ための方法として,サイズの大きい変数を最初に宣言する方法があります。
-
データ構造内で強制的に自然なアラインメントが実現されるように,高級言語命令を使用する方法。たとえば DEC Cでは,自然なアラインメントが省略時のオプションです。VAX Cの省略時のアラインメントと一致しなければならないデータ構造(たとえばディスク上のデータ構造など)を定義するには,#PRAGMA NO_MEMBER_ALIGNMENT文を使用します。DEC Fortranの場合には,省略時の設定により,ローカル変数は自然なアラインメントになります。レコード構造とコモン・ブロックのアラインメントを制御するには,/ALIGN修飾子を使用します。
- VAXと互換性のある,アラインされていない#PRAGMA NO_MEMBER_ALIGNMENT のようなコンパイラ・スイッチを使用する方法。これらのスイッチを使用すると,機能的には正しいものの,実行速度が遅くなる可能性のあるAXPプログラムが作成されます。
注意
自然なアラインメントに変換されたソフトウェアは,同じVMSクラスタ環境内の VAXシステム,またはネットワークによって接続された VAXシステムでトランスレートされた他のソフトウェアと互換性がなくなる可能性があります。次の例を参照してください。
- 既存のファイル・フォーマットは,アラインされていないデータを含むレコードを指定する可能性があります。
- トランスレートされたイメージは,アラインされていないデータをネイティブ・イメージに渡したり,ネイティブ・イメージからそのようなデータを渡されることを要求する可能性があります。
このような場合には,アプリケーションのすべての部分が同じデータ型,つまり,アラインされたデータ型またはアラインされていないデータ型を要求するように変更しなければなりません。
|
データのアラインメントについての詳しい説明は,『 OpenVMS AXP オペレーティング・システムへの移行:再コンパイルと再リンク』を参照してください。
4.2.3.1.2 データ型
AXPプロセッサは性能の向上のために,パック10進数(packed decimal)データ型,H浮動小数点データ型,および完全な精度のD浮動小数点データ型をソフトウェアによって実現します。
- パック10進数
18桁のパック10進数データは64ビットの2進数に内部的に変換されます。この結果,COBOLできわめて高い性能を実現できます。
- H浮動小数点
AXPコンパイラはH浮動小数点データをサポートしません。しかし,Translated Image Environment(TIE)はトランスレートされたイメージで H浮動小数点データをエミュレートによってサポートします。
- D浮動小数点
AXPプラットフォームでは,D浮動小数点データは次の方法で実現されます。
- G浮動小数点ハードウェア(D53)を使用する方法。AXPハードウェアは D浮動小数点データ(D53)を処理のためにG浮動小数点に変換します。この結果,D浮動小数点データを格納した既存のバイナリ・ファイルとの間で,速度およびデータ型の互換性を維持できますが,現在のVAXシステムのD浮動小数点算術演算と比較すると,3ビットが失われてしまいます。つまり,VAXシステムのD56では16桁の精度で処理されるのに対し,D浮動小数点データは15桁の精度で処理されます。
- トランスレートされたイメージのためにソフトウェア・エミュレーション(D56)を使用する方法。この方法では,正確なD56フォーマットの結果が得られますが,D53や G浮動小数点より処理速度が遅くなります。
問題への対処方法
データ型に関する問題に対処するには,次の方法を用います。
- 可能な場合には,H浮動小数点のかわりにG浮動小数点またはIEEE T浮動小数点を使用してください。これは次の理由によります。
- どちらのデータ型も 10-308 〜 10308 の範囲のデータをサポートするため
- 約15桁の精度であるため
- 可能な場合には,パック10進数データ型のかわりに整数データ型を使用してください。
Alpha AXPのデータ型についての詳しい説明は,『 OpenVMS AXP オペレーティング・システムへの移行:再コンパイルと再リンク』を参照してください。
4.2.3.2 共有データの保護
VAXアーキテクチャとAlpha AXPアーキテクチャの間にはいくつかの相違点があり,これらの相違点は共有データ(shared data)の整合性に影響を与える可能性があります。
4.2.3.2.1 メモリ内のデータの変更
不可分な操作とは,次のような操作です。
- 中間結果または部分的な結果を他のプロセッサや装置から確認できない
- 操作を中断できない(つまり,起動した後,操作は完全に終了するまで継続されます)
OpenVMS AXPでは,データをメモリから読み込む操作,メモリ内のデータを変更する操作,およびデータをメモリに格納する操作は,複数の命令に分割され,これらの命令の間で割り込みをかけることができます。この結果,アプリケーションで共有メモリ内のデータを不可分な操作によって変更したい場合には,操作の不可分性(atomicity)を保証するための作業が必要になります。
次の条件が満足される場合,アプリケーションは操作が不可分に実行されることに依存している可能性があります。
- プロセス内のASTルーチンがメインライン・コードとデータを共有すること
- プロセスが同じCPU(つまり,ユニプロセッサ・システム)で実行される別のプロセスと,書き込み可能なグローバル・セクションのデータを共有すること
- プロセスが別のCPU(つまり,マルチプロセッサ・システム)で並列に実行される別のプロセスとの間で,書き込み可能なグローバル・セクションのデータを共有すること
問題の検出
不可分性への依存を検出するには,共有変数の使用を再確認し,不可分性を暗黙にまたは明示的に仮定している部分がないかどうかを調べなければなりません。
問題への対処方法
命令の不可分性に関する一般的な問題を解決するには,次の方法を用います。
- 可能な場合には,共有変数を保護するために不可分性を保証する言語構造を使用してください。たとえば,CではVOLATILE宣言を使用します。
-
不可分性を仮定するのでなく,明示的に同期を使用します。
-
OpenVMSのロック・サービス(たとえば$ENQと$DEQ),並列処理ランタイム・ライブラリ(Parallel Processing Run-time Library, PPL$)・ルーチン,またはライブラリ(LIB$)・ルーチンを使用します。
- ASTスレッドとの同期をとるために,メインライン・コードで $SETASTシステム・サービスを使用してASTをブロックし,命令が終了した後でASTを再度有効に設定します。
同期についての詳しい説明は,『 OpenVMS AXP オペレーティング・システムへの移行:再コンパイルと再リンク』を参照してください。
4.2.3.2.2 クォドワードより小さいデータの読み込みまたは書き込み
粒度という用語は,隣接するメモリ位置に格納されているデータを妨害せずに,不可分な操作として,メモリとの間で読み込みまたは書き込みを実行できるデータ・サイズを示します。VAXのようにバイト・レベルの粒度を提供するマシンをバイト粒度マシンと呼びます。AXPシステムはクォドワード粒度のシステムです。1
注意
1 Alpha AXPアーキテクチャはロングワード粒度もサポートしますが,ロングワード粒度を仮定することは望ましくありません。省略時の設定で,コンパイラはソース・コードがクォドワード未満の粒度に依存しないものと仮定しています。
|
OpenVMS AXPはクォドワード粒度のシステムであるため,共有されるバイト,ワード,またはロングワードに書き込むと,共有データと同じクォドワードに格納されている他のデータを破壊する可能性があります。このような状況は次の場合に発生します。
- プログラムでバイト,ワード,またはロングワードを変更する場合
-
任意のサイズのアラインされていないフィールドが,アラインされたクォドワード境界と交差し,個別に書き込まなければならないバイト,ワード,またはロングワードを作成する場合
注意
不可分性に関する説明(第 4.2.3.2.1 項)で説明したデータ共有の種類はすべて,共有データを格納しているクォドワードの残りの部分で,粒度に関する問題を発生させる可能性があります。
さらに,結果をプロセス空間に戻すような,非同期的に終了するライブラリ関数,または非同期システム・サービスをプロセスが起動した場合には,戻されたデータを格納するクォドワードで,粒度に関する問題が発生する可能性があります。たとえば,次の操作では,粒度に関する問題が発生する可能性があります。
- 状態ブロックに書き込む非同期システム・サービス
- プロセス・バッファに書き込む入出力操作
- ダイレクト・メモリ・アクセス(DMA)・コントローラがプロセス・バッファに書き込みを実行する入出力操作
|
問題の検出
バイト粒度,ワード粒度,またはロングワード粒度の使用を検出するには,次の方法を用います。
- 意識的に共有されるデータ(ASTとメイン・スレッドの間またはプロセス間で)を検出します。共有データが,書き込まれる可能性のある他のデータと同じクォドワードを使用するかどうかを確認します。
- 非同期システム・サービス,または非同期的に終了するライブラリ呼び出しから戻されたデータを確認します。そのデータが,他のプロセスによって書き込まれた他のデータと同じクォドワードを使用するかどうかを確認します。
- 非同期的に戻されたデータを格納する装置からデータを受信する入出力バッファを調べます。バッファの先頭と末尾が,他のプロセスによって書き込まれたデータと同じクォドワードを使用するかどうかを確認します。
問題への対処方法
クォドワード未満の粒度の使用に対処するには,次の方法を用います。
- 共有データを固有のクォドワードに格納します。
- 入出力バッファの先頭をクォドワード境界にそろえ,バッファの後に続くデータを次のクォドワードに移動します。
- 問題の原因がシステムと共有されるデータでない場合には,高いレベルの同期メカニズムを使用して,意識的に共有されるデータとバックグラウンド・データの両方を同じクォドワードでインターロックします。
AXPコンパイラは,省略時の設定ではバイト粒度,ワード粒度,またはロングワード粒度をサポートしませんが,現在のコードとの互換性を維持するために,バイト粒度,ワード粒度,アラインされていないロングワード粒度,およびアラインされていないクォドワード粒度を指定できます。詳しくは,各コンパイラの解説書を参照してください。
読み込み/書き込みの粒度についての詳しい説明は,『 OpenVMS AXP オペレーティング・システムへの移行:再コンパイルと再リンク』を参照してください。
4.2.3.2.3 ページ・サイズに関する検討
ページ・サイズは,メモリ管理ルーチンとシステム・サービスが割り当てる仮想メモリのサイズを管理します。また,メモリ内のコードとデータに保護を割り当てる基礎にもなります。
OpenVMS VAXオペレーティング・システムは512バイトの倍数でメモリを割り当てます。しかし,全体的なシステム性能を向上するために,AXPシステムでは,各ハードウェア・プラットフォームに応じて,8KB〜64KBの大きなページ・サイズを採用しています。
ページ・サイズは,ワーキング・セット・クォータなど,システム資源を管理するときの基礎的な要素です。さらに,VAXシステムでのメモリ保護は,512バイトの各メモリ領域ごとに設定できます。AXP システムでは,メモリ保護の最小単位はシステムのページ・サイズに応じて,VAXシステムの場合よりはるかに大きくなります。
注意
ページ・サイズを大きく変更した結果,影響を受けるのは,512バイトのページ・サイズに明示的に依存しているアプリケーションだけです。たとえば,次のアプリケーションが考えられます。
- 次の目的で"512"を使用しているアプリケーション
- メモリの使用状況を計算するため
- 必要なページ・テーブルのサイズを計算するため
- 512バイト単位で保護を変更するアプリケーション
- システム・サービスCreate and Map Section($CRMPSC)を使用して,ファイルをプロセス空間内の特定の位置にマッピングするアプリケーション(たとえば,使用可能なメモリが制限されているときにメモリを再利用するため)
|
問題の検出
VAXページ・サイズを使用している箇所を検出するには,512バイトひとかたまりで仮想メモリを操作するコードを識別するか,またはメモリ保護の最小単位として512バイトを使用しているコードを識別します。コードから10進数の511,512,または513,16進数の 1FF,200,または201などの数値を検索してください。
問題への対処方法
VAXとAXPのページ・サイズの相違によって発生する問題に対処するには,次のような方法を使用できます。
- ハードコードされたページ・サイズの参照をシンボリック値に変更します(実行時に $GETSYIを呼び出すことにより割り当てられます)。
- ページ・サイズとディスク(ファイル)・ブロック・サイズが等しいと仮定しているコードを再評価します。AXPシステムでは,この仮定は正しくありません。
-
メモリ管理関連システム・サービス(たとえば,$CRMPSC,$MGBLSC)を使用して,ファイルを固定のページ・サイズ依存アドレス空間(グローバル・セクション)にマッピングできるものと仮定しないでください。このような場合には,$EXPREGシステム・サービスを使用してください。
ページ・サイズについての詳しい説明は,『 OpenVMS AXP オペレーティング・システムへの移行:再コンパイルと再リンク』を参照してください。