Changes between Version 15 and Version 16 of CALプログラミング(3)
- Timestamp:
- Mar 22, 2009 1:24:35 PM (16 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
CALプログラミング(3)
v15 v16 67 67 }}} 68 68 69 ここで、 "r4.x"をループカウンタとして、"r4.w"をループの上限値として使っている。これはC言語で書くと以下のような処理に相当する:69 ここで、!r4.xをループカウンタとして、!r4.wをループの上限値として使っている。これはC言語で書くと以下のような処理に相当する: 70 70 {{{ 71 71 while(1) { … … 75 75 }}} 76 76 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ページを参照のこと。以下同様)。 78 78 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文に相当することになる。 80 80 81 "iadd"文は、単純に整数の加算である。 r4.zは整数値1として初期化されているので、r4.xをインクリメントすることになる。81 "iadd"文は、単純に整数の加算である。!r4.zは整数値1として初期化されているので、!r4.xをインクリメントすることになる。 82 82 83 83 = 配列データのランダムアクセス = 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)からはじまる浮動小数点値の組である(と思われる)。 85 85 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を与えればよい。具体的には以下のようになる: 87 87 {{{ 88 88 array[0] -> (0.0, 0.0) … … 93 93 array[255] -> (255.0, 0.0) 94 94 }}} 95 実際には、今の場合リソースが1次元として宣言されているのでyのほうの値は無視される。96 95 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と足し合わされ、合計が計算される。 98 99 99 100 = 動作のまとめ = 100 以上の動作をまとめると、このkernelプログラムは「id=0のリソースを先頭から順番に10回読み込んでその合計を計算する」という動作になる。 101 以上の動作をまとめると、このkernelプログラムは「id=0のリソースを先頭から順番に10回読み込んでその合計を計算する」という動作になる。この処理が、論理的なプロセッサ上で並列に実行される。 101 102 102 103 なお、ループ回数の10は、"prog.il"の6行のw成分で指定されている。今、"hello.cpp"では、この入力メモリに1から256までの値をいれているので、計算結果は55となる。