Changes between Version 7 and Version 8 of CALプログラミング(4)


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

--

Legend:

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

    v7 v8  
    11= N体計算 = 
    2  * ここまでの説明を理解することで、最もシンプルなN体計算プログラムを作成できるはずである 
     2 * ここまでの説明を理解することで、最もシンプルなN体計算プログラムを作成できると思う 
    33 
    44 * 具体的にはGRAPEなどと同じように、ホストから粒子の位置と質量をGPUに送り、GPU上で全粒子間で互いに及ぼし合う力を足しあわせて、結果として加速度を得るようなプログラムである。粒子間に働く力がニュートン重力の場合は、[http://galaxy.u-aizu.ac.jp/trac/note/attachment/wiki/CALによるGPUプログラミング/CAL200808.pdf  CAL200808.pdf] (60ページ以降)で説明しているIL kernelプログラムとなる。ループの部分のみを再掲すると、以下のようなものである。 
    55{{{ 
    6 whileloop  
    7   ige r88.x___, r100.x, r77.x  
    8   break_logicalnz r88.x  
    9   sample_resource(0)_sampler(0) r0, r2  
    10   sub r5.xyz, r0.xyz, r4.xyz            
    11   dp4 r6, r5, r5  
    12   rsq r7, r6  
    13   mul r8, r7, r7.xyz1   
    14   mul r8, r8, r7.xyz1   
    15   mul r9, r8, r5.xyz1  
    16   mad r3, r9, r0.w, r3  
    17   add r2.x___, r2.x, l1.x  
    18   iadd r100.x___, r100.x, l0.z  
    19   umod r101.x, r100.x, r77.y  
    20   if_logicalz r101.x  
    21   add r2.0y, r2.0y, l1.x  
    22   endif  
    23 endloop  
     6 1  whileloop 
     7 2    ige r88.x___, r100.x, r77.x 
     8 3    break_logicalnz r88.x 
     9 4    sample_resource(0)_sampler(0) r0, r2 
     10 5    sub r5.xyz, r0.xyz, r4.xyz 
     11 6    dp4 r6, r5, r5 
     12 7    rsq r7, r6 
     13 9    mul r8, r7, r7.xyz1 
     1410    mul r8, r8, r7.xyz1 
     1511    mul r9, r8, r5.xyz1 
     1612    mad r3, r9, r0.w, r3 
     1713    add r2.x___, r2.x, l1.x 
     1814    iadd r100.x___, r100.x, l0.z 
     1915    umod r101.x, r100.x, r77.y 
     2016    if_logicalz r101.x 
     2117      add r2.0y, r2.0y, l1.x 
     2218    endif 
     2319  endloop 
    2424}}} 
    2525  
    2626 * データ構造の定義の詳細についてはファイルを参照のこと。 
    2727 
    28  * このILプログラムは、基本構造は(3)と同じであるが、ポインタ変数(ここでは"r2.xy")の処理が異なる。なぜかというと、粒子の座標が格納されているid = 0のリソースは2次元のメモリとして宣言されているからである。具体的には、ホスト側のプログラムで以下のようにメモリの宣言をおこなった: 
     28 * このILプログラムは、基本構造は(3)と同じであるが、ポインタ変数(ここでは"r2.xy")の処理が異なる。なぜかというと、粒子の座標が格納されているid = 0のリソースは2次元のメモリとして指定、確保されているからである。具体的には、ホスト側のプログラムで以下のようにメモリの確保をおこなった: 
    2929{{{ 
    30 XXXXX 
     30  calResAllocLocal2D(&inputRes, device, nx, ny,  CAL_FORMAT_FLOAT_4, 0); 
    3131}}} 
    3232 
    33  * こうする大きな理由は、XXにより1次元のメモリとして確保した場合、その次元には8192までという制限があるためである。よって、CAL_FORMAT_FLOAT_4の場合であっても、最大で32k個のデータしか扱うことができない。 
     33 * こうする大きな理由は、"calResAllocLocal1D"により1次元のメモリとして確保した場合、その次元の最大値は8192までという制限があるためである。よって、上のILプログラムの場合には、1粒子のデータとして4要素のfloatと変数を使っているので、1次元メモリで単純にN体計算を実装すると8192粒子までの粒子しか扱うことができない。これでは実質的に利用価値がなく、実際にベンチマークテストをしてみると、この粒子数ではRV770の性能を引き出すことができない。 
    3434 
    35 = 次元配列 = 
    36  
     35= 2次元配列 = 
     36 *