9. University of Tokyo
9/29
ペアリストとBookkeeping法 (1/2)
相互作用ペアリスト
カットオフ距離以内にある相互作用原子ペアを探す
全探索するとO(N^2)となるので、空間をセルに区切ってO(N)に落とす
空間をセルに切る
原子をセルに登録する
セル内、隣接セルで相互作用ペアを探索する
セルの大きさは、相互作用が次近接のセルに届かないようにとる
16. University of Tokyo
16/29
xmmレジスタは倍精度実数二つ分保持できるが、下位64bitを普段使いに使う
double func(double a, double b){
return a+b;
}
func(double, double):
addsd %xmm1, %xmm0
ret
ソース
アセンブリ
関数の引数のdoubleは、順番にxmm0,xmm1に値を入れる
返り値がdoubleの時はxmm0に値を入れる
(xmmレジスタの下位64bitだけ使う)
浮動小数点演算
整数演算
int func(int a, int b){
return a+b;
}
func(int, int):
addl %esi, %eax
ret
※ 実際にはlealが使われる
ソース
アセンブリ
関数の引数のint(32bit)は、順番にeax, esi, edx, ecx, ...に値を入れる
返り値がintの時はeaxに値を入れる
x86レジスタ (3/3)
17. University of Tokyo
17/29
Lennard-Jonesの力計算 (1/2)
V (r) = 4 r 12
r 6
f(r) =
48
r13
24
r7
r
dx
dy
ポテンシャル
力
力積
Ix = f ?
dx
r
? dt ? df ? dx
df =
?
48
r14
24
r8
◆
dt
ここをまとめる
計算したい量
~r = (dx, dy, dz)相対座標
r = |~r|相対距離
19. University of Tokyo
19/29
力計算の単純SIMD化 (1/2)
ナイーブな実装
?qi
x qi
x
以下、SIMDベクトルレジスタをハットで表現する
?qj
x qj
xqj+1
xqj+2
xqj+3
x
qi+1
xqi+2
xqi+3
x
4つの座標データをymmレジスタにロードする
4つの座標データをymmレジスタにロードする
※ y, zも同様
※ y, zも同様
?dx = ?qj
x ?qi
x
?r2 = ?dx
2
+ ?dy
2
+ ?dz
2
あとは同様に計算することで、4対の粒子間の力を同時に計算できる
20. University of Tokyo
20/29
相互作用粒子のインデックスは連続ではない
→ 4つのデータをバラバラにロード
D
C
B
A
D
C
B
A
メモリ
レジスタ
D
C
B
A
A
メモリ
xmm0
D
C
B
A
B
A
メモリ
xmm0
vmovsd
vmovhpd
D
C
B
A
C
メモリ
D
C
B
A
D
C
メモリ
vmovsd
vmovhpd
B
A
ymm0
xmm1
xmm1
D
C
D
C
xmm1
(1) Aをxmm0下位にロード
(2) Bをxmm0上位にロード
(3) Cをxmm1下位にロード
(4) Dをxmm1上位にロード
(5) xmm1全体をymm0上位128bitにコピー
vinsertf128
実際に起きること
問題点
※ これをx,y,z座標それぞれでやる
※ データの書き戻しも同様
力計算の単純SIMD化 (2/2)
※ vgatherdpdでなんとかできるかもしれないが???
21. University of Tokyo
21/29
やったこと
データを粒子数*4成分の二次元配列で宣言
double q[N][4], p[N][4];
z
y
x
z
y
x
メモリ
z
y
x
0
1
2
z
y
x
3
粒子番号
うれしいこと
(x,y,z)の3成分のデータをymmレジスタに一発ロード
ただし、1成分(64bit) は無駄になる
z
y
x
z
y
x
メモリ
z
y
x
0
1
2
z
y
x
3
粒子番号
z
y
x
movupd/movapd
ymm0
力計算のSIMD化 (1/5)
24. University of Tokyo
24/29
力の計算(1ペア) cont.
dx2dy2
dz2
dx2
dx2
dy2
dz2
dy2
dz2
相対ベクトルの自乗を並び替える
全部足す
r2
r2
r2
力の計算(4ペア)
これを4つのペアについて行う
r2
A
r2
B
r2
C
r2
D
r2
Ar2
A
r2
Br2
B
r2
Cr2
C
r2
Dr2
D
r2
Ar2
A r2
Cr2
C
r2
Br2
B r2
Dr2
D
unpacklpd
vshufpd
r2
Ar2
C r2
Br2
D
あとは4ペア同時に力の計算ができる
vpermpd
力計算のSIMD化 (4/5)
25. University of Tokyo
25/29
力積の書き戻し
dfAdfBdfCdfD
dfAdfAdfAdfA
~pi = ~pi df ? ~dq
dxAdyAdzA
(1) Aペアの力だけ取り出す
vpermpd
dfAdfAdfAdfApi
xpi
ypi
z pi
x
pi
ypi
z=
-
×
(2) 運動量をロード
(3) 力積ベクトルの計算
pi
xpi
ypi
z
pi
xpi
ypi
z
メモリ
ymmレジスタ
(4) 運動量の書き戻し
pi
xpi
ypi
z
pi
xpi
ypi
z
メモリ
ymmレジスタ
これを4ペアについて行う
vfnmadd213pd
vmovupd
vmovupd
力計算のSIMD化 (5/5)