| 75 | |
| 76 | = 配列データのランダムアクセス = |
| 77 | * これまで、データの読み込みには、"dcl_input_interp"命令で得たindex pair("v0.xy")を使ってきた。これは、kernelプログラムが実行される論理プロセッサごとに、別々のindex pairが割り振られる。実際には、index pairの値は(0.0, 0.0)からはじまる浮動小数点値の組である(と思われる)。 |
| 78 | |
| 79 | * 今のプログラムにおいて、id=0のリソースは、CAL_FORMAT_FLOAT_1で1次元のメモリとして宣言したので、C言語の配列で書くとすると、"float array[256]"と同等である。このリソースの任意の場所をCALのプログラムで読み込むためには、"sample_resource"命令に適切なindex pairを与えればよい。具体的には以下のようになる: |
| 80 | {{{ |
| 81 | array[0] -> (0.0, 0.0) |
| 82 | array[1] -> (1.0, 0.0) |
| 83 | array[2] -> (2.0, 0.0) |
| 84 | ... |
| 85 | array[254] -> (254,0, 0.0) |
| 86 | array[255] -> (255.0, 0.0) |
| 87 | }}} |
| 88 | 実際には、今の場合リソースが1次元として宣言されているのでyのほうの値は無視される。 |
| 89 | |
| 90 | * "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"と足し合わされ、合計が計算される。 |
| 91 | |
| 92 | = 動作のまとめ = |
| 93 | * 以上の動作をまとめると、このkernelプログラムは「id=0のリソースを先頭から順番に10回読み込んでその合計を計算する」という動作になる。 |
| 94 | |
| 95 | * なお、ループ回数の10は、"prog.il"の6行のw成分で指定されている。今、"hello.cpp"では、この入力メモリに1から256までの値をいれているので、計算結果は55となる。 |
| 96 | |
| 97 | = 課題 = |