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