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


OpenVMS マニュアル


 

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

タイトルページ
目次
まえがき
第 1 部 : 概念と方法
第 1 章:Macro-32コードの移植の準備
第 2 章:MACROコンパイラのプラットフォームごとの動作
第 3 章:ソースに対する推奨される変更と必要な変更
第 4 章:移植したコードの性能改善
第 5 章:MACROの64ビット・アドレッシングのサポート
第 2 部:リファレンス・セクション
付録 A :MACROコンパイラの修飾子
付録 B :専用の指示文
付録 C :MACROコンパイラ・ビルトイン
付録 D :VAXからAlphaまたはI64への移植用のマクロ
付録 E :64ビット・アドレッシング用のマクロ
索引
PDF
OpenVMS ホーム
HP OpenVMS MACRO コンパイラポーティングおよびユーザーズ・ガイド

HP OpenVMS MACRO コンパイラ
ポーティングおよびユーザーズ・ガイド


目次 索引

他の言語で記述されたコードのロック

VAX MACRO モジュール中で $LOCK_PAGE_INIT マクロを使用することで,他のプログラミング言語で記述されたコードもロックダウンすることができます。生成されたコードで psect $LOCK_PAGE_2 を使用しており,生成されたリンケージ・セクションで psect $LOCK_LINKAGE_2 を使用していれば,このマクロによって,任意の言語で記述された,任意のモジュール中の任意のコードがロックされます。

オンザフライのロックダウン

オンザフライのロックダウンでは,$LOCK_PAGE と $UNLOCK_PAGE がそれぞれロック対象コード・セクションの先頭と終わりをマークします。マークされたコードは,ロック対象 psect 内の独立したルーチンとなり,イメージ中のあらゆる場所にあるすべてのロック対象コードがこの psect に配置されます。

$LOCK_PAGE は,ロックされるルーチンのページとリンケージ・セクションをワーキング・セットにロックし,JSR でそこにジャンプします。このマクロは,実行可能コード内にインラインで配置されます。このマクロと対応する $UNLOCK_PAGE マクロの間のすべてのコードが,ロックされるルーチンに入れられ,ロックダウンされます。

$UNLOCK_PAGE はロックされたルーチンから戻り,ページとリンケージ・セクションをワーキング・セットからアンロックします。このマクロは,実行可能コードの, $LOCK_PAGE マクロの後のいずれかの場所に,インラインで配置します。

$LOCK_PAGE と $UNLOCK_PAGE には,オプションのパラメータ ERROR があります。これは,$LKWSET または $ULWSET の呼び出しに失敗した場合に分岐するエラー・アドレスです。 $UNLOCK_PAGE には 2 番目のオプション・パラメータ LINK_SECT があります。 LINK_SECT は,$LOCK_PAGE マクロが実行されたときの実際のリンケージ psect が,デフォルトのリンケージ psect ($LINKAGE) でなかった場合に戻るリンケージ psect です。

どちらのマクロでも,すべてのレジスタが保存されます。ただし,エラー・アドレス・パラメータが指定されており,いずれかの呼び出しが失敗すると,R0 には失敗した呼び出しの状態が設定されます。コードのロックまたはアンロックの呼び出しに失敗した場合は R1 に 0 が設定され,その呼び出しは成功したものの,リンケージ・セクションのロックまたはアンロックの呼び出しが失敗した場合には 1 が設定されます。

$LOCK_PAGE マクロで制御がコードに渡り, $UNLOCK_PAGE マクロで制御が戻ります。 $LOCK_PAGE マクロを実行したときに有効だったローカル・シンボル・ブロックは, $UNLOCK_PAGE マクロを実行すると復元されますが,ロックされたコードは独立したルーチンとなるため,ロックされたコード自体は個別のローカル・シンボル・ブロックを持ちます。名前付きシンボルが使用されている場合でも,ロックされたコード・セクションへの外からの分岐や,ロックされたコード・セクションから外への分岐は禁止されており,コンパイラで次のエラー・メッセージが出力されます。

%AMAC-E-MULTLKSEC, Routines which share code must use the same linkage psect. 

ロックされるコードは個別のルーチンになり,スタック・コンテキストは同じでなくなるため,ルーチン内でのローカル・スタック・ストレージへの参照は,すべて変更する必要があります。

  注意
オンザフライのロックダウンは,4 つのシステム・サービスの呼び出しと,実行の都度追加のサブルーチンを呼び出すことによるオーバヘッドがあるため,性能が重要なコードでロックダウンを行う場合は,初期化時のロックダウンに変更することをお勧めします。イメージ内の他のルーチンが初期化時のロックダウンを使用している場合は,オンザフライのロックダウンを初期化時のロックダウンに変更する必要があります。

表 3-2 に,オンザフライのロックダウンでこれらのマクロを使用するために必要な変更を示します。 $UNLOCK_PAGE マクロが,実行されるように,そのマクロが RSB の前にある点に注意してください。ルーチンによって R0 とR1 で渡される情報は, $UNLOCK_PAGE によってそれらのレジスタが保護されるため,内容はそのままとなります。

