日本-日本語

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

OpenVMS マニュアル


≫ 

OpenVMS
ライブラリ

タイトルページ
目次
まえがき
第 1 章:移行プロセスの概要
第 2 章:移行方法の選択
第 3 章:アプリケーションの移行
第 4 章:再コンパイルと再リンクの概要
第 5 章:ページサイズの拡大に対するアプリケーションの対応
第 6 章:共用データの整合性の維持
第 7 章:アプリケーションデータ宣言の移植性の確認
第 8 章:アプリケーション内の条件処理コードの確認
第 9 章:OpenVMS I64コンパイラ
付録 A :アプリケーション評価チェックリスト
用語集
索引
PDF
OpenVMS ホーム

OpenVMS
OpenVMS VAX から OpenVMS I64 への
アプリケーションの移行


目次 索引



OpenVMS I64 システムで作成されるオブジェクト・ファイルの形式は VAX の形式と異なるため,コードが VAX のオブジェクト・ファイルのレイアウトに依存している場合は,変更しなくてはなりません。

オブジェクト・ファイルの形式は,『System V Application Binary Interface』2001 年 4 月 24 日付けドラフトに記述されている ELF (Executable and Linkable Format) の64 ビット版に準拠しています。このドキュメントは Caldera が発行しており,次の Web サイトで入手できます。


http://www.caldera.com/developers/gabi 

また,オブジェクト・ファイルの形式は,『Intel® Itanium® Processor-specific Application Binary Interface (ABI)』2001 年 5 月発行 (ドキュメント番号 245270-003) に記載されている I64 固有の拡張にも準拠しています。 OpenVMS オペレーティング・システム固有のオブジェクト・ファイルおよびイメージ・ファイル機能をサポートするのに必要な拡張や制限事項も,将来のリリースでドキュメントされる予定です。

イメージ内のデバッガが使用する部分は,DWARF Version 3 業界標準に準拠しています。このドキュメントは次の Web サイトで入手できます。


http://www.eagercon.com/dwarf/dwarf3std.htm 

OpenVMS I64 でのデバッグ・シンボル・テーブルの表現は,このドキュメントに記述されている業界標準の DWARF デバッグ・シンボル・テーブルの形式です。 DWARF Version 3 形式に対する弊社の拡張については,将来のリリースで公開される予定です。

3.7.4 浮動小数点データ型を使用するコード

OpenVMS VAX では,VAX 浮動小数点データ型をハードウェアでサポートしています。 OpenVMS I64 では,IEEE 浮動小数点データ型をハードウェアでサポートしており, VAX 浮動小数点データ型をソフトウェアでサポートしています。

ほとんどの OpenVMS I64 のコンパイラでは,VAX 浮動小数点データ型を生成できるように,/FLOAT=D_FLOAT および /FLOAT=G_FLOAT 修飾子が用意されています。これらの修飾子を指定しないと,IEEE 浮動小数点データ型が使用されます。

I64 BASIC コンパイラを使用してデフォルトの浮動小数点データ型を指定するには, /REAL_SIZE 修飾子を使用します。指定できる値は,SINGLE (Ffloat),DOUBLE (Dfloat),GFLOAT,SFLOAT,TFLOAT,および XFLOAT です。

VAX 浮動小数点を使用するオプションを指定した OpenVMS アプリケーションを I64 でコンパイルすると,コンパイラは浮動小数点形式を変換するコードを自動的に生成します。アプリケーションで一連の算術演算を実行すると,このコードは以下の処理を行います。

  1. VAX 浮動小数点形式を,長さに応じて IEEE 単精度または IEEE 倍精度浮動小数点形式に変換します。

  2. 算術演算を IEEE 浮動小数点演算で実行します。

  3. 演算結果を IEEE 形式から VAX 形式に戻します。

算術演算が実行されない場合 (VAX 浮動小数点データをフェッチした後にストアを行う場合) は,変換は行われません。コードではこのような状況を移動として扱います。

VAX 形式と IEEE 形式には以下の相違点があるため,算術演算の結果が異なる場合がまれにあります。

  • 表現される数値の範囲

  • 丸めの規則

  • 例外の動作

これらの違いにより,特定のアプリケーションでは問題が発生することがあります。

