前へ | 次へ | 目次 | 索引 |
このプログラムをAlphaシステムで実行するには,条件コードを SS$_INTOVFからSS$_HPARITHに変更しなければなりません(オーバーフローのタイプはシグナル・アレイ内の例外サマリ引数を調べることにより判断できます。詳しくはコンパイラに関する解説書を参照してください)。VAXシステムの場合と同様に,オーバーフロー検出を可能にするためにはコンパイル・コマンド・ラインに /CHECK=OVERFLOW修飾子を指定なければなりません。DEC Fortran はLIB$ESTABLISHルーチンを組み込み関数として受け付けるため,このルーチンの呼び出しを削除する必要はありません。
例 8-2 条件処理プログラムの例 |
---|
C This program types a maximum value of integers C Compile with /CHECK=OVERFLOW and the /EXTEND_SOURCE qualifiers INTEGER*4 int4 EXTERNAL HANDLER CALL LIB$ESTABLISH (HANDLER) (1) int4=2147483645 WRITE (6,*) ' Beginning DO LOOP, adding 1 to ', int4 DO I=1,10 int4=int4+1 WRITE (6,*) ' INT*4 NUMBER IS ', int4 END DO WRITE (6,*) ' The end ...' END C This is the condition-handling routine INTEGER*4 FUNCTION HANDLER (SIGARGS, MECHARGS) INTEGER*4 SIGARGS(*),MECHARGS(*) INCLUDE '($FORDEF)' INCLUDE '($SSDEF)' INTEGER INDEX INTEGER LIB$MATCH_COND INDEX = LIB$MATCH_COND (SIGARGS(2), SS$_INTOVF) (2) IF (INDEX .EQ. 0 ) THEN HANDLER = SS$_RESIGNAL ELSE IF (INDEX .GT. 0) THEN WRITE (6,*) 'Arithmetic exception detected...' CALL LIB$STOP(SIGARGS(1)) END IF END |
次のリストの各項目は 例 8-2 に示されている番号に対応しています。
次の例は,例 8-2 に示したプログラム名をコンパイル,リンク,および実行する方法を示しています。
$ FORTRAN/EXTEND_SOURCE/CHECK=OVERFLOW HANDLER_EX.FOR $ LINK HANDLER_EX $ RUN HANDLER_EX Beginning DO LOOP, adding 1 to 2147483645 INT*4 NUMBER IS 2147483646 INT*4 NUMBER IS 2147483647 Arithmetic exception detected... %TRACE-F-TRACEBACK, symbolic stack dump follows Image Name Module Name Routine Name Line Number rel PC abs PC INT_OVR_HAND INT_OVR_HANDLER HANDLER 1637 00000238 00020238 DEC$FORRTL 0 000651E4 001991E4 ----- above condition handler called with exception 00000504: %SYSTEM-F-HPARITH, high performance arithmetic trap, Imask=00000001, Fmask=00000 000, summary=40, PC=000200E0, PS=0000001B -SYSTEM-F-INTOVF, arithmetic trap, integer overflow at PC=000200E0, PS=0000001B ----- end of exception message 0 84FE9FFC 84FE9FFC INT_OVR_HAND INT_OVR_HANDLER INT_OVR_HANDLER 15 000000E0 000200E0 0 84EFD918 84EFD918 0 7FF23EE0 7FF23EE0 |
この章では,Alpha システムで実行するために,VAX アプリケーションをトランスレートするときに使用するリソースについて説明します。
9.1 DECmigrate for OpenVMS Alpha
DECmigrate for OpenVMS Alpha は,ソース・コードを入手できないイメージをトランスレートするときに使用します。DECmigrate の VAX Environment Software Translator (VEST) コンポーネントは,VAX のバイナリ・イメージ・ファイルをネイティブな Alpha イメージにトランスレートします。トランスレートされたイメージは,Alpha コンピュータの Translated Image Environment (TIE) のもとで動作します (TIE は OpenVMS Alpha オペレーティング・システムで提供される共用可能イメージです)。トランスレーションでは,エミュレーションやインタプリテーションのもとで OpenVMS VAX イメージを実行することは行われません (ただし,特定の例外があります)。その代わり,新しい OpenVMS Alpha イメージには,元の OpenVMS VAX イメージの命令が実行していた操作と同じ操作を実行する Alpha 命令が含まれます。
トランスレートされたイメージは一般に,VAX コンピュータでオリジナル・イメージを実行するときと同じ速度で,Alpha コンピュータでも動作します。しかし,トランスレートされたイメージは,Alpha アーキテクチャのすべての利点を活用する最適化コンパイラを利用できません。したがって,トランスレートされたイメージは一般に,ネイティブな OpenVMS Alpha イメージの約 25〜40 パーセントの速度で動作します。このように性能が低下する主な理由は,アラインされないデータと複雑な VAX 命令を広範囲にわたって使用しているためです。
DECmigrate によるトランスレーション・サポートは,OpenVMS VAX バージョン 5.5-2 に存在する言語機能,システム・サービス,実行時ライブラリ・エントリ・ポイントに制限されています。
DECmigrate のもう 1 つの機能は,イメージを分析して,Alpha コンピュータで互換性が維持されない部分を識別することです。このように互換性が維持されない部分は,その種類に応じて,問題を修正するためにコンパイラ修飾子を指定したり,コードを変更することができます。
イメージ・トランスレーションと VEST の詳細については,『DECmigrate for OpenVMS AXP Systems Translating Images』を参照してください。
9.2 DECmigrate: トランスレートされたイメージのサポート
DECmigrate バージョン 1.1A は,OpenVMS バージョン 6.1 以降を実行する Alpha システムで動作します。トランスレートされたイメージを実行するには,このバージョンまたはそれ以降のバージョンが必要です。トランスレートされたイメージは一般に,それ以降のバージョンと互換性を維持しますが,以前のバージョンとの互換性は維持しません。つまり,DECmigrate バージョン 1.1A を使用してトランスレートされたイメージは,OpenVMS バージョン 6.1 以降を稼動している Alpha システムのみで動作できますが,DECmigrate バージョン 1.0 を使用してトランスレートされたイメージは,OpenVMS Alpha バージョン 1.0 以降で動作できます。表 9-1 は,OpenVMS Alpha システムの各バージョンと,それをサポートする DECmigrate のバージョンを示しています。
イメージをトランスレートするために使用した DECmigrate のバージョン | トランスレートされたイメージに対する OpenVMS Alpha のサポート | ||
---|---|---|---|
バージョン 1.0 | バージョン 1.5 | バージョン 6.1 以降 | |
バージョン 1.0 | サポートされる | サポートされる | サポートされる |
バージョン 1.1 | サポートされない | サポートされる | サポートされる |
バージョン 1.1A | サポートされない | サポートされない | サポートされる |
9.3 Translated Image Environment (TIE)
イメージのトランスレーションは,VAX アプリケーションの一部または全部を OpenVMS Alpha に移行するための 1 つの手段です。 DECmigrate for OpenVMS AXP の VAX Environment Software Translator ユーティリティ (VEST) は,VAX 実行可能イメージまたは共用可能イメージを,同等の機能の Alpha イメージに変換することにより,トランスレートされたイメージを作成します。VEST は,オプションとして提供されるレイヤード製品 DECmigrate for OpenVMS AXP の構成要素です。
トランスレートされたイメージが OpenVMS Alpha で実行される場合には,Translated Image Environment (TIE) がイメージを正しく実行するのに必要な VAX 環境を提供します。TIE は TIE$SHARE と TIE$EMULAT_TV という共用可能イメージで構成されます。これらのイメージは VAX の複合命令を実行します。移行におけるイメージ・トランスレーションの役割については,『DECmigrate for OpenVMS AXP Systems Translating Images』を参照してください。
この後の節では,次のことについて説明します。
ネイティブなイメージとトランスレートされたイメージの間の相互操作性
TIE は OpenVMS Alpha の他の構成要素と連携動作して,ネイティブなイメージとトランスレートされたイメージが相互に他のイメージを呼び出すことができるようにしています。相互操作性に依存したアプリケーションやランタイム・ライブラリを開発する場合には,コンパイル,リンク,またはトランスレートを行うときに,特定の手順に従わなければなりません。 第 9.3.1.4 項 に説明している最初の制限事項を参照してください。
トランスレートされたイメージを実行するには,DCL の RUN コマンドを使用します。次の例を参照してください。
$ RUN FOO_TV.EXE |
OpenVMS Alpha に,適切なトランスレートされた共用可能イメージと実行時ライブラリが含まれていない限り,トランスレートされたイメージは正しく動作しません。イメージをトランスレートするときに,VEST は,入力イメージが参照しているイメージとライブラリに対応するイメージ情報ファイル (IIF---ファイル・タイプは .IIF) を必要とします。これらの .IIF ファイルを使用すると,VEST は共用可能イメージとライブラリのトランスレートされたバージョンを正しく参照するトランスレートされたイメージを作成できます。イメージのトランスレーションで使用されるイメージ情報ファイルは,OpenVMS Alpha で使用できるトランスレートされた共用可能イメージまたは実行時ライブラリのバージョンに正確に対応しなければなりません。
OpenVMS Alpha には,トランスレートされた実行時ライブラリと対応するイメージ情報ファイルがあります。これらは 第 9.4 節 に示すとおりです。トランスレートして実行するイメージで参照されているライブラリまたは共用可能イメージが含まれているかどうかを判断するには,このリストを確認してください。OpenVMS Alpha に,必要な共用可能イメージまたはライブラリがない場合には,『DECmigrate for OpenVMS AXP Systems Translating Images』を参照してください。このマニュアルでは,イメージ情報ファイルの作成方法と使用方法を説明しています。
トランスレートされたライブラリがそのライブラリのネイティブ・バージョンに置き換えられた場合には,そのライブラリを指す論理名を適切に定義しなければなりません。つまり,image_TV を image に再定義しなければなりません。
TIE の実行時サポート機能の他に,TIE の統計情報とフィードバックを使用すると,トランスレートされたイメージの性能を向上するのに役立ちます。
『DECmigrate for OpenVMS AXP Systems Translating Images』では,これらの機能について詳しく説明しており,また,これらの機能の使用を有効または無効に設定するための論理名の定義方法についても説明しています。
9.3.1 問題点と制限事項
この節では,TIE の問題点と制限事項について説明します。
9.3.1.1 条件ハンドラに関する制限事項
ネイティブ・イメージとトランスレートされたイメージの両方に対して設定できる条件ハンドラのタイプには,永久的な制限事項があります。ネイティブ・ルーチンは,トランスレートされた条件ハンドラを設定することができず,トランスレートされたルーチンはネイティブな条件ハンドラを設定できません。ネイティブ・イメージまたはトランスレートされたイメージがこの制限に違反すると,実行時の結果は予測できなくなります。
9.3.1.2 例外ハンドラに関する制限事項
次の例外ハンドラの制限事項は永久的なものです。
次の浮動小数点の制限事項は永久的なものです。
トランスレートするときに /PRESERVE=FLOAT_EXCEPTIONS 修飾子を使用せず,ダーティ・ゼロに対して演算を実行するイメージは,HPARITH 例外を発生させ,要約状態のビット 1 がセットされます。トランスレートされたアプリケーションでこのような例外が発生した場合には,/PRESERVE=FLOAT_EXCEPTIONS を指定して再トランスレートしてください。VAX のダーティ・ゼロが発生するのは一般に,浮動小数点データを 0 に初期化しなかったためです。この場合には,ダーティ・ゼロを使用するアプリケーションを OpenVMS Alpha に移植するために,ソース・コードを変更しなければならない可能性があります。
MOVD (SP),R2 MOVD R2,-(SP) |
VEST は,これらの VAX 命令を次のような Alpha コードにトランスレートします。
LDD F2,0(R14) ! Pick up D float CVTDG F2,F2 ! Convert to Canonical G Form with rounding CVTGD F2,F17 ! Convert back to D Form for storing STD F17,-8(R14) ! Store the result |
実行時に,VEST で生成されたコードは,D56 浮動小数点を G 正規形式に変換するときに,もっとも正確な G 浮動小数点の値を求めるために丸めを行います。場合によっては,G 正規形式に変換すると,D 浮動小数点の値が切り上げられ,D 浮動小数点では表現できない指数部を作成することがあります。この場合には,CVTGD 操作は HPARITH トラップを発生させ,その理由として浮動小数点オーバフローを示します。
トランスレートされたイメージで実行時にこの問題が発生した場合には,VEST の /FLOAT=D56_FLOAT 修飾子を使用して再度トランスレートを行い,プログラムが正しく実行されるようにしなければなりません。
相互操作性に関して,次の制限事項に注意してください。
この問題が発生した場合には,デバッガを使用して次のことを確認してください。
これらのすべての確認で問題が検出されなかった場合には,/TIE 修飾子を使用してネイティブ・ルーチンを再コンパイルし,実行時に自動ジャケットが有効になるようにします。
前へ | 次へ | 目次 | 索引 |