日本-日本語
日本HPホーム 製品 & サービス OpenVMS製品情報
≫  お問い合わせ


OpenVMS マニュアル


 

OpenVMS ドキュメント
ライブラリ

タイトルページ
目次
まえがき
第1章:はじめに
第2章:基本的な相違点
第3章:アプリケーションの調査
第4章:ソース・モジュールの移行
第5章:OpenVMS I64 開発環境
第6章:ポーティングの準備
第7章:その他の検討事項
付録A :アプリケーション評価チェックリスト
付録B :サポート対象外のレイヤード・プロダクト
付録C :アプリケーション固有のスタック切り換えコードの I64 へのポーティング
用語集
索引
PDF
OpenVMS ホーム

HP OpenVMS
OpenVMS Alpha から OpenVMS I64 へのアプリケーション・ポーティング・ガイド


目次 索引



COBOL Version 2.8 は,Alpha と I64 の両方でサポートされます。 OpenVMS I64 で COBOL を使用する場合の制限事項と既知の問題点については,COBOL のリリース・ノートを参照してください。

6.4.1 浮動小数点演算

OpenVMS Alpha の COBOL コンパイラのデフォルトは /FLOAT=D_FLOAT です。 I64 の場合,/FLOAT=IEEE_FLOAT がデフォルトです。

COBOL コンパイラは /IEEE_MODE 修飾子をサポートしません。 COBOL RTL は,例外処理とラウンディング処理の点で Alpha の COBOL ランタイム環境と同じ環境を I64 で設定します。

I64 上で浮動小数点を COBOL がどのように処理するかについては, COBOL のリリース・ノートとホワイト・ペーパー『Intel® Itanium® における OpenVMS 浮動小数点演算について』を参照してください。

このホワイト・ぺーパおよび関連の技術資料の入手方法については,本書のまえがきを参照してください。

6.4.2 /ARCH および /OPTIMIZE=TUNE 修飾子

「コンパイル・アンド・ゴー」の互換性を維持するために, /ARCH および /OPTIMIZE=TUNE 修飾子に対する Alpha 固有のキーワードがコンパイラ起動コマンドで受け付けられます。これらの値が無視されることを示す情報メッセージが出力されます。

/ARCH および /OPTIMIZE=TUNE 修飾子に対する I64 固有のキーワードは,OpenVMS I64 コンパイラで定義されていますが,これは開発用に提供されるものです。これらの修飾子の動作は予測できないため,使用すべきではありません。

6.5 Fortran

OpenVMS I64 では, Fortran 90 V8.0 がサポートされます。 Fortran 77 は OpenVMS I64 ではサポートされません。詳細については, 第 6.5.2 項 を参照してください。

OpenVMS I64 システム向けの HP Fortran では, OpenVMS Alpha システム向けの HP Fortran と同じコマンド・ライン・オプションおよび言語機能が提供されますが,いくつかの例外があります。ここでは,これらの例外について説明します。

6.5.1 浮動小数点演算

Fortran のリリース・ノートおよびホワイトペーパー『Intel® Itanium® アーキテクチャにおける OpenVMS 浮動小数点演算について』では,HP Fortran for I64 で浮動小数点の問題がどのように処理されるかについて説明しています。

このホワイトペーパーと,OpenVMS から Itanium アーキテクチャへの移行に関するその他のリソースが入手できる Web サイトについては,「まえがき」の「関連資料」の項を参照してください。

