[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]

16 ベクタ化されたプログラムのデバッグ(VAXのみ)

本章では,ベクタ化されたプログラム(VAXベクタ命令を使用するプログラム) に固有のデバッガの機能について説明します。他の章で説明するデバッガの機能のほかに, これらの機能も使用します。

本章では,以下のタスクを実行する方法を説明しています。

ベクタ化された高級言語プログラムについての詳しい説明は,各言語のドキュメントを参照してください。 ベクタ命令とベクタ・レジスタについての詳しい説明は, 『VAX MACRO and Instruction Set Reference Manual』を参照してください。


注意

  1. コンパイラは,プログラム内で宣言されたシンボルにベクタ・ レジスタを関連づけるためのシンボル・テーブル・データを生成しません。 したがって,デバッグ・セッション中,ベクタ・レジスタはシンボル化できません。 また,有効範囲0(呼び出しスタックの最上部にあるルーチンの有効範囲) にあるベクタ・レジスタにしかアクセスできません。

  2. 本章の例は,配列構文(たとえば,EXAMINE %V1(37))を使用してベクタ・ レジスタの要素にアクセスする方法を示します。この構文はBLISS ではサポートされていません。BLISSの場合は,SET LANGUAGE コマンドを使用して言語を一時的に他の言語(Fortranなど)に変換し, その言語の配列構文を使用します。

16.1 ベクタ型プロセッサについての情報の入手

SHOW PROCESS/FULLコマンドを使用すると,ユーザのシステムでベクタ型プロセッサを使用できるかどうかおよびその使用方法に関する情報を得ることができます。 次に例を示します。

     DBG> SHOW PROCESS/FULL
        .
        .
        .
     Vector capable:            Yes
     Vector consumer:           Yes  Vector CPU time:       0 00:03:17.18
     Fast Vector context switches:   0  Slow Vector context switches:      0
        .
        .
        .
     DBG>

「Vector capable」フィールドには,次のいずれかを指定できます。

Vector-Capable項目 説明
あり VAXシステムにベクタ型プロセッサがあり, 現在プログラムを実行中のプロセスがアクセスできる。
なし(保護されている) VAXシステムにはベクタ型プロセッサがあるが, プログラムを実行しているプロセスはこのプロセッサにアクセスできない。
VVIEF VAXシステムにはベクタ型プロセッサがない。VAX ベクタ命令エミュレーション機能(VVIEF)を実行中である。プログラムを実行しているプロセスはVVIEF にアクセスできる。
No VAXシステムにはアクティブなベクタ型プロセッサがない。 また,VVIEFはこのシステムにロードされていない。

16.2 ベクタ命令の実行の制御とモニタ

ここでは,次のタスクを実行する方法を説明します。

16.2.1 次のベクタ命令までのプログラム実行

プログラム内で次のベクタ命令が検出されるまでそのプログラムを実行するには,STEP/VECTOR_INSTRUCTION コマンドを入力します。

STEP/INSTRUCTION=(opcode[, . . . ])コマンドを使用すれば, 命令コード・リスト内にある命令コードを持つベクタ命令を次に検出するまでプログラムを実行することもできます。 次に例を示します。

     DBG> STEP/INSTRUCTION=(VLDL,VSTL,MOVL)

SET STEPコマンドを使用すると,次のようにSTEPコマンドの省略時の実行単位を変更できます。

16.2.2 ベクタ命令に対するブレークポイントとトレースポイントの設定

プログラム内でベクタ命令が検出されたとき必ずブレークポイントまたはトレースポイントを検出するには,SET BREAK/VECTOR_INSTRUCTION またはSET TRACE/VECTOR_INSTRUCTION コマンドを入力します。

このようなブレークポイントまたはトレースポイントを取り消すには, CANCEL BREAK/VECTOR_INSTRUCTIONコマンドまたはCANCEL TRACE/VECTOR_ INSTRUCTIONコマンドを入力します。

SET BREAKコマンドやSET TRACEコマンドとともに/INSTRUCTION=( opcode[, . . . ])修飾子を使用しても,1 つまたは複数のベクタ命令上にブレークポイントやトレースポイントを設定できます。 次にその例を示します。

     DBG> SET BREAK/INSTRUCTION=(VVADDL,VVLEQL)

このようなブレークポイントやトレースポイントを取り消すには,CANCEL BREAK/INSTRUCTIONコマンドまたはCANCEL TRACE/INSTRUCTIONコマンドを使用します。

16.2.3 ベクタ・レジスタ上へのウォッチポイントの設定

ウォッチポイントは,ベクタ・レジスタ(V0〜V15)とベクタ制御レジスタ( VCR ,VLR,およびVMR)に設定できます。これらのレジスタとその組み込みのデバッガ・ シンボルについては,第16.3.1 項を参照してください。

これらのウォッチポイントは,静的ウォッチポイントとして扱われ,設定されたあとは明示的に取り消すまで有効です。 次の例では,ウォッチポイントがVCR レジスタに設定されます。

     DBG> SET WATCH %VCR

レジスタVMRとV0からV15の場合,ウォッチポイントはレジスタ集合体( レジスタのすべての要素),個々のレジスタ要素またはある範囲の要素( 断面)のどれかに設定できます。これは,配列変数にウォッチポイントを設定する場合と同じ方法で設定します。 第3.4 節を参照してください。

たとえば,次のコマンドは,レジスタV5の要素がどれか変化するとウォッチポイントが検出されるように設定します。

     DBG> SET WATCH %V5

次のコマンドは,V2の要素37が変化すると,ウォッチポイントが検出されるように設定します(Fortran 配列構文)。

     DBG> SET WATCH %V2(37)