OpenVMS VAX とOpenVMS I64 の浮動小数点データ型の相違点,およびこれらの相違点がポーティング後のアプリケーションに与える影響の詳細については, 第 9 章 およびホワイト・ペーパー『Intel® Itanium® アーキテクチャにおけるOpenVMS 浮動小数点演算について』を参照してください。このホワイト・ペーパーが入手できる Web サイトについては,「まえがき」の「関連資料」を参照してください。

注意

浮動小数点に関する上記のホワイト・ペーパーが作成された後で, /IEEE_MODE のデフォルトが FAST から DENORM_RESULTS に変更されました。つまり,デフォルト設定で浮動小数点演算を実行した場合,VAX 形式の浮動小数点演算や /IEEE_MODE=FAST を使用したときに致命的な実行時エラーになっていたケースで, Infinity または Nan として出力される値が生成される場合があります (業界標準の動作)。また,値が非常に小さいために正規化された値として表現できなくなると,ただちに 0 になるのではなく,結果がデノーマル範囲になることが認められるため,このモードでの非ゼロ最小値は,はるかに小さな値になります。このデフォルトは,プロセス起動時に I64 で設定されるデフォルトと同じです。



OpenVMS I64 に移植したコードで LIB$WAIT が使用されていると,予測外の結果が発生することがあります。以下に C の例を示します。


float wait_time = 2.0; 
lib$wait(&wait_time); 

OpenVMS I64 システムでは,このコードはS_FLOATING を LIB$WAIT に送ります。しかし,LIB$WAIT は F_FLOATING を想定しているため,FLTINV 例外が発生します。

LIB$WAIT には 3 つの引数を指定することができます。 LIB$WAIT で 3 つの引数を使用して上記のコードを書き直すと, I64 システムと Alpha システムの両方で正常に動作するコードを作成できます。以下の変更後のコードは,/FLOAT 修飾子を指定せずにコンパイルすると,正常に動作します。


#ifdef __ia64 
 int float_type = 4;  /* use S_FLOAT for I64 */ 
#else 
 int float_type = 0;  /* use F_FLOAT for Alpha */ 
#endif 
 float wait_time = 2.0; 
 lib$wait(&wait_time,0,&float_type); 

よりよいコーディング手法として,アプリケーションで (SYS$STARLET_C.TLB から) LIBWAITDEF をインクルードし,浮動小数点データ型の名前を指定する方法があります。このようにして作成したコードは,保守がより容易になります。

LIBWAITDEF は以下のシンボルをインクルードします。

  • LIB$K_VAX_F

  • LIB$K_VAX_D

  • LIB$K_VAX_G

  • LIB$K_VAX_H

  • LIB$K_IEEE_S

  • LIB$K_IEEE_T

以下の例では,コードに libwaitdef.hをインクルードし,浮動小数点データ型の名前を指定する方法を示しています。この例でも,プログラムのコンパイル時に /FLOAT 修飾子が指定されないことを前提にしています。


#include <libwaitdef.h> 
. 
. 
. 
#ifdef __ia64 
 int float_type = LIB$K_IEEE_S;  /* use S_FLOAT for IPF */ 
#else 
 int float_type = LIB$K_VAX_F;  /* use F_FLOAT for Alpha */ 
#endif 
 float wait_time = 2.0; 
 lib$wait(&wait_time,0,&float_type); 



3.7.5 コマンド・テーブル宣言に関する注意

OpenVMS I64 へ移植するコードに正しくないコマンド・テーブル宣言があると,予想外の結果となる場合があります。たとえば,あるアプリケーションで,CLD ファイルからオブジェクト・モジュールを作成するのに CDU を使用しているとします。このアプリケーションは CLI$DCL_PARSE を呼び出し,コマンド行を解析します。 CLI$DCL_PARSE は次のようなエラーで失敗する場合があります。


%CLI-E-INVTAB, command tables have invalid format - see documentation 

このコードは,コマンド・テーブルを外部データ・オブジェクトとして定義するように修正する必要があります。

たとえば,VAX あるいは Alpha アプリケーションの BLISS モジュールで,コマンド・テーブル (DFSCP_CLD) が次のように間違って宣言されていたとします。


EXTERNAL ROUTINE DFSCP_CLD 