ここでは,その要点をまとめます。

  • デフォルトの浮動小数点データ・タイプは IEEE です (つまり,デフォルトは /FLOAT=IEEE_FLOAT です)。
    OpenVMS Alpha のコンパイラでは,デフォルトの浮動小数点データ・タイプは /FLOAT=G_FLOAT です。 OpenVMS I64 システムでは,IEEE 以外の浮動小数点表現はハードウェアでサポートされません。 VAX 浮動小数点形式は,算術演算を実行する前に IEEE 形式に変換し,結果を適切な VAX 形式に戻す実行時コードを生成することで,コンパイラでサポートされています。このため,実行時のオーバヘッドが増加し, Alpha (および VAX) のハードウェアで同じ演算を実行する場合と比較すると精度が少し低下します。
    ソフトウェアでの VAX 形式のサポートは,ディスクに格納されているバイナリ形式の浮動小数点データを取り扱う必要のある特定のアプリケーションで互換性を維持するための重要な機能ですが,これの利用はお勧めできません。この変更は,デフォルトが VAX の /FLOAT=D_FLOAT から Alpha の /FLOAT=G_FLOAT に変更されたのに類似しています。
    支障がなければ,最大限のパフォーマンスと精度のために /FLOAT=IEEE_FLOAT (デフォルト) を使用してください。
    /FLOAT のデフォルトが変更されたことにより,/CONVERT=NATIVE (デフォルト) の使用に影響があるので注意してください。このスイッチは,一般的な浮動小数点データ・タイプに一致するという仮定のもと,フォーマットされていないデータを未変換のまま入力に残します。
    Alpha 上で /FLOAT=G_FLOAT/CONVERT=NATIVE を指定して (明示的に G_FLOAT および NATIVE を指定するか,どちらもデフォルトのままとして) 作成された Fortran アプリケーションが書き込んだファイルは, G_FLOAT になります。このファイルは,/FLOAT=G_FLOAT/CONVERT=NATIVE または /FLOAT=IEEE/CONVERT=VAXG で作成した I64 アプリケーションで読み込むことができます。しかし,/CONVERT=NATIVE で作成したアプリケーションでは, /FLOAT のタイプがデフォルトの IEEE 形式となるため,読み込むことができません。

  • /IEEE_MODE 修飾子のデフォルトは /IEEE_MODE=DENORM_RESULTS に設定されます。
    このデフォルトは Alpha の場合と異なります。 Alpha のデフォルトは /IEEE_MODE=FAST です。 "FAST" となっているにもかかわらず, /IEEE_MODE=FAST は I64 (あるいは EV6 以降の Alpha プロセッサ) の実行時パフォーマンスにそれほど大きな効果がありません。

  • ユーザは /FLOAT の値と /IEEE_MODE の値を 1 つずつ選択して,アプリケーション全体でその値を使用する必要があります。これは,ハードウェアにアーキテクチャ上の違いがあるために,複合モード・アプリケーションが OpenVMS I64 システムでは (一般に) 動作しないからです。これは OpenVMS Alpha から変更された点です (OpenVMS Alpha では複合モードアプリケーションが動作します)。特に,ルーチンごと,ファイルごと,ライブラリごとのモードの設定は機能しません。
    Alpha と同様に,/IEEE_MODE は,ユーザが /FLOAT=IEEE を選択するか,それをデフォルトとして適用した場合にだけ設定できます。 G_FLOAT および D_FLOAT で使用される IEEE_MODE モードは, VAX 形式のサポートを実現する IEEE 形式の計算をサポートするのに適切なように,コンパイラが選択したものです。

  • プログラムで浮動小数点例外モードを変更した場合は,例外ハンドラによる終了も含めて,ルーチンの終了時に例外モードを元に戻さなければなりません。元に戻さないと,コンパイラは,呼び出されたルーチンが現在のモードを変更していないものと考えるため,予測しない結果が発生することがあります。この要件については,ユーザ作成ライブラリの場合も対応しなければなりません。

  • 例外ハンドラの開始時には,ハンドラがコンパイルされたときのモードではなく,例外が発生した時点で有効だった浮動小数点モードになります。

ホワイトペーパー『Intel® Itanium® アーキテクチャにおける OpenVMS 浮動小数点演算について』にあるように,I64 でアプリケーションの実行中に発生する浮動小数点例外の番号,種類,場所は, Alpha と同じではありません。特に,VAX 形式の浮動小数点で違いが顕著で,一般に,計算後に元の VAX 形式に変換する際にだけ例外が発生します。

VAX 形式の浮動小数点のユーザに関係しそうな影響には,以下の 3 つがあります。

  • Alpha で例外が発生していた計算途中の値 (たとえば,"X*Y + X/Y" での "X/Y") で, I64 では例外が発生しないことがあります。

  • VAX 形式の浮動小数点に変換されない値 (たとえば "IF (X/Y > 0.0)" での "X/Y") は, I64 では例外を発生しません。

  • OpenVMS Alpha および VAX の Fortran アプリケーションは, /CHECK=UNDERFLOW 修飾子を指定してコンパイルすることによりアンダーフロー・トラップを有効にしていない限り, VAX 形式の浮動小数点演算に対してはアンダーフローを報告しません。これは,OpenVMS I64 システムの場合も同じです。ただし,以下の点に注意してください。
    すべての I64 浮動小数点演算は IEEE 形式の演算で実装されているため, /CHECK=UNDERFLOW でアンダーフロー・トラップを有効にした場合, VAX 形式ではなく IEEE 形式の式でアンダーフローを評価すると例外処理が発生する場合があります。
    つまり,計算値が VAX 形式では有効範囲に収まるが IEEE 形式ではデノーマル値の範囲となる場合があるため, Alpha あるいは VAX プログラムと比較すると, /CHECK=UNDERFLOW によりアンダーフロー例外が増える可能性があります。



6.5.2 サポートされるのは F90 コンパイラのみ

