wiki:CALプログラミング(4)

Version 6 (modified by nakasato, 16 years ago) (diff)

--

N体計算

  • ここまでの説明を理解することで、最もシンプルなN体計算プログラムを作成できるはずである。
  • 具体的にはGRAPEなどと同じように、ホストから粒子の位置と質量をGPUに送り、GPU上で全粒子間で互いに及ぼし合う力を足しあわせて、結果として加速度を得るようなプログラムである。粒子間に働く力がニュートン重力の場合は、CAL200808.pdf (60ページ以降)で説明しているIL kernelプログラムとなる。ループの部分のみを再掲すると、以下のようなものである。
    whileloop 
      ige r88.x___, r100.x, r77.x 
      break_logicalnz r88.x 
      sample_resource(0)_sampler(0) r0, r2 
      sub r5.xyz, r0.xyz, r4.xyz           
      dp4 r6, r5, r5 
      rsq r7, r6 
      mul r8, r7, r7.xyz1  
      mul r8, r8, r7.xyz1  
      mul r9, r8, r5.xyz1 
      mad r3, r9, r0.w, r3 
      add r2.x___, r2.x, l1.x 
      iadd r100.x___, r100.x, l0.z 
      umod r101.x, r100.x, r77.y 
      if_logicalz r101.x 
      add r2.0y, r2.0y, l1.x 
      endif 
    endloop 
    

  • データ構造の定義の詳細についてはファイルを参照のこと。
  • このILプログラムは、基本構造は(3)と同じであるが、ポインタ変数(ここでは"r2.xy")の処理が異なる。なぜかというと、粒子の座標が格納されているid = 0のリソースは2次元のメモリとして宣言されているからである。具体的には、ホスト側のプログラムで以下のようにメモリの宣言をおこなった:
  • こうする大きな理由は、XXにより1次元のメモリとして確保した場合、その次元には8192までという制限があるためである。よって、CAL_FORMAT_FLOAT_4の場合であっても、最大で32k個のデータしか扱うことができない。

2次元配列