次のコマンドは,V2で要素5〜13のどれかが変化するとウォッチポイントが検出されるように設定します。

     DBG> SET WATCH %V2(5:13)

16.3 ベクタ・レジスタの検査と値の格納

ここでは,ベクタ制御レジスタ(VCR,VLRおよびVMR)とベクタ・レジスタ(V0 〜V15)を検査し,値を格納する方法を説明します。

16.3.1 ベクタ・レジスタとベクタ制御レジスタの指定

VAXアーキテクチャには,16個のベクタ・レジスタ(V0〜V15)と3個のベクタ制御レジスタ(VCR ,VLR,VMR)があります。デバッガ・コマンドでこれらのレジスタを参照する場合は, 次の組み込みシンボル(レジスタ名の前にパーセント記号(%) がついてる)を使用します。

シンボル 説明
%V0 . . . %V15 ベクタ・レジスタ(V0 . . . V15)
%VCR ベクタ数レジスタ(VCR)
%VLR ベクタ長レジスタ(VLR)
%VMR ベクタ・ マスク・レジスタ(VMR)

どのデバッガ・レジスタ・シンボルでもそうであるように,プログラムがその名前にパーセント記号(%) を宣言していない場合,このシンボルは省くことができます。

16.3.2 ベクタ数レジスタの検査と値の格納

ベクタ数レジスタ(VCR)は,IOTA命令によって生成されたオフセット・ベクタの長さを指定します。

VCRの値は,0から64までの整数です。省略時の設定では,デバッガはVCR をロングワード整数として扱います。64を超す値もVCRに格納できますが, その場合,デバッガは診断メッセージを発行して値がこのクラスの限界を超えていることを知らせます。

次のコマンド・シーケンスは,VCRの値を操作する方法を示しています。

     DBG> EXAMINE %VCR
     0\%VCR: 8
     DBG> DEPOSIT %VCR = 4
     DBG> EXAMINE %VCR
     0\%VCR: 4
     DBG>

16.3.3 ベクタ長レジスタの検査と値の格納

ベクタ長レジスタ(VLR)は,ベクタ命令が処理するベクタ・レジスタの最上位の要素を制限します。VLR の値は,0から64までの整数です。この値は, 処理されるレジスタ要素の数を指定します。要素0から指定できます。

デバッグ・セッションでは,VLRの現在の値が,EXAMINEデバッガ・コマンドまたはDEPOSIT デバッガ・コマンドでアクセスできるベクタ・レジスタの最上位の要素を制限します。

次のコマンド・シーケンスは,VLRの値を操作して,ベクタ・レジスタV1 の別の要素数を検査する方法を示しています。

     DBG> EXAMINE %VLR
     0\%VLR: 4
     DBG> EXAMINE %V1
     0\%V1
         (0):       12
         (1):        3
         (2):      138
         (3):       51
     DBG> DEPOSIT %VLR = 3
     DBG> EXAMINE %VLR
     0\%VLR: 3
     DBG> EXAMINE %V1
     0\%V1
         (0):       12
         (1):        3
         (2):      138
     DBG>

0からVLR-1までの範囲にないレジスタ要素にはアクセスできません。次の例では,EXAMINE コマンドがレジスタVIの要素7を指定していますが,これは境界外です(Fortran 配列構文)。

     DBG> EXAMINE %VLR
     0\%VLR: 3
     DBG> EXAMINE %V1(7)
     %DEBUG-E-VECTSUBRNG, vector register subscript out of bounds,
                          bounds are 0..2
     DBG>

省略時の設定では,デバッガがVLRをロングワード整数として扱います。 64を超えた値をVLRに格納できますが,その場合,デバッガは診断メッセージを発行して値が境界外であることを知らせます。

16.3.4 ベクタ・マスク・レジスタの検査と値の格納

ベクタ・マスク・レジスタ(VMR)は,ベクタ命令がベクタ・レジスタ・オペランドの特定の要素だけに演算を行うために使用するマスク( ビット・ パターン)を指定します。マスクされたベクタ命令は,VMRによってマスクされたベクタ・ レジスタの要素には演算を行いません。

VMRには0から63までの番号がついた64個のビット(1クォドワード)が含まれています。 各ビットはベクタ・レジスタ内の要素と対応しています。特定のビットの値(0 または1)は,マスクされた演算の場合に対応するレジスタ要素の演算を行うかどうかを決定します。

マスクされた演算については,第16.4.1 項第16.5節を参照してください。 ここでは,VMRの値を表示したり変更する方法だけを説明します。

VMRの1つまたは複数の要素(ビット)を検査するには,配列変数を検査する場合と同じ方法を使用します。 第4.2.3 項を参照してください。

たとえば,次のコマンドの出力は,VMRのビット5がセットされていることを示しています(Fortran 配列構文)。

     DBG> EXAMINE %VMR(5)
     0\%VMR(5):      1
     DBG>

次のコマンドは,VMRのビット4〜6の値を表示します。ビット4と5がセットされ, ビット6はクリアされます。

     DBG> EXAMINE %VMR(4:6)
     0\%VMR
         (4):        1
         (5):        1
         (6):        0
     DBG>

省略時の設定では,添字を指定せずにVMRを検査すると,デバッガはレジスタの値を16 進形式のクォドワード整数として表示します。その結果,出力表示のサイズを削減できます。 次に例を示します。

     DBG> EXAMINE %VMR
     0\%VMR
         (0):        0FFFFFFF FFFFFFFF
     DBG>