F77 コンパイラは,以前は /OLD_F77 修飾子で起動されていましたが,現在は使用できなくなりました。 Alpha F77 コンパイラで提供されていて, I64 および Alpha の F90 ではまだ提供されていない機能のうち,以下の機能は現在開発中です。

  • CDD および FDML のサポートは F90 で実装されていますが,まだ十分なテストは行なわれていません。

  • F77 コンパイラで以前コンパイルされていて, F90 コンパイラでコンパイルされないコードは,問題報告メカニズムを通じて報告してください。すべての相違点を排除することは不可能ですが,開発チームは F90 コンパイラを強化することで,これらの違いをできるだけ少なくすることに努めています。

  注意
/OLD_F77 修飾子はサポートされませんが,これを /F77 修飾子と混同しないでください。 /F77 修飾子は,FORTRAN-66 との間で互換性のないステートメントについて,コンパイラが FORTRAN-77 の解釈ルールを使用することを示し,この修飾子は今後もサポートされます。



「コンパイル・アンド・ゴー」の互換性を維持するために, /ARCH および /OPTIMIZE=TUNE 修飾子に対する Alpha 固有のキーワードがコンパイラ起動コマンドで受け付けられます。これらの値が無視されることを示す情報メッセージが出力されます。

/ARCH および /OPTIMIZE=TUNE 修飾子に指定する I64 固有のキーワードは,OpenVMS I64 で定義されていますが,これは開発のためにだけ提供されるものです。これらの修飾子の動作は予測できないため,使用すべきではありません。

6.6 HP C/ANSI C

I64 システムでは,HP C Version 7.1 がサポートされます。ポーティングに関する注意事項については,HP C のリリース・ノートを参照してください。

6.6.1 I64 浮動小数点のデフォルト

Alpha のネイティブ・コンパイラのデフォルトは /FLOAT=G_FLOAT です。 I64 のデフォルトは /FLOAT=IEEE_FLOAT/IEEE=DENORM です。

OpenVMS I64 では,IEEE 以外の浮動小数点表現はハードウェアでサポートされません。 VAX 浮動小数点形式は,算術演算を実行する前に IEEE 形式に変換し,結果を適切な VAX 形式に戻す実行時コードを生成することで,コンパイラでサポートされています。このため,実行時のオーバヘッドが増加し, Alpha (および VAX) のハードウェアで同じ演算を実行する場合と比較すると,精度が少し低下します。ソフトウェアでの VAX 形式のサポートは,ディスクに格納されているバイナリ形式の浮動小数点データを取り扱う必要のある特定のアプリケーションで,互換性を維持するための重要な機能ですが,この機能の利用はお勧めできません。この変更は,デフォルトが VAX の /FLOAT=D_FLOAT から Alpha の /FLOAT=G_FLOAT に変更されたのに類似しています。

また,/IEEE_MODE のデフォルトは,OpenVMS Alpha では FAST でしたが,OpenVMS I64 では DENORM_RESULTS に変更されています。つまり,VAX 浮動小数点形式や /IEEE_MODE=FAST を使用すると致命的な実行時エラーが発生していた浮動小数点演算で,デフォルトにより,Inf または Nan として出力される値が生成されるようになりました (業界標準の動作)。また,このモードでの非ゼロ最小値は以前よりはるかに小さくなります。これは,値が非常に小さくなって正規化した状態では表現できなくなったときに,結果がデノーマル範囲にあることが許されるからで,ただちに 0 になることはありません。

6.6.2 /IEEE_MODE 修飾子のセマンティック

OpenVMS Alpha では,/IEEE_MODE 修飾子は一般に,コンパイルで生成されるコードに対して最大の影響を与えます。異なる /IEEE_MODE 修飾子を使用してコンパイルされた関数の間で呼び出しを行うと,各関数の動作は,それがコンパイルされたときのモードに従います。

OpenVMS I64 では,/IEEE_MODE 修飾子は基本的にプログラム起動時のハードウェア・レジスタの設定にだけ影響します。一般に,各関数に対する /IEEE_MODE の動作は,メイン・プログラムのコンパイル時に指定された /IEEE_MODE オプションによって制御されます。コンパイラは,各コンパイルでできるオブジェクト・モジュールを,コンパイル時の修飾子で指定された浮動小数点制御でマークします。 I64 リンカが実行イメージを作成する際,イメージの main エントリ・ポイントへの転送アドレスを提供したオブジェクト・モジュールから浮動小数点制御をそのイメージ自体へコピーします。この処理は,そのイメージに対するホール・プログラム浮動小数点モード (whole program floating-point mode) と呼ばれます。この後,実行のためにイメージを起動すると,このホール・プログラム浮動小数点モードに従ってハードウェアの浮動小数点制御が初期化されます。実行時に特定の制御設定が必要となるようなコードのセクションから制御が移る場合に,ホール・プログラム浮動小数点モードの設定がリストアされるよう,実行時に浮動小数点制御を修正するようなコードを作成してください。