これは次のように変更する必要があります。


EXTERNAL DFSCP_CLD 

Fortranモジュールでコマンド・テーブルが次のように誤って宣言されているとします。


EXTERNAL DFSCP_CLD  

これは次のように変更する必要があります。


INTEGER DFSCP_CLD 
CDEC$ ATTRIBUTES EXTERN :: DFSCP_CLD 

同様に,C 言語で作成されたアプリケーションで次のようなコマンド・テーブルが定義されていたとします。


int jams_master_cmd(); 

このコードは,次のように外部参照に変更する必要があります。


extern void* jams_master_cmd; 

正しい宣言に変更すると,VAX,Alpha,および I64 のすべてのプラットフォームで動作するようになります。

3.7.6 スレッドを使用するコード

OpenVMS I64 では,これまでに OpenVMS でサポートされたすべてのスレッド・インタフェースがサポートされます。スレッドを使用する大部分の OpenVMS VAX コードは,全く変更なしで OpenVMS I64 へのポーティングが可能です。ここでは,その例外について説明します。スレッドを使用するコードのポーティングで発生する最大の問題は,スタック領域の使用です。 I64 のコードは,対応する VAX のコードよりはるかに大きいスタック領域を使用します。このため,スレッド化されたプログラムが VAX で問題なく動作していても, I64 ではスタック・オーバフローが発生することがあります。

オーバフローの問題を軽減するために,OpenVMS I64 ではデフォルトのスタック・サイズが拡大されています。しかし,アプリケーションで特定のスタック・サイズを要求している場合は,そのデフォルトの変更は影響しないため,より大きなスタックを要求するようにアプリケーションのソース・コードを変更しなければなりません。そのような場合は,まず,8 KBページを 3 つ (24576 バイト) 追加してみることをお勧めします。

必要なスタック・サイズを拡大した結果,もう 1 つの副作用として, P0 空間に対する要求が拡大します。スレッド・スタックは P0 ヒープから割り当てられます。スタックが大きくなると,プロセスのメモリ・クォータを超過してしまう可能性があります。極端な場合,P0 空間が完全に満杯になり,プロセスで同時に使用されるスレッドの数を減らさなければならなくなることもあります (またはその他の変更を行って,P0 メモリに対する要求を軽減します)。

『OpenVMS Version 8.2 リリース・ノート [翻訳版]』を参照して, OpenVMS でスレッドのサポートに関して行われた最新の機能向上について十分理解しておくことをお勧めします。 POSIX Threads C 言語ヘッダ・ファイル PTHREAD_EXCEPTION.H で 1 つの変更が行われたため,以前の動作に依存しているアプリケーションのポーティングを行うと,問題が発生します。

OpenVMS I64 では,DCL の THREADCP コマンドはサポートされません。 OpenVMS I64 では,スレッド関係のイメージ・ヘッダ・フラグの状態のチェックおよび修正には,OpenVMS VAX の THREADCP コマンドの代わりに, DCL コマンド SET IMAGE および SHOW IMAGE が使用できます。詳細は『OpenVMS DCL ディクショナリ』を参照してください。 THREADCP コマンドについては,『Guide to the POSIX Threads Library』で説明しています。

スレッド関係のイメージ・フラグの設定を変更したい場合は,次のように新しいコマンド SET IMAGE を使用する必要があります。


$ SET IMAGE/FLAGS=(MKTHREADS,UPCALLS) FIRST.EXE 



2 つの既存のスレッド API ライブラリ・ルーチン cma_delaycma_time_get_expirationは,VAX F_FLOAT 形式を使用する浮動小数点形式のパラメータを受け付けます。これらのルーチンを呼び出すアプリケーション・モジュールは, /FLOAT=D_FLOAT 修飾子または /FLOAT=G_FLOAT 修飾子を指定してコンパイルし, VAX F FLOAT がサポートされるようにしなければなりません (ただし,アプリケーションで倍精度バイナリ・データも使用している場合は, /FLOAT=G_FLOAT 修飾子を使用する必要があります)。浮動小数点のサポートについての詳細は,コンパイラのマニュアルを参照してください。

