Changes between Version 8 and Version 9 of CALプログラミング(3)


Ignore:
Timestamp:
Mar 22, 2009 3:31:29 AM (16 years ago)
Author:
nakasato
Comment:

--

Legend:

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

    v8 v9  
     1= ループの例 = 
    12 * 何か役立つ計算をおこなうためには、ループ処理が必須となる。CALでループ処理を実装してみよう。 
    23 
     
    2526 以下、個々の点について詳しく説明する。 
    2627 
    27 == 定数について == 
     28= 定数について = 
    2829 * 初級のプログラムでは、浮動小数点整数をホストプログラムから転送していたが、CALでは定数値を直接プログラム中で利用することもできる。今回のプログラムでは"l0"と"l1"という定数値が5-6行で定義されている。 
    2930{{{ 
     
    5051 これらはループ処理とデータの読み込みに利用される。詳細は以下で説明する。 
    5152 
    52 == ループについて == 
     53= ループについて = 
    5354 * CALでのループの実現には、色々な方法があるが、ここでは"whileloop"文を利用する。これは、"whileloop"と"endloop"に挟まれた命令列を永久に実行するという命令文である。よって、無限ループを終わらせる処理を自前で書く必要がある。必要な部分だけを抜き出すと以下のようなCALプログラムがループのひな形となる: 
    5455{{{ 
     
    7273 
    7374 * "iadd"は、単純に整数の加算である。"r4.z"は"1"として初期化されているので、"r4.x"をインクリメントすることになる。 
     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{{{ 
     81array[0] -> (0.0, 0.0) 
     82array[1] -> (1.0, 0.0) 
     83array[2] -> (2.0, 0.0) 
     84 ... 
     85array[254] -> (254,0, 0.0) 
     86array[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= 課題 =