日本-日本語

製品  >  ソフトウェア  >  OpenVMS  >  マニュアル

OpenVMS マニュアル


≫ 

OpenVMS V8.3
ライブラリ

タイトルページ
目次
まえがき
第 1 章:移行プロセスの概要
第 2 章:移行方法の選択
第 3 章:アプリケーションの移行
第 4 章:再コンパイルと再リンクの概要
第 5 章:ページ・サイズの拡大に対するアプリケーションの対応
第 6 章:共有データの整合性の維持
第 7 章:アプリケーション・データ宣言の移植性の確認
第 8 章:アプリケーション内の条件処理コードの確認
第 9 章:アプリケーションのトランスレート
第 10 章: ネイティブなイメージとトランスレートされたイメージの間の相互操作性の確認
第 11 章:OpenVMS Alpha コンパイラ
付録 A :アプリケーション評価チェックリスト
用語集
索引
PDF
OpenVMS ホーム
OpenVMS Alpha オペレーティング・システム | HPE 日本(日本ヒューレット・パッカード株式会社)

OpenVMS Alpha
オペレーティング・システム
OpenVMS VAX から OpenVMS Alpha へのアプリケーションの移行


目次 索引

データのアラインメントについての詳しい説明は, 第 7 章第 8.4.2 項 を参照してください。

2.5.2 データ型

Alphaアーキテクチャは,VAX固有のデータ型の大部分をサポートしています。ただし,H浮動小数点データ型などの一部のVAXデータ型はサポートされていません( 表 2-1 を参照)。アプリケーションが,下位のネイティブなデータ型のサイズまたはビット表現に依存していないかどうか確認してください。

表 2-1 浮動小数点データ型のサポート
データ型 VAX Alpha
D53浮動小数点(G浮動小数点) (省略時の倍精度形式) サポートされない。 サポートされる。D53浮動小数点の代わりに D56浮動小数点を使用すると,3 ビット分の精度が失われ,結果に多少の誤差が生じる。
D56浮動小数点(省略時の倍精度形式) サポートされる。 サポートされない。DECmigrate を使用してコードをトランスレートすると,このデータ型を完全にサポートできるようになる。また,アプリケーションで 3 ビット分の精度が必要ない場合は,D56浮動小数点の代わりに D53浮動小数点を使用できる。
F浮動小数点 サポートされる。 サポートされる。
G浮動小数点 サポートされる。 サポートされる。
H浮動小数点(128 ビットの浮動小数点) サポートされる。 サポートされない。DECmigrate を使用すると,H浮動小数点を完全にサポートできるようになる。DECmigrate を使用すると,H浮動小数点構造体を含むコード・モジュールをトランスレートすることができ,サポートされるデータ型を使用して,アプリケーションを再コーディングすることもできる。
S浮動小数点(IEEE) サポートされない。 サポートされる。
T浮動小数点(IEEE) サポートされない。 サポートされる。
X浮動小数点(128 ビット浮動小数点(Alpha; IEEE に適した)) サポートされない。 DEC Fortran バージョン 6.2 以降と DEC C バージョン 4.0 以降でサポートされる。 X浮動小数点データ形式は H浮動小数点と同じではないが,どちらも同じ範囲の値をサポートする。Fortran アプリケーションの場合は,FOR$CONVERTnnn 論理名, OPTIONS 文,/CONVERT コンパイラ修飾子,OPEN 文の CONVERT=キーワードのいずれかを使用して,X浮動小数点メモリ形式と H浮動小数点ディスク・データの間で自動的な変換を行うことができる。

Alphaプロセッサは性能の向上のために,パック10進数 ( packed decimal ) データ型, H浮動小数点データ型,および完全な精度のD浮動小数点データ型をソフトウェアによって実現します。

  • 10進数
    18桁のパック10進数データは64ビットの2進数に内部的に変換されます。この結果, COBOLできわめて高い性能を実現できます。

  • H浮動小数点
    AlphaコンパイラはH浮動小数点データをサポートしません。しかし, Translated Image Environment (TIE)はトランスレートされたイメージで H浮動小数点データをエミュレートによってサポートします。

  • D浮動小数点
    Alphaプラットフォームでは,D浮動小数点データは次の方法で実現されます。

    • G浮動小数点ハードウェア(D53)を使用する方法。Alphaハードウェアは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のデータ型についての詳しい説明は, 第 7 章 を参照してください。

2.5.3 データへの共有アクセス

不可分な操作とは,次のような操作です。

  • 中間結果または部分的な結果を他のプロセッサや装置から確認できない

  • 操作を中断できない(つまり,起動した後,操作は完全に終了するまで継続されます)

OpenVMS Alphaでは,データをメモリから読み込む操作,メモリ内のデータを変更する操作,およびデータをメモリに格納する操作は,複数の命令に分割され,これらの命令の間で割り込みをかけることができます。この結果,アプリケーションで共有メモリ内のデータを不可分な操作によって変更したい場合には,操作の不可分性を保証するための作業が必要になります。