EXAMINE/BIN %VMRコマンドまたはEXAMINE %VMR(0:63)コマンドを指定すると,VMR の各ビットの値を64行の配列形式で表示できます。

配列変数を使用したときと同様に,VMRへの値の格納は一度に1ビットずつできます。 次に例を示します。

     DBG> EXAMINE %VMR(37)
     0\%VMR(37):      1
     DBG> DEPOSIT %VMR(37) = 0
     DBG> EXAMINE %VMR(37)
     0\%VMR(37):      0
     DBG>

DEPOSIT/QUADWORDコマンドを使用すると,クォドワード整数値を集合体全体に格納することもできます。 次に例を示します。

     DBG> DEPOSIT/QUADWORD %VMR = %HEX 0FFFFF
     DBG> EXAMINE %VMR
     0\%VMR
         (0):        00000000 000FFFFF
     DBG>

言語式でVMRの要素を指定する場合,VMRはビットの配列であることに注意してください。 そのため,まずCまたはBLISSなどのビット演算が可能な言語に一時的に設定しなければならないこともあります。 次に例を示します。

     DBG> SET LANGUAGE C
     DBG> DEFINE/VALUE K = 0
     DBG> FOR I=0 TO 63 DO (IF %VMR[I] == 1 THEN (DEF/VAL K = K + 1))

16.3.5 ベクタ・レジスタ(V0〜V15)の検査と値の格納

V0からV15までの16個のベクタ・レジスタがあります。各ベクタ・レジスタは番号0 から63が割り当てられた64個の要素を持っています。また,各要素は64 ビット(1クォドワード)から構成されます。

ベクタ・レジスタの1つまたは複数の要素を検査するには,配列変数の検査の場合と同じ方法を使用します( 第4.2.3 項を参照)。本項では,例にFortran配列構文を使用します。

     DBG> EXAMINE %V3              !V3 のすべての要素を検査する
     DBG> EXAMINE %V3(27)          !V3 の要素 27 の要素を検査する

     DBG> EXAMINE %V3(3:14)        !V3 の要素 3 から 14 までを検査
     する
     DBG> EXAMINE %V0(2),%V3(1:4)  !V0 の要素 2 と V3 の要素 1 から
      4 までを
                                        !検査する

レジスタ要素の値は,配列変数で使用するものと似た添字付き形式で表示されます。 たとえば,次のコマンドは,レジスタV1の要素1から3までの値を表示します。

     DBG> EXAMINE %V1(1:3)
     0\%V1
         (1):        3
         (2):      138
         (3):       51
     DBG>

ある範囲のベクタ・レジスタは検査できません。たとえば,次のコマンドは無効です。

     DBG> EXAMINE %V0:%V3
     DBG> EXAMINE %V2(7):%V3(12)

配列変数と同様に,値をベクタ・レジスタの1つだけの要素に一度に格納できます。 たとえば,次のコマンドは整数値8531をVOの要素9に格納します。

     DBG> DEPOSIT %V0(9) = 8531

ベクタ長レジスタ(VLR)の現在の値は,検査または格納できる最高のレジスタ要素を制限します( 第16.3.3項を参照) 。したがって,次のコマンドは同じ機能を持っています。

     DBG> EXAMINE %V1
     DBG> EXAMINE %V1(0:%VLR-1)

式0:%VLR-1は,VLRの現在の値によって示された範囲内のレジスタ要素を指定します。

省略時の設定では,デバッガはベクタ・レジスタの各要素をロングワード整数として扱い, 現在の基数で値を表示します。次に例を示します。

     DBG> EXAMINE %V3(27)
     0\%V3(27):      5983
     DBG> DEPOSIT %V3(27) = 3625
     DBG> EXAMINE %V3(27)
     0\%V3(27):      3625
     DBG>

ただし,ベクタ命令のコンテキストで調べられるレジスタ値(命令オペランド) は,その命令に適切なデータ型で表示されます。第16.4.1項を参照してください。

ベクタ・レジスタの要素の全(クォドワード)値をクォドワード整数として表示するには,EXAMINE/QUADWORD コマンドを使用します。同様に,クォドワード整数値をレジスタ要素に格納するには,DEPOSIT/QUADWORD コマンドを使用します。

また,EXAMINEコマンドやDEPOSITコマンドに関連した他の型の修飾子(たとえば/FLOAT) を使用すると,省略時の型を上書きできます。次に例を示します。

     DBG> EXAMINE %V5(2)
     0\%V5(2):      0
     DBG> EXAMINE/D_FLOAT %V5(2)
     0\%V5(2):      0.0000000000000000
     DBG>

言語式での集合体のデータ構造の使用に関する制限事項に従えば,言語式でレジスタ・ シンボルを使用できます(第4.1.6.1 項を参照)。たとえば,次の式は有効です(Fortran構文)。

     DBG> EVALUATE %V0(4) .EQ. %V1(4)

ただし,次の式は,2つ以上のレジスタ要素を指定しているので無効です。

     DBG> EVALUATE %V0 .EQ. %V1

16.4 ベクタ命令の検査と値の格納

ベクタ命令を操作する方法には,スカラ命令(第4.3 節を参照)で使用するもののほかに,次のようなベクタ命令に固有の方法もあります。

ベクタ命令を検査するか値を格納する場合,デバッガは適用される命令に従ってベクタ命令修飾子を正しく処理します。 次の表に,これらの修飾子の機能をまとめてあります。 使用法についての詳しい説明は, 『VAX MACRO and Instruction Set Reference Manual』を参照してください。

