Changes between Version 15 and Version 16 of CALプログラミング(3)


Ignore:
Timestamp:
Mar 22, 2009 1:24:35 PM (16 years ago)
Author:
nakasato
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • CALプログラミング(3)

    v15 v16  
    6767}}} 
    6868 
    69 ここで、"r4.x"をループカウンタとして、"r4.w"をループの上限値として使っている。これはC言語で書くと以下のような処理に相当する: 
     69ここで、!r4.xをループカウンタとして、!r4.wをループの上限値として使っている。これはC言語で書くと以下のような処理に相当する: 
    7070{{{ 
    7171while(1) { 
     
    7575}}} 
    7676 
    77 "ige"の行は、r4.xとr4.wの大小を比較して、"r4.x >= r4.w"が成り立っているならば、r2.xにTRUEがセットされる(詳しくはil.pdfの43ページを参照のこと。以下同様)。 
     77"ige"の行は、!r4.xと!r4.wの大小を比較して、"!r4.x >= !r4.w"が成り立っているならば、!r2.xにTRUEがセットされる(詳しくはil.pdfの43ページを参照のこと。以下同様)。 
    7878 
    79 "break_logicalnz r2.x"は、r2.xが0でないならば、今のループを終了する。TRUEは0ではないので、"ige"でTRUEがセットされていたら、このループが終了する。この2命令を合わせて、C言語のほうのif文に相当することになる。 
     79"break_logicalnz !r2.x"は、!r2.xが0でないならば、今のループを終了する。TRUEは0ではないので、"ige"でTRUEがセットされていたら、このループが終了する。この2命令を合わせて、C言語のほうのif文に相当することになる。 
    8080 
    81 "iadd"文は、単純に整数の加算である。r4.zは整数値1として初期化されているので、r4.xをインクリメントすることになる。 
     81"iadd"文は、単純に整数の加算である。!r4.zは整数値1として初期化されているので、!r4.xをインクリメントすることになる。 
    8282 
    8383= 配列データのランダムアクセス = 
    84 これまで、データの読み込みには、"dcl_input_interp"命令で得たindex pair("v0.xy")を使ってきた。これは、kernelプログラムが実行される論理プロセッサごとに、別々のindex pairが割り振られる。実際には、index pairの値は(0.0, 0.0)からはじまる浮動小数点値の組である(と思われる)。 
     84これまで、データの読み込みには、"dcl_input_interp"命令で得たindex pair(v0.xy)を使ってきた。これは、kernelプログラムが実行される論理プロセッサごとに、別々のindex pairが割り振られる。実際には、index pairの値は(0.0, 0.0)からはじまる浮動小数点値の組である(と思われる)。 
    8585  
    86 今のプログラムにおいて、id=0のリソースは、CAL_FORMAT_FLOAT_1で1次元のメモリとして宣言したので、C言語の配列で書くとすると、"float array[256]"と同等である。このリソースの任意の場所をCALのプログラムで読み込むためには、"sample_resource"命令に適切なindex pairを与えればよい。具体的には以下のようになる: 
     86今のプログラムにおいて、id=0のリソースは、CAL_FORMAT_FLOAT_1で1次元のメモリとして宣言したので、C言語の配列で書くとすると、"float array![256]"と同等である。このリソースの任意の場所をCALのプログラムで読み込むためには、"sample_resource"命令に適切なindex pairを与えればよい。具体的には以下のようになる: 
    8787{{{ 
    8888array[0] -> (0.0, 0.0) 
     
    9393array[255] -> (255.0, 0.0) 
    9494}}} 
    95  実際には、今の場合リソースが1次元として宣言されているのでyのほうの値は無視される。 
    9695 
    97 "prog.il"の16行では、r1.xがindexとして指定されている。この値は8行で0.0に初期化されており、19行で1.0が足されている。よって、このループで19行が実行される度に、r1.xは0.0,1.0, 2.0...と増加していくことになる。結果として、r1.xで指定された場所から、r0.xにid=0のリソースから値が読み込まれることになる。読み込まれた値は、17行において"r3.x"と足し合わされ、合計が計算される。 
     96実際には、今の場合リソースが1次元として宣言されているのでyのほうの値は無視される。 
     97 
     98"prog.il"の16行では、!r1.xがindexとして指定されている。この値は8行で0.0に初期化されており、19行で1.0が足されている。よって、このループで19行が実行される度に、!r1.xは0.0,1.0, 2.0...と増加していくことになる。結果として、!r1.xで指定された場所から、!r0.xにid = 0のリソースから値が読み込まれることになる。読み込まれた値は、17行においてr3.xと足し合わされ、合計が計算される。 
    9899 
    99100= 動作のまとめ = 
    100 以上の動作をまとめると、このkernelプログラムは「id=0のリソースを先頭から順番に10回読み込んでその合計を計算する」という動作になる。 
     101以上の動作をまとめると、このkernelプログラムは「id=0のリソースを先頭から順番に10回読み込んでその合計を計算する」という動作になる。この処理が、論理的なプロセッサ上で並列に実行される。 
    101102 
    102103なお、ループ回数の10は、"prog.il"の6行のw成分で指定されている。今、"hello.cpp"では、この入力メモリに1から256までの値をいれているので、計算結果は55となる。