次の条件が満足される場合,アプリケーションは操作が不可分に実行されることに依存している可能性があります。

  • プロセス内のASTルーチンがメインライン・コードとデータを共有すること

  • プロセスが同じCPU(つまり,ユニプロセッサ・システム)で実行される別のプロセスと, 書き込み可能なグローバル・セクションのデータを共有すること

  • プロセスが別のCPU(つまり,マルチプロセッサ・システム)で並列に実行される別のプロセスとの間で,書き込み可能なグローバル・セクションのデータを共有すること

問題の検出

不可分性への依存を検出するには,共有変数 (複数の実行スレッドによってアクセスされる書き込み可能な項目) の使用を再確認し,不可分性を暗黙にまたは明示的に仮定している部分がないかどうかを調べなければなりません。

問題への対処方法

命令の不可分性に関する一般的な問題を解決するには,次の方法を用います。

  • 可能な場合には,共有変数を保護するために不可分性を保証する言語構造を使用してください。たとえば,CではVOLATILE宣言を使用します。

  • 不可分性を仮定するのでなく,明示的に同期を使用します。

  • OpenVMS のロック・サービス(たとえば $ENQ と $DEQ)またはライブラリ (LIB$) ルーチンを使用します。

  • ASTスレッドとの同期をとるために,メインライン・コードで$SETASTシステム・サービスを使用してASTをブロックし,命令が終了した後でASTを再度有効に設定します。

同期についての詳しい説明は, 第 6 章 を参照してください。

2.5.4 クォドワードより小さいデータの読み込みまたは書き込み

粒度という用語は,隣接するメモリ位置に格納されているデータを妨害せずに,不可分な操作として,メモリとの間で読み込みまたは書き込みを実行できるデータ・サイズを示します。VAXのようにバイト・レベルの粒度を提供するマシンをバイト粒度マシンと呼びます。 Alphaシステムはクォドワード粒度のシステムです。 1

OpenVMS Alphaはクォドワード粒度のシステムであるため,共有されるバイト,ワード,またはロングワードに書き込むと,共有データと同じクォドワードに格納されている他のデータを破壊する可能性があります。このような状況は次の場合に発生します。

  • プログラムでバイト,ワード,またはロングワードを変更する場合

  • 任意のサイズのアラインされていないフィールドが,アラインされたクォドワード境界と交差し,個別に書き込まなければならないバイト,ワード,またはロングワードを作成する場合

注意

不可分性に関する説明( 第 2.5.3 項 )で説明したデータ共有の種類はすべて,共有データを格納しているクォドワードの残りの部分で,粒度に関する問題を発生させる可能性があります。

さらに,結果をプロセス空間に戻すような,非同期的に終了するライブラリ関数,または非同期システム・サービスをプロセスが起動した場合には,戻されたデータを格納するクォドワードで,粒度に関する問題が発生する可能性があります。たとえば,次の操作では,粒度に関する問題が発生する可能性があります。

  • 状態ブロックに書き込む非同期システム・サービス

  • プロセス・バッファに書き込む入出力操作

  • ダイレクト・メモリ・アクセス(DMA)・コントローラがプロセス・バッファに書き込みを実行する入出力操作

問題の検出

バイト粒度,ワード粒度,またはロングワード粒度の使用を検出するには,次の方法を用います。

  • 意識的に共有されるデータ(ASTとメイン・スレッドの間またはプロセス間で)を検出します。共有データが,書き込まれる可能性のある他のデータと同じクォドワードを使用するかどうかを確認します。

  • 非同期システム・サービス,または非同期的に終了するライブラリ呼び出しから戻されたデータを確認します。そのデータが,他のプロセスによって書き込まれた他のデータと同じクォドワードを使用するかどうかを確認します。

  • 非同期的に戻されたデータを格納する装置からデータを受信する入出力バッファを調べます。バッファの先頭と末尾が,他のプロセスによって書き込まれたデータと同じクォドワードを使用するかどうかを確認します。

問題の対処方法

クォドワード未満の粒度の使用に対処するには,次の方法を用います。

  • 共有データを固有のクォドワードに格納します。

  • 入出力バッファの先頭をクォドワード境界にそろえ,バッファの後に続くデータを次のクォドワードに移動します。

  • 問題の原因がシステムと共有されるデータでない場合には,高いレベルの同期メカニズムを使用して,意識的に共有されるデータとバックグラウンド・データの両方を同じクォドワードでインターロックします。

Digital コンパイラは,省略時の設定では粒度がクォドワードであるものと解釈しますが,現在のコードと互換性を維持するために,/GRANULARITY 修飾子を使用することにより,バイト,ワード,アラインされないロングワード,およびアラインされないクォドワードの粒度を指定することができます。詳細については,各コンパイラのマニュアルを参照してください。

読み込み/書き込み粒度の詳細については, 第 6 章 を参照してください。

2.5.5 ページ・サイズに関する検討

ページ・サイズは,メモリ管理ルーチンとシステム・サービスが割り当てる仮想メモリのサイズを管理します。たとえば,混在環境のOpenVMS Clusterシステムでは,アプリケーションが特定のデータ・バッファのサイズをVAXページ・サイズに基づいて決定できます。ページ・サイズは,メモリ内のコードとデータに保護を割り当てる基礎にもなります。