命令修飾子 説明
/U 浮動小数点アンダフロー(ベクタ浮動小数点命令)を使用可能にする。
/V 整数オーバフロー( ベクタ整数命令)を使用可能にする。
/M 意味を変更する(VLDx命令とVGATH x命令)。
/0 VMRビットが0の要素に対してだけマスクされた演算を実行する。
/1 VMRビットが1 の要素に対してだけマスクされた演算を実行する。

16.4.1 ベクタ命令とそのオペランドの検査

ベクタ命令のあるプログラム記憶位置を検査すると,デバッガはその命令をデコードし, 命令とそのオペランドをMACROアセンブラ形式に変換します。 ただし,次の制限事項があります。命令コードについての詳しい説明は『 VAX MACRO and Instruction Set Reference Manual』を参照してください。

EXAMINE/OPERANDS .%PCコマンドを使用すると現在のPC値の命令とそのオペランドを表示できます( 第4.3.1項を参照) 。ベクタ命令をこのコマンドを使用して検査すると,ベクタ・レジスタ・ オペランドの値が配列変数として表示されます。次に例を示します(Fortran 配列構文)。

     DBG> EXAMINE/OPERANDS .%PC
     PROG$MAIN\%LINE 81+19:      VSTL    V0,W^-572(FP),S^#4
     V0 contains:
             0\%V0(0):  137445504
             0\%V0(1):  137445504
             0\%V0(2):  137445504

          W^-572(FP) 2145991456 contains 2
     DBG>

スカラ命令の場合と同様に,オペランド値は,調べられた命令に適したデータ型で表示されます。

EXAMINE/OPERANDSコマンドを使用する場合,レジスタ要素の表示は次の要素によって異なります。

次の2つの例でこれを具体的に説明します。それぞれ,マスクされないレジスタ間の演算とマスクされたレジスタ間の演算を示しています。

次の例では,チェックした命令VVADDFがマスクされない演算を実行しており, そのためVMRの現在の値は関係ありません。0から5までのすべての要素が表示されています。

     DBG> EXAMINE %VLR
     0\%VLR: 6
     DBG> EXAMINE %VMR(0:5)
     0\%VMR
         (0):     1
         (1):     0
         (2):     1
         (3):     0
         (4):     1
         (5):     0
     DBG> EXAMINE/OPERANDS .%PC
     PROG$MAIN\%LINE 12:      VVADDF   V0,V1,V2
     V0 contains:
             0\%V0(0):  7.0000000
             0\%V0(1):  7.0000000
                 .
                 .
             0\%V0(5):  7.0000000
     V1 contains:
             0\%V1(0):  4.0000000
             0\%V1(1):  4.0000000
                 .
                 .
             0\%V1(5):  4.0000000
     V2 contains:
             0\%V2(0):  5.0000000
             0\%V2(1):  5.0000000
                 .
                 .
             0\%V2(5):  5.0000000
     DBG>

次の例では,同じVVADDF命令が,マスクされた演算を実行しています。命令修飾子/1 を指定すると,セットされたVMRビット(ビットの値が1)に一致している要素に対して演算を行います。

     DBG> EXAMINE %VLR
     0\%VLR: 6
     DBG> EXAMINE %VMR(0:5)
     0\%VMR
         (0):     1
         (1):     0
         (2):     1
         (3):     0
         (4):     1
         (5):     0
     DBG> EXAMINE/OPERANDS .%PC
     PROG$MAIN\%LINE 12:      VVADDF/1   V0,V1,V2
     V0 contains:
             0\%V0(0):  7.0000000
             0\%V0(2):  7.0000000
             0\%V0(4):  7.0000000
     V1 contains:
             0\%V0(0):  4.0000000
             0\%V0(2):  4.0000000
             0\%V0(4):  4.0000000
     V2 contains:
             0\%V0(0):  5.0000000
             0\%V0(2):  5.0000000
             0\%V0(4):  5.0000000
     DBG>

次の例では,マスクされた演算でデータをメモリからベクタ・レジスタにロードしています。

     DBG> EXAMINE %VLR
     0\%VLR: 6
     DBG> EXAMINE %VMR(0:5)
     0\%VMR
         (0):     1
         (1):     0
         (2):     1
         (3):     0
         (4):     1
         (5):     0
     DBG> EXAMINE/OPERANDS .%PC   【1】
     PROG$MAIN\%LINE 31+12:      VLDL/1   ARR+8,#4,V0   【2】
          PROG$MAIN\ARR(3) (address 1024) contains 35   【3】
     V0 contains:
             0\%V0(0):   0   【4】
             0\%V0(2):   0
             0\%V0(4):   0
     DBG> EXAMINE ARR(1:8)   【5】
     PROG$MAIN\ARR
         (1):     9
         (2):    17
         (3):    35
         (4):    73
         (5):    81
         (6):     6
         (7):     7
         (8):    49
     DBG>

次の番号は,上記の例の番号に対応しています。