cma_delay あるいは cma_time_get_expiration のいずれかを使用する C 言語モジュールが, IEEE 浮動小数点モードで間違ってコンパイルされると,次のようなコンパイラの警告メッセージが表示されます。


cma_delay ( 
    ^ 
%CC-W-LONGEXTERN, The external identifier name exceeds 31 
characters; truncated to "CMA_DELAY_NEEDS_VAX_FLOAT______". 

このような警告メッセージの原因となるようなオブジェクト・ファイルがリンクされている場合,リンカはこのシンボルに対して未定義シンボル・メッセージを表示します (リンカが生成したイメージをこの後で実行すると,ルーチンの呼び出しは ACCVIO で失敗します)。これらのコンパイラおよびリンカの診断メッセージの目的は,これらの CMA ルーチンでは VAX 形式の浮動小数点値を使用する必要があり,この要件を満たさない形でコンパイルが行われたことを警告することです。

注意

これらのルーチンについては,ユーザ向けのドキュメントには記載されていませんが,既存のアプリケーションで使用できるように,サポートが継続されています。



データ参照の性能を最適なレベルに向上させるには,データを自然にアラインすることをお勧めします。データが自然にアラインされていない場合, OpenVMS I64 での性能が大幅に低下します。

データのアドレスが,バイト数で表したデータ・サイズの整数倍になっている場合,そのデータは自然にアラインされています。たとえば,ロングワードは,4 の倍数のアドレスで自然にアラインされ,クォドワードは 8 の倍数のアドレスで自然にアラインされます。構造体のすべてのメンバが自然にアラインされると,その構造体も自然にアラインされます。

自然なアラインメントができない場合もあるので,OpenVMS I64 システムでは,アラインされていないデータを参照することによる影響を管理するための支援機能を提供しています。 I64 コンパイラは,発生する可能性のある大部分のアラインメントの問題を自動的に修正し,修正できない問題にはメッセージを出力します。

自然にアラインされていない共用データがあると,性能が低下するだけでなく,プログラムが正常に実行されない原因にもなります。したがって,共用データは自然にアラインする必要があります。データの共用は,1 つのプロセス内のスレッドの間,プロセスと AST の間,複数のプロセスで使われるグローバル・セクションにおいて発生します。

問題の検出

自然にアラインされていないデータのインスタンスを検出するには,アラインされていないデータへの参照をコンパイラがコンパイル時に報告する修飾子を使用します。この修飾子は I64 のほとんどのコンパイラで提供されています。 表 3-3 にこの修飾子を示します。

表 3-3 コンパイル時の参照を報告するためのコンパイラ・スイッチ
コンパイラ 修飾子
BLISS /CHECK=ALIGNMENT
C /WARN=ENABLE=ALIGNMENT
Fortran /WARNING=ALIGNMENT
HPE Pascal /USAGE=PERFORMANCE

自然にアラインされていないデータを実行時に検出する OpenVMS デバッガの修飾子など,他の支援機能は,将来のリリースで計画されています。

問題への対処方法

アラインされていないデータをなくすには,次の方法を使用します。

  • 自然なアラインメントでコンパイルするか,または言語がこの機能を備えていない場合には,自然なアラインメントになるようにデータを移動します。データが確実にアラインされるように間隔を空けると,メモリ・サイズが増えるという問題があります。メモリを節約すると同時に,確実にデータを自然にアラインする方法として,サイズの大きい変数を先に宣言する方法があります。

  • 構造体内で強制的に自然なアラインメントが実現されるように,高級言語命令を使用します。

  • データ項目をクォドワード境界にアラインします。

注意

自然なアラインメントに変換されたソフトウェアは,同じ OpenVMS Cluster 環境内のシステム,またはネットワークによって接続されたシステムで実行されるトランスレートされた他のソフトウェアと互換性がなくなる可能性があります。次の例を参照してください。

  • 既存のファイル形式は,アラインされていないデータを含むレコードを定義している可能性があります。

  • トランスレートされたイメージは,アラインされていないデータをネイティブ・イメージに渡したり,ネイティブ・イメージからそのようなデータが渡されることを必要とする可能性があります。

このような場合には,アプリケーションのすべての部分が同じデータ型,つまり,アラインされたデータ型またはアラインされていないデータ型を要求するように変更しなければなりません。


目次 索引

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