OpenVMS VAXオペレーティング・システムは512バイトの倍数でメモリを割り当てます。しかし,全体的なシステム性能を向上するために,Alphaシステムでは,各ハードウェア・プラットフォームに応じて,8KB〜64KBの大きなページ・サイズを採用しています。

ページ・サイズは,ワーキング・セット・クォータなど,システム資源を管理するときの基礎的な要素です。さらに,VAXシステムでのメモリ保護は,512バイトの各メモリ領域ごとに設定できます。Alpha システムでは,メモリ保護の最小単位はシステムのページ・サイズに応じて,VAXシステムの場合よりはるかに大きくなります。

注意

ページ・サイズを大きく変更した結果,影響を受けるのは,512バイトのページ・サイズに明示的に依存しているアプリケーションだけです。たとえば,次のアプリケーションが考えられます。

  • 次の目的で"512"を使用しているアプリケーション

    • メモリの使用状況を計算するため

    • 必要なページ・テーブルのサイズを計算するため

  • 512バイト単位で保護を変更するアプリケーション

  • システム・サービスCreate and Map Section ($CRMPSC)を使用して,ファイルをプロセス空間内の特定の位置にマッピングするアプリケーション(たとえば,使用可能なメモリが制限されているときにメモリを再利用するため)

問題の検出

VAXページ・サイズを使用している箇所を検出するには,512バイトひとかたまりで仮想メモリを操作するコードを識別するか,またはメモリ保護の最小単位として512バイトを使用しているコードを識別します。コードから10進数の511,512,または513,16進数の 1FF,200,または201などの数値を検索してください。

問題への対処方法

VAXとAlphaのページ・サイズの相違によって発生する問題に対処するには,次のような方法を使用できます。

  • ハードコードされたページ・サイズの参照をシンボリック値に変更します(実行時に $GETSYIを呼び出すことにより割り当てられます)。

  • ページ・サイズとディスク(ファイル)・ブロック・サイズが等しいと仮定しているコードを再評価します。Alphaシステムでは,この仮定は正しくありません。

  • メモリ管理関連システム・サービス(たとえば,$CRMPSC,$MGBLSC)を使用して,ファイルを固定のページ・サイズ依存アドレス空間(グローバル・セクション)にマッピングできるものと仮定しないでください。このような場合には, $EXPREGシステム・サービスを使用してください。

ページ・サイズについての詳しい説明は, 第 5 章 を参照してください。

2.5.6 マルチプロセッサ・システムでの読み込み/書き込み操作の順序

VAXアーキテクチャでは,マルチプロセシング・システムのプロセッサが複数のデータをメモリに書き込む場合,これらは指定した順にメモリに書き込まれます。このように書き込みの順序が定義されているため,書き込み操作はプログラムと入出力装置で指定した順に他のCPUからも確認することができます。

このように,指定した順に書き込み結果を他のCPUからも確認できることを保証することは,システムが実現できる性能の最適化を制限してしまいます。また,キャッシュがより複雑になり,キャッシュ性能の最適化も制限されます。

全体のシステム性能を向上するために,Alphaシステムをはじめ,RISCシステムでは,メモリへの読み込みと書き込みの順序を変更できます。したがって,メモリへの書き込み結果をシステム内の他のCPUから確認すると,その順序は実際に書き込まれた順序と異なる可能性があります。

注意

この節の説明はマルチプロセッサ・システムを対象にしています。ユニプロセッサ・システムでは,メモリ・アクセスはすべて,プログラムで要求した順に終了します。

問題の検出

マルチプロセッサ・システムで実行される可能性のあるアプリケーションで,読み込み/書き込みの順序に依存している部分を検出するには,データが書き込まれる順序に依存するアルゴリズムを識別しなければなりません。たとえば,同期をとるためにフラグ受け渡しプロトコルを使用している箇所を調べなければなりません。

問題への対処方法

読み込み/書き込み操作の順序に関する問題に対処するには,次の方法を用います。

  • フラグ受け渡しプロトコルのかわりに,同期をとるためにシステムで提供されるルーチンを使用します。たとえば,OpenVMSロック・システム・サービス($ENQ,$DEQ) を使用します。

  • Alphaアーキテクチャでは,メモリ・バリア命令が準備されており,この命令を使用すると,ハードウェアはバリアの前のすべてのメモリ読み込みと書き込みを終了した後で,バリアの後の読み込みと書き込みを実行します。OpenVMS Alphaの一部の言語では,この命令を挿入する方法が準備されていますが,この命令を使用すると性能が低下します。

同期についての詳しい説明は, 第 6 章 を参照してください。

注意

1 Alphaアーキテクチャはロングワード粒度もサポートしますが,ロングワード粒度を仮定することは望ましくありません。省略時の設定で,コンパイラはソース・コードがクォドワード未満の粒度に依存しないものと仮定していますが,多くの Digital 言語は/GRANULARITY 修飾子を使用して小さな粒度を指定することができます。


目次 索引

印刷用画面へ
プライバシー 本サイト利用時の合意事項