/IEEE_MODE 修飾子がメイン・プログラムを含まないコンパイルに適用される場合も,この修飾子には効果があります。浮動小数点定数式の評価に影響を与え,そのコンパイルからの呼び出しに対して,算術演算ライブラリで使用される EXCEPTION_MODE を設定します。

/IEEE_MODE 修飾子は,そのコンパイルでインライン・コードとして生成された浮動小数点演算の例外動作には影響を与えません。したがって,浮動小数点例外動作がアプリケーションにとって重要な場合は,メイン・プログラムを含むコンパイルも含めて,すべてのコンパイルで /FLOAT および /IEEE_MODE を同じ設定にする必要があります。

Alpha でも,/IEEE_MODE=UNDERFLOW_TO_ZERO に設定するには,実行時状態レジスタを設定する必要があります。したがって,この設定を他のコンパイルでも有効にするには,メイン・プログラムを含むコンパイルでこの設定を指定する必要があります。

最後に,/ROUNDING_MODE 修飾子は /IEEE_MODE と同じように影響を与え,ホール・プログラム浮動小数点モードに含まれ,また,VAX 浮動小数点演算は実際には IEEE インストラクションで実行されるため, VAX 形式の浮動小数点を使用するコンパイルは /IEEE_MODE=DENORM/ROUND=NEAREST でコンパイルした場合と同じホール・プログラム浮動小数点モード設定で動作することに注意してください。

6.6.3 定義済みマクロ

I64 コンパイラでは,Alpha のネイティブ・コンパイラと同じ意味を持つ多くのマクロがあらかじめ定義されていますが, Alpha アーキテクチャを指定するマクロは定義されていません。その代わりに, __ia64マクロと __ia64__マクロが,I64 向けの Intel および gcc コンパイラと同じ手法で定義されています。 G_FLOAT から IEEE への浮動小数点表現の変更は,定義済みマクロでもデフォルトで反映されています。

一部のユーザは, __ALPHAマクロが定義されていない場合,ターゲットは VAX システムでなければならないという前提で書かれた条件付きソース・コードを簡単に取り扱う方法として, /DEFINE を使用するか,またはヘッダ・ファイルに記述して,明示的に __ALPHAマクロを定義しようとしました。しかし,このような定義を行うと,CTRL ヘッダおよびその他の OpenVMS ヘッダは I64 に対して誤ったパスを選択します。このコンパイラを使用する場合,Alpha アーキテクチャの定義済みマクロを定義すべきではありません。

6.7 HP C++

OpenVMS I64 では,HP C++ Version 7.1 がサポートされます。ポーティングに関する注意事項については, HP C++ のドキュメントも参照してください。

6.7.1 浮動小数点と定義済みマクロ

C コンパイラの浮動小数点のデフォルト,/IEEE_MODE セマンティック,定義済みマクロに関する注意事項が, C++ コンパイラにもそのまま適用されます。

6.7.2 long double

long double タイプは常に 128 ビット IEEE 4 倍精度で表現されます。 /L_DOUBLE_SIZE=64 修飾子は無視され,警告メッセージが表示されます。 Alpha では C++ ライブラリの 64 ビット long double のサポートに制限がありました。64 ビット浮動小数点タイプが必要なコードでは, long double の代わりに double を使用していました。

6.7.3 オブジェクト・モデル

I64 の C++ コンパイラが使用するオブジェクト・モデルと名前マングリング・スキーマは,Alpha の場合と大きく異なります。 ARM オブジェクト・モデルは使用できません。使用できるのは,ANSI/ISO C++ 標準をサポートするオブジェクト・モデルのみです。ただしこれは,Alpha で実装されている /MODEL=ANSI オブジェクト・モデルとも異なり,I64 のモデルは業界標準の I64 ABI の実装となっています。 C++ オブジェクトの配置 (非 POD データ),あるいは .obj ファイルにエンコードされた外部マングル名に依存するプログラムは,作成し直す必要があります。このようなプログラムは,本質的に実装に大きく依存します。しかし,実装に依存しない適切な方法で標準の C++ 機能を使用するプログラムであれば,ポーティングは難しくありません。

6.7.4 言語ダイアレクト

cfront ダイアレクトはサポートされません (Alpha 版からも削除されます)。 /standard=cfront を使用してコンパイルした場合は, relaxed_ansi ダイアレクトが使用されます。


目次 索引

© 2012 Hewlett-Packard Development Company, L.P.