表 3-2 オンザフライのロックダウン
コード・セクション VAX システム Alpha システム
メイン・コード
Routine_A:

.
.
.
SETIPL 100$
.
.
.
RSB
100$: .LONG IPL$SYNCH
Routine_A:

.JSB_ENTRY
.
.
.
$LOCK_PAGE
.
.
.
$UNLOCK_PAGE
RSB

表 3-3 に,同じオリジナルのコードと,初期化時のロックダウンで必要な変更を示します。

表 3-3 同じコードのイメージ初期化時のロックダウン
コード・セクション VAX システム Alpha システム
初期化

なし。
 $LOCK_PAGE_INIT

メイン・コード
Routine_A:

.
.
.
SETIPL 100$
.
.
.
RSB
100$: .LONG IPL$SYNCH
 $LOCKED_PAGE_START

Routine_A:
.JSB_ENTRY
.
.
.
RSB
$LOCKED_PAGE_END



3.11 同期

同期に関する以下の情報は, OpenVMS VAX システムから OpenVMS Alpha システムまたは OpenVMS I64 システムにコードを移植する場合に該当します。

  • メモリ中のアラインされたロングワードに対してロングワード演算を行うコードは,同期を追加しなくても Alpha システムと Itanium システムで動作します。これはアーキテクチャ的に保証されています。
    Alpha と Itanium のアーキテクチャでは,この保証が拡張され,メモリ中のアラインされたクォドワードに対するクォドワード演算でも動作が保証されます。ただし,これは VAX システムとの下位互換性はありません。 Alpha または Itanium のコードだけがこの機能に依存できます。

  • インターロックされる命令 (BBSSI,BBCCI,および ADAWI) は引き続き機能します。 ただし,これを使用する場合には以下の点に留意してください。

    • これらの命令をコンパイルする際には, MACRO コンパイラはメモリ・バリア機能を暗黙的に提供します。

    • これらの命令は,バイト細分性環境を前提としています。 これらの命令が操作するデータ・セグメントが,さまざまなスレッドから並行して書き込まれる可能性がある場合は, MACRO コンパイラの PRESERVE 機能を使用して,データ・セグメントのさらなる同期を行う必要があります。

    • バイト細分性の問題に対処すると同時に,高い性能を達成するもう 1 つの方法は,データ・セグメントがアンパックされるように再構成する方法です。つまり,BBSSI または BBCCI で変更されるビット,または ADAWI で変更されるワードは,並行して動作する別の命令スレッドから他の部分が変更されないようなロングワードの中にある必要があります。
      問題のデータをさらに分割し,そのデータが含まれている,アラインされた 128 バイトのロック範囲の任意の場所への独立した並列アクセスが起きないようにすると,Alpha での Load-locked/Store-conditional 命令の実装の多くでさらに性能が向上します。

  • VAX のインターロックされるキュー命令は, OpenVMS Alpha システムまたは OpenVMS I64 システムでも変更なく動作し,必要なインターロックとメモリ・バリア機能を持った同等の PALcode が呼び出されます。
    インターロックされないキュー命令も同等の PALcode にコンパイルされ,単一のプロセッサ上では引き続き不可分となります。

  • VAX の同期ツールは, OpenVMS Alpha および OpenVMS I64 でもそのまま動作します。以下のすべてのメカニズムは,同期のために,インターロックされる命令を直接または間接的に使用します (使用されているインターロックされる命令は,透過的にメモリ・バリアを提供します)。

    • イベント・フラグ---操作するすべてのシステム・サービス

    • スピンロック---取得と解放の演算子すべて (LOCK と UNLOCK,FORKLOCK と FORKUNLOCK,DEVICELOCK と DEVICEUNLOCK)

    • ミューテクス---スピンロックにより保護

    • ロック・マネージャ---スピンロックにより保護

        注意
      この同期の保証は,マルチプロセシング・システムにのみ該当します。ユニプロセシング版のスピンロックは,インターロックされる命令を使用しません。その結果,ユニプロセッサのスピンロック,ミューテクス,ロック・マネージャの同期では,メモリ・バリアは提供されません。

    • AST での並列スレッドと不可分性については,コードを再設計するか,コンパイラが提供する機能を使用して不可分性を適用する必要があります。 MACRO コンパイラには PRESERVE 機能があります。

    • OpenVMS Alpha では,例外ハンドラを変更するコードは,処理待ちの算術トラップとマシン・アボートのいずれかまたは両方が非同期に発生する可能性がある場合は,変更が必要な場合があります。 TRAPB 命令は,必要な同期メカニズムを提供します。ハンドラを変更しているときに同期を適用したい場合は,次の例に示すように,手動でプログラムに追加する必要があります。

      ADDL3 R1, R2, 4(R3)      ; Save total 
      EVAX_TRAPB                 ; Insure any arithmetic traps handled by 
                                 ; existing handler 
      MOVAB   HANDLER2, 0(FP)    ; Enable new condition handler 
      

    • OpenVMS Alpha アセンブリ言語コードを記述するときには, Alpha アーキテクチャでの読み書き順序について理解してください。必要に応じて MB 命令をコードに追加してください。


    目次 索引

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