【1】
EXAMINE/OPERANDSコマンドは,VLDL命令が実行されようとしていることを示す。 この命令は,図 16-1に示すように, 配列ARRのARR+8バイトで始まるロングワード整数データをレジスタV0 にロードする。図 16-1は, 命令が実行されたあとのV0 の内容を示している。配列ARRには,1からnまでの索引がついており,0 からn-1までの索引ではないことに注意する(Fortran 例)。
【2】
VLDL命令のストライド値(#4)は,配列要素の開始アドレス間のバイト数を指定する。
【3】
命令オペランドARR+8は,配列要素3 の開始点ARR(3)を示している。EXAMINE/OPERANDSコマンドは演算が行われる配列ARR の最初の要素だけを表示する(項目5を参照)。
【4】
VLRとVMRの現在の値から,VLDL命令は配列要素ARR(3),ARR(5), およびARR(7)の内容をそれぞれレジスタ要素V0(0),V0(2),およびV0(4) にロードする。EXAMINE/OPERANDSコマンドは,命令が実行される前のV0 の値を表示する。
【5】
参考として,EXAMINE ARR(1:8)コマンドは, ロード操作に関連したすべての範囲の配列要素を表示する。

図 16-1 メモリからベクタ・レジスタへの配列要素のマスクされたロード

16.4.2 ベクタ命令の格納

VAXスカラ命令を格納する方法は,ベクタ命令を格納する方法にも適用されます( 第4.3.2項を参照)。 たとえば,次のコマンドは現在のPCアドレスのマスクされたVVMULFベクタ命令を格納します。

     DBG> DEPOSIT/INSTRUCTION .%PC = "VVMULF/0 V2,V3,V7"

ベクタ命令を格納する場合,次のことにも注意してください。命令コードについての詳しい説明は『VAX MACRO and Instruction Set Reference Manual』を参照してください。

16.5 ベクタ・レジスタまたはベクタ命令を検査するときのマスクの使用方法

演算がベクタ・マスク・レジスタ(VMR)によってマスクされているかどうかにより,EXAMINE/OPERANDS .%PC コマンドがベクタ命令オペランドを表示する方法がどう変わるかは, 第16.4.1 項を参照してください。

本節では,任意のマスクを指定して,VMRの効果をシミュレートまたは上書きしたり, 次の結果を得る方法を説明します。

マスクは,EXAMINEコマンドとともに/TMASK修飾子または/FMASK修飾子を使用して指定します。


注意
次に,ベクタ・レジスタを検査するときの/TMASK 修飾子と/FMASK修飾子の使い方を説明します。他に指定しないかぎり, メモリ配列を検査する場合のこれらの修飾子の使用方法も同じです。

/TMASK修飾子を指定すると,EXAMINEコマンドは,セットされたマスク・ ビット(ビットの値は1)に対応したチェック済みレジスタの要素だけに適用されます。 これに対し,/FMASK修飾子を指定すると,EXAMINEコマンドはクリアされたマスク・ ビット(ビットの値は0)に対応した要素だけに適用されます。

VLRの現在の値は,検査できるベクタ・レジスタの最上位の要素を制限します。 ただし,VLRの値はメモリ内の配列の検査には影響しません。

/TMASK修飾子と/FMASK修飾子を使用すれば,マスクはマスク・アドレス式の形式で指定できますが省略することもできます。 詳しい説明は,次の項を参照してください。

16.5.1 省略時のマスクとしてのVMRの使用方法

省略時の設定では,EXAMINE/TMASKコマンドまたはEXAMINE/FMASKコマンドでマスクを指定しないと,VMR がマスクとして使用されます。すなわち, EXAMINEコマンドはセットされたVMRビット(/TMASKの場合)またはクリアされたVMR ビット(/FMASKの場合)に対応したベクタ・レジスタの要素だけに適用されます。

次の例では,VLRの値は6であり,VMR(0:VLR-1)の値は次のとおりです。

     DBG> EXAMINE %VMR(0:%VLR-1)
     0\%VMR
         (0):     1
         (1):     0
         (2):     1
         (3):     0
         (4):     1
         (5):     0
     DBG>

次のコマンドは,V3の値をマスクを使用しないで示します。V3の0からVLR-1 までのすべての要素が表示されます。

     DBG> EXAMINE %V3
     0\%V3
         (0):       17
         (1):      138
         (2):        3
         (3):        9
         (4):       51
         (5):      252
     DBG>

次のコマンドは,VMR(i)の値が1であるV3の要素(0からVLR-1) を表示します。

     DBG> EXAMINE/TMASK %V3
     0\%V3
         (0):       17
         (2):        3
         (4):       51
     DBG>

次のコマンドは,VMR(i)の値が0であるV3の要素(0からVLR-1 まで)を表示します。

     DBG> EXAMINE/FMASK %V3
     0\%V3
         (1):      138
         (3):        9
         (5):      252
     DBG>

次の例では,命令とそのベクタ・レジスタ・オペランドを検査するときに/FMASK 修飾子が使用されています。EXAMINE/OPERANDS/FMASKコマンドは,VMR( i)の値が0であるレジスタ・オペランド要素(0からVLR-1 まで)を表示します。

     DBG> EXAMINE/OPERANDS/FMASK .%PC
     PROG$MAIN\%LINE 341+16:  VVEQLL V0,V1
     V0 contains:
             0\%V0(1):  0
             0\%V0(3):  0
             0\%V0(5):  0

     V1 contains:
             0\%V1(1):  0
             0\%V1(3):  0
             0\%V1(5):  0
     DBG>

16.5.2 VMRの断面をマスクとして使用する方法

EXAMINE/TMASKコマンドまたはEXAMINE/FMASKコマンドでVMRの断面を指定すると, 次の規則に従って出力が表示されます。

16.5.3 VMR以外のマスクの使用方法

EXAMINE/TMASKコマンドまたはEXAMINE/FMASKコマンドでVMR以外のマスク・ アドレス式を指定すると,次の規則に従い,そのアドレスの値がマスクとして使用されます。

16.6 複合ベクタ・アドレス式の検査

EXAMINEコマンドを使用すると,各種の形式の複合アドレス式(あるアドレスからのバイト・ オフセットを含むアドレス式)を指定できます。たとえば,X が整変数であると,次のEXAMINEコマンドは,Xのアドレスから6バイト先の記憶位置に現在格納されている値を表示します。

     DBG> EXAMINE X + 6
     MOD3\X+6:  274903
     DBG>

本節で使用する例は,ベクタ化されたプログラムに適した形式の複合アドレス式を指定する方法を示しています。

次の例は,VSCATL命令の効果をチェックできる方法を示しています。ここに示す命令は,Fortran プログラムからデコードされたものです。

     DBG> EXAMINE %VLR
     0\%VLR: 5
     DBG> EXAMINE/OPERANDS .%PC   【1】
     PROG1$MAIN\%LINE 9+32: VSCATL   V7,W^-804(R11),V9
     V7 contains:
             0\%V7(0):  11   【2】
             0\%V7(1):  13
             0\%V7(2):  15
             0\%V7(3):  17
             0\%V7(4):  19

          W^-804(R11)PROG1$MAIN\ARRX(1) (address 1820) contains 0   【3】
     V9 contains:
             0\%V9(0):  0   【4】
             0\%V9(1):  8
             0\%V9(2):  16
             0\%V9(3):  24
             0\%V9(4):  32
     DBG> SHOW SYMBOL/TYPE ARRX   【5】
     data PROG1$MAIN\ARRX
      array descriptor type, 1 dimension, bounds: [1:200], size: 800 bytes
      cell type: atomic type, longword integer, size: 4 bytes
     DBG> EXAMINE ARRX(1) + .%V9(0:%VLR-1)   【6】
     PROG1$MAIN\ARRX(1):       0
     PROG1$MAIN\ARRX(3):       0
     PROG1$MAIN\ARRX(5):       0
     PROG1$MAIN\ARRX(7):       0
     PROG1$MAIN\ARRX(9):       0
     DBG> STEP/INSTRUCTION   【7】
     stepped to PROG1$MAIN\%LINE 9+40: MOVZBL   I^#64,AP
     DBG> EXAMINE ARRX(1) + .%V9(0:%VLR-1)   【8】
     PROG1$MAIN\ARRX(1):       11
     PROG1$MAIN\ARRX(3):       13
     PROG1$MAIN\ARRX(5):       15
     PROG1$MAIN\ARRX(7):       17
     PROG1$MAIN\ARRX(9):       19
     DBG>

次の番号は,上記の例の番号に対応しています。

【1】
EXAMINE/OPERANDSコマンドは,VSCATL命令が実行されようとしていることを示す。 この命令は,ロングワード整数(4バイト)のデータをレジスタV7 からメモリ記憶位置に転送する。これらの記憶位置は,レジスタV9 に含まれるオフセット値を基底アドレスに追加することで決定される。
【2】
レジスタV7には,メモリに転送するロングワード整数値が入っている。
【3】
VSCATL命令に対するオペランドとして指定された基底アドレスは,ARRX(1) のようにシンボル化されている。 ARRX(1)は配列ARRXの要素1を表している。
【4】
レジスタV9には, メモリ内の各ターゲット・ベクタ要素の基底アドレスからのバイト単位のオフセットが入っている。
【5】
SHOW SYMBOL/TYPEコマンドは,ARRX が連続したロングワード整数の配列であることを示す。
【6】
EXAMINEコマンドは,メモリ内のターゲット・ベクタ要素の値を表示する。 指定されたアドレス式は,レジスタV9に入っているオフセット値を使用して, メモリ内の連続したベクタ要素の開始アドレスを,基底アドレスであるARRX(1) からの相対値として設定する。デバッガは,配列ARRX の要素に対してメモリ内のベクタ要素の記憶位置をシンボル化する。この例では, ベクタ要素が8バイト置きに開始し,配列ARRXの要素と1つ置きに対応している。VSCATL 命令はまだ実行されていないので,メモリ内のベクタ要素の値はどれも0 である。
【7】
STEP/INSTRUCTIONコマンドはVSCATL 命令を実行し,次の命令MOVZBLで実行を中断する。
【8】
6の項目と同様に,EXAMINEコマンドはメモリ内のターゲット・ベクタ要素の値を表示する。 ここで,メモリの内容が,値がレジスタV7から転送されていることを示す。

次の例は,EXAMINEコマンドでもう少し複雑なベクタ・アドレス式を指定する方法を示しています。

配列ARRZが連続したクォドワード整数(8バイト)要素を持っているものとします。 例の4つめのEXAMINEコマンドは,メモリ内の要素ARRZ(1)で始まるベクタ要素の値を表示します。 先の例の場合と同様に,デバッガはベクタ要素の記憶位置を配列要素でシンボル化します。 一連のベクタ要素の, ARRZ(1)に対する相対記憶位置は,レジスタV1とレジスタV3に入っている値を加えて求め, 特定の要素に対する結合オフセットを指定します。ベクタ要素が表示される順番は, 最初に指定されたレジスタ(V1)の各値に関して, 最後に指定したレジスタ (V3(0:2))のすべての値を振り当てる形になります。 この例では,すべてのベクタ要素の値が0です。

     DBG> EXAMINE %VLR
     0\%VLR: 4
     DBG> EXAMINE %V1
     0\%V1
          (0):        0
          (1):        4
          (2):        8
          (3):       12
     DBG> EXAMINE %V3
     0\%V1
          (0):        0
          (1):        8
          (2):       16
          (3):       24
     DBG> EXAMINE ARRZ(1) + .%V1(0:3) + .%V3(0:2)
     PROG4$MAIN\ARRZ(1):       0    ! ARRZ(1)+0+0
     PROG4$MAIN\ARRZ(2):       0    ! ARRZ(1)+0+8
     PROG4$MAIN\ARRZ(3):       0    ! ARRZ(1)+0+16
     PROG4$MAIN\ARRZ(1)+4:     0    ! ARRZ(1)+4+0
     PROG4$MAIN\ARRZ(2)+4:     0    ! ARRZ(1)+4+8
     PROG4$MAIN\ARRZ(3)+4:     0    ! ARRZ(1)+4+16
     PROG4$MAIN\ARRZ(2):       0    ! ARRZ(1)+8+0
     PROG4$MAIN\ARRZ(3):       0    ! ARRZ(1)+8+8
     PROG4$MAIN\ARRZ(4):       0    ! ARRZ(1)+8+16
     PROG4$MAIN\ARRZ(2)+4:     0    ! ARRZ(1)+12+0
     PROG4$MAIN\ARRZ(3)+4:     0    ! ARRZ(1)+12+8
     PROG4$MAIN\ARRZ(4)+4:     0    ! ARRZ(1)+12+16
     DBG>

16.7 ベクタ浮動小数点例外の結果の表示

ベクタ命令がベクタ要素内で浮動小数点例外を生成すると,例外結果がデスティネーション・ レジスタの対応する要素にエンコードされます。

このような場合,EXAMINE/FLOATコマンドを使用すると,関連したレジスタ要素にデコードした例外メッセージが表示されます。 この方法を使用すると, 第16.8節に示すとおりに実行要求をまだ保留している浮動小数点例外を識別できます。 次の例は,ベクタ命令がレジスタV5 の要素2の浮動小数点ゼロ除算例外を生成したことを示しています。

     DBG> EXAMINE/FLOAT %V5
     0\%V5
          (0):   297.2800
          (1):   87.41499
          (2):   Reserved operand, encoded as floating divide by zero
          (3):   173.8650
     DBG>

プログラムがベクタ・レジスタの値をメモリにコピーすれば,ベクタ・ レジスタの場合と同様に,デコードされた情報を表示するためにEXAMINE /FLOATコマンドをそのメモリ記憶位置に適用できます。

次の表にベクタ浮動小数点例外ごとにデコードされたデバッガ・メッセージを示します。

例外 デバッガ・メッセージ
浮動小数点アンダフロー 予約オペランド。 浮動小数点アンダフローとしてエンコードされる。
浮動小数点ゼロ除算 予約オペランド。 浮動小数点ゼロ除算としてエンコードされる。
浮動小数点予約オペランド 予約オペランド。浮動小数点予約オペランドとしてエンコードされる。
浮動小数点オーバフロー 予約オペランド。浮動小数点オーバフローとしてエンコードされる。

16.8 スカラとベクタの同期化の制御

高い性能を達成するため,VAXのスカラ型プロセッサとベクタ型プロセッサはできるだけ並行して稼働します。 スカラ型プロセッサは,すべてのベクタ命令をベクタ型プロセッサに渡し, スカラ命令の実行を続けます。その間にベクタ型プロセッサはベクタ命令を実行しています。

場合によっては,2つのプロセッサの動作の同期をとらなければならないことがあります。 正しいプログラムの実行結果を得るには,SYNC, MSYNC,およびVSYNCなどの同期化命令を使用することにより,プログラムが特定の動作を完了させてからでないと, 他の動作を開始しないようにします。 これらの命令とスカラとベクタの同期化についての詳しい説明は『VAX MACRO and Instruction Set Reference Manual』を参照してください。

プログラムがコンパイラ(たとえば,DEC Fortranコンパイラ)によってベクタ化されると, 必要な同期化命令が自動的に生成されます。ただし, MACROのプログラマは同期化命令を明示的に作成しなければなりません。

省略時の設定では,デバッガはプログラム(内部目的で実行しているものを除く) の実行中は,スカラとベクタの同期化を行いません。プログラムはデバッガの制御を受けていないかのように実行し, 同期化はプログラムによって完全に制御されています。 この省略時の動作モードは,SET VECTOR_MODE NOSYNCHRONIZEDコマンドによって設定されます。

デバッガを省略時の非同期化モードで使用すると,プログラムの実行がブレークポイント, ウォッチポイント,またはSTEPコマンドの完了時に中断されたときに, 特定のベクタ動作が割り込みをかけられた状態になることがあります。 次に例を示します。

このような場合に混乱しないようにするには,SYNCHRONIZE VECTOR_MODE コマンドを入力します。このコマンドは,スカラ型プロセッサとベクタ型プロセッサをただちに同期化します。 このコマンドを入力するのは,実行が一時停止しているプログラム内の記憶位置でSYNC 命令とMSYNC命令を入力するのと同じことです。 これは,次のような効果があります。

次のMACRO例は,SYNCHRONIZE VECTOR_MODEコマンドの機能を示しています。

     DBG> STEP   【1】
     stepped to .MAIN.\SUB\%LINE 99
         99:         VVDIVD  V1,V0,V2
     DBG> STEP   【2】
     stepped to .MAIN.\SUB\%LINE 100
        100:         CLRL    R0
     DBG> EXAMINE/FLOAT %V2   【3】
     0\%V2
         [0]:        13.53400
         [1]:        Reserved operand, encoded as floating divide by zero
         [2]:        247.2450
        .
        .
        .
     DBG> SYNCHRONIZE VECTOR_MODE   【4】
     %SYSTEM-F-VARITH, vector arithmetic fault, summary=00000002,
                       mask=00000004, PC=000002E1, PSL=03C00010
     break on unhandled exception preceding .MAIN.\SUB\%LINE 100
        100:         CLRL    R0
     DBG>

次の番号は,上記の例の番号に対応しています。

【1】
このSTEP コマンドは,プログラムの実行をVVDIVD命令が実行される直前の行99 で中断する。この例では,命令が浮動小数点ゼロ除算例外を発生するものと想定する。
【2】
このSTEPコマンドは,VVDIVD命令を実行する。 ただし,プログラムの実行中に,この時点では例外の実行要求は行われない。
【3】
EXAMINE/FLOATコマンドは,デコードされた例外メッセージをデスティネーション・ レジスタV2の要素1に表示する(第16.7節を参照)。 その結果,浮動小数点ゼロ除算例外が発生し, 実行要求が保留になっていることを確認する。
【4】
SYNCHRONIZE VECTOR_MODEコマンドは,保留中のベクタ例外を即座に実行するように要求する。 プログラムがベクタ・プロセッサのハードウェアでなくVVIEF を使用している場合は,異なる診断メッセージが発行されることがあるので注意する。

SYNCHRONIZE VECTOR_MODEコマンドを使用する代わりに,SET VECTOR_MODE SYNCHRONIZEDコマンドを入力すると,同期化ベクタ・モードでデバッガを稼働することもできます。 このコマンドを使用すると,デバッガは,ベクタ命令が実行されるたびに, スカラ型プロセッサとベクタ型プロセッサ間の同期を自動的にとります。 また,ベクタ命令を実行するたびにそのあとでSYNC 命令を実行し,さらにメモリにアクセスするベクタ命令を実行したあとでMSYNC 命令を実行します。その結果,次のように同期化の対象となっているベクタ命令に関連したすべての処理が終了します。

次の例は,SET VECTOR_MODE SYNCHRONIZEDコマンドを上記の例で使用したのと同じ命令ストリーム上で実行した場合の影響を示しています。

     DBG> SHOW VECTOR_MODE
     Vector mode is nonsynchronized
     DBG> SET VECTOR_MODE SYNCHRONIZED   【1】
     DBG> SHOW VECTOR_MODE
     Vector mode is synchronized
     DBG> STEP   【2】
     stepped to .MAIN.\SUB\%LINE 99
         99:         VVDIVD  V1,V0,V2
     DBG> STEP   【3】
     %SYSTEM-F-VARITH, vector arithmetic fault, summary=00000002,
                       mask=00000004, PC=000002E1, PSL=03C00010
     break on unhandled exception preceding .MAIN.\SUB\%LINE 100
        100:         CLRL    R0
     DBG>

次の番号は,上記の例の番号に対応しています。

【1】
SET VECTOR_MODE SYNCHRONIZEDコマンドを使用すると,ベクタ命令が実行されるたびに, デバッガはスカラ型プロセッサとベクタ型プロセッサの自動同期化を指示する。
【2】
このSTEPコマンドはVVDIVD命令が実行される直前の行99 でプログラムの実行を中断する。前の例と同様に,命令が浮動小数点ゼロ除算例外を発生したものとみなす。
【3】
このSTEP コマンドがVVDIVD命令を実行し,この命令が例外を発生する。デバッガは同期化ベクタ・ モードで動作中であるので,ベクタ例外の実行要求が直ちに行われる。

SYNCHRONIZE VECTOR_MODEやSET VECTOR_MODE SYNCHRONIZEDのほかにも, 同期化に影響を及ぼすデバッガ・コマンド(SET WATCHなど)がいくつかあります。

16.9 プログラムのベクタ状態に影響を与えることがある呼び出しルーチン

CALLコマンドとともに/[NO]SAVE_VECTOR_STATE修飾子を指定すると,ベクタ型プロセッサの現在の状態を保存し, ルーチンが呼び出されたときに復元するかどうかを制御できます。

VAXベクタ・プロセッサの状態は,次のもので決まります。

CALLコマンドを使用してルーチンを実行すると,ルーチンの実行により, ベクタ・プロセッサの状態が次の動機により変化することがあります。

CALL/SAVE_VECTOR_STATEコマンドは,CALLコマンドを実行する前に存在したベクタ型プロセッサの状態を, 呼び出したルーチンの実行が完了したあとにデバッガが復元することを指定します。 その結果,呼び出したルーチンの実行が完了したあとに次の各項が確認されます。

CALL/NOSAVE_VECTOR_STATEコマンドは省略時の設定であり,CALLコマンドが実行される前に存在したベクタ型プロセッサの状態は, 呼び出したルーチンの実行が完了したあとに復元しないことを指定します。 この場合,ルーチン呼び出し後のベクタ型プロセッサの状態は, 呼び出したルーチンの影響によって異なります。

/[NO]SAVE_VECTOR_STATE修飾子は,VAX汎用(スカラ)レジスタには影響しません。 これらのレジスタの値は必ず保存され,CALLコマンドでルーチンを実行すると復元されます。

16.10 画面モードでのベクタ・レジスタ・データの表示

画面モードでは,レジスタ表示がVAX汎用レジスタの現在の値を示します。 第7.4.5項を参照してください。

ベクタ・レジスタまたはベクタ制御レジスタに入っているデータを画面モードで表示するには,DO 表示を使用します。第7.2.1項を参照してください。

たとえば,次のコマンドは,V2_DISPというDO表示を作成します。これは, レジスタV2の要素4から7までの内容を示します(Fortran配列構文)。 この表示は,プログラムからデバッガに制御が戻るたびに,自動的に更新されます。

     DBG> DISPLAY V2_DISP AT RQ2 DO (EXAMINE %V2(4:7))

16.11 問題点と制限事項

この節では,ベクタ化されたプログラムに対するデバッガのサポートについて, 問題と制限事項をまとめます。


[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]