PDF - KEK

整数演算方式による超多倍長演算
日時:平成26年3月7日(金) 11:00 ~11:30
会場:工学院大学 新宿校舎 28階 第4会議室
高エネルギー加速器研究機構
濱口信行
1.はじめに
2.整数演算方式の多倍長演算の作成方法
2.1 加減算
2.2 乗算
2.3 具体例
3.ヒルベルト行列Hを用いた連立一次方程式の求解の例
4.量子モンテカルロ法による物性スペクトル計算への適用例
5.おわりに
1.はじめに
整数演算方式とは浮動小数点演算を符号部,指数部,仮数部に
分け整数演算、論理演算およびシフト演算を使用して行う方式
で、FORTRAN言語で作成しています。
倍精度変数を複数個つなげて,既存の倍精度演算を使って4倍
精度,8倍精度浮動小数点演算が行われているのに、わざわざ
整数演算方式を取る理由とは?
現在の倍精度のデータ形式は1985年に制定されたもので、
当時の最高性能の計算機が1GFLOPsに届くかどうか,メモリは
仮想空間が16MBから2GBに移行中で,TOP500の前身の
リンパックレポートではチューニングを競うサイズは
1000元(所要メモリ8MB)の時代です。
その時代から約30年近く経っていますのでプログラムの規模も、
内容も大きくかつ複雑になり、当時は充分な仕様でもやはり問題
がでてきます。
問題は2つあり,仮数部のビット数不足,指数部のビット数不足
(表現できる数値範囲の狭さ)がありますが取られている対策
は仮数部のビット数不足のみです。4倍精度データに関し
2008年に新しく規定が改定されているにも関わらず
(指数部のビット数が11ビットから15ビットに拡張)多くの
計算機でハードウエア命令がサポートされていません。
この様な理由から整数演算方式を使用するようにしました。
作成自体が難しいと考えられるかもしれませんが、私自身
特にFORTRAN言語の教育は学生時代の教養課程で森口繁一
先生のJIS FORTRAN7000を受けた程度でメーカー時代は
特にありませんので皆さんの基礎知識があれば充分こなせる
ものと思います。
私自身が既存の方式で経験した問題は以下の様なものです。
1.ループ積分で仮想光子(本来質量0のものに計算上微小な質量
を与える)の 質量の値を小さくすると,精度の良い結果が
得られない。
2.全球スペクトルモデルで高解像度になると、ルジャンドル陪関数の
テーブル 作成や極付近の計算精度に支障をきたした。
3.量子モンテカルロ法による物性スペクトル計算を解析の際
(プログラムは高エネルギー加速器研究機構 岩野氏より提供
されました)
日常温度やそれ以下の温度で計算する必要があるのに、357Kと
いう高温で表現できる数値範囲の制限によりオーバーフローが
発生した。
更に細かいところでは,ヒルベルト行列の条件数を求めるのにサイズ
Nが200近くなると計算出来なかった等々があります。
2.整数演算方式の多倍長演算の作成方法
加減算,乗算,除算,平方根計算を考えた場合,
除算は逆数と乗算に分け,逆数計算の初期値を
平方根計算は初期値を既存の4倍精度演算を
使用して反復法で求める事ができます。
この事から整数演算方式の多倍長演算作成は
加減算,乗算の作成に帰着されます。
加減算,乗算は符号部と指数部と仮数部に
分けそれぞれ整数演算、論理演算,シフト演算を使用します。
注意する点は、以下の1点のみです。
整数演算では,正または0の演算にして
結果も正または0になる様にする必要があります。
多倍長整数演算(大きな整数の演算 )は, 既に市販の書物
にも書かれています。 今回は整数型 4バイト変数 (i 4)の30
ビット, 整数型8バイト変数 (i8)の60ビットを使用するように
しています。これから 仮数部のビット数が 60の倍数となる
精度演算作成が適している事になります。
作成に必要な共通処理としては
1.引数を30ビット,60ビット配列に展開する 処理。
2.30ビット,60ビット配列に展開され た結果から浮動小数点
数を作成する。
3.丸め処理
があり,
加減算ではc  a  bをic   (ia  ib)に分ける
処理と桁合わせ処 理
更に減算では ia  ibとなる様にするという条件と、
桁落ち数を求める処理が加わります。
2.1加減算
浮動小数点数は符号部1ビット,指数部15ビット,
仮数部mビットとします。
まず多倍長整数演算を行うための場合分けと,指数部の差を
求めます。
多倍長整数演算では丸めを考慮し,加算m+1ビット,減算m+2ビット
演算を行います。
2つの浮動小数点数a,bの加減算は,正整数(a>b) のa+b,a-bに
帰着されます。また,a=0,b=0なら,符号変換等で演算できます。
a=bの場合は,指数部の更新及び,0とする事ができます。
加減算の場合分け
a,bの条件
a>b>0
b>a.>0
a>0>b,a>|b|
a>0>b,a<|b|
b>0>a,b>|a|
b>0>a,b<|a|
0>a>b
0>b>a
ia
ia=a
ia=b
ia=a
ia=-b
ia=b
ia=-a
ia=-b
ia=-a
ib
ib=b
ib=a
ib=-b
ib=a
ib=-a
ib=b
ib=-a
ib=-b
c=a+b
ia+ib
ia+ib
ia-ib
ー(ia-ib)
ia-ib
ー(ia-ib)
ー(ia+ib)
ー(ia+ib)
c=a-b
ia-ib
ー(ia-ib)
ia+ib
ia+ib
ー(ia+ib)
ー(ia+ib)
ia-ib
ー(ia-ib)
ここで引数を60ビットのみ使用する整数型8バイトの配列に入れます。
多倍長整数演算は8バイト整数演算を行います。
c  a ' b' でc  2 m  2 なら桁上がり1。
c  2 m  2 なら桁上がりなし 。
c  a ' b' でc  2 m  2 なら桁下がりなし 。
2 m 1  c  2 m  2 なら桁下がり1.
2 m  c  2 m 1 なら桁下がり 2
c  2 m .なら何桁桁下がりがあるか計算する
必要があ ります。(左から最初の1が現れるビット位置を求めます)
2.2.乗算
ここで引数を30ビット使用する整数型4バイトの配列に入れ
ます。
a , bは 2 m  仮数部として多倍長整数乗算を行います。
4バイト整数を8バイト整数に代入して8バイト整数乗算
を行います。(整数乗算の結果が負にならないため)
c  a  b でc  2 2 m 1 なら桁上がり1.c  2 2 m 1 なら桁上がりなし。
指数部の計算は符号部を除いた15ビットの整数加算で行います。
符号部はa , bの符号部のexclusive orを取ります。
2.3 具体例
まず使用したメモを紹介します。規則性がみてとれると思います。
超多倍長精度演算
作成メモ
精度
仮数部ビット数
R16宣言
I8宣言
I4宣言
i4*i4宣言
i4*i4先頭
i4*i4最下位
用途
精度の保持
呼ぶ側の宣言
加減算用
乗算用
整数乗算
桁上がりの有無
丸め位置
8
240
a(2)
ix(5)
ix(9)
iz(18)
iz(17)
iz(9)
68
2160
a(17)
ix(37)
ix(73)
iz(146)
iz(145)
iz(73)
精度 8  60  k (k  0,1,2,3,4,5,6,7,8)
仮数部のビット数 精度  32  16
R16宣言数  精度 / 4 kとk  1の差15
I8宣言数  仮数部のビット数 / 60  1 kとk  1の差32
I4宣言数  仮数部のビット数 / 30  1 kとk  1の差64
I4  I4宣言数  I4宣言数  2 kとk  1の差128
I4  I4先頭  I4  I4宣言数  1 kとk  1の差128
I4  I4最下位  I4宣言数 kとk  1の差64
128
4080
a(32)
ix(69)
ix(137)
iz(274)
iz(273)
iz(137)
188
6000
a(47)
ix(101)
ix(201)
iz(402)
iz(401)
iz(201)
248
7920
a(62)
ix(133)
ix(265)
iz(530)
iz(529)
iz(265)
308
9840
a(77)
ix(165)
ix(329)
iz(658)
iz(657)
iz(329)
368
428
488
11760
13680
15600
a(92)
a(107)
a(122)
ix(197) ix(229) ix(261)
ix(393) ix(457) ix(521)
iz(786) iz(914) iz(1042)
iz(785) iz(913) iz(1041)
iz(393) iz(457) iz(521)
次ぎに128倍精度演算作成時のメモを紹介します。
加算の配列代入
integer*4 a(128) =>integer*8 ix(69)
ix(69)
ix(68)
ix(67)
ix(66)
ix(65)
ix(64)
ix(63)
ix(62)
ix(61)
ix(60)
ix(59)
2+a(128)(15:15)
a(128)(0:14) a(127)(17:31)
a(126)(0:18) a(125)(21:31)
a(124)(0:22) a(123)(25:31)
a(122)(0:26) a(121)(29:31)
a(120)(1:30)
a(119)(0:2) a(118)(5:31)
a(117)(0:6) a(116)(9:31)
a(115)(0:10) a(114)(13:31)
a(113)(0:14) a(112)(17:31)
a(111)(0:18) a(110)(21:31)
a(127)(0:16) a(126)(19:31)
a(125)(0:20) a(124)(23:31)
a(123)(0:24) a(122)(27:31)
a(121)(0:28) a(120)(31:31)
a(120)(0:0) a(119)(3:31)
a(118)(0:4) a(117)(7:31)
a(116)(0:8) a(115)(11:31)
a(114)(0:12) a(113)(15:31)
a(112)(0:16) a(111)(19:31)
a(110)(0:20) a(109)(23:31)
ix(66)からix(59)までのパターンを7回繰り返す。
ix(58) a(109)(0,22)
ix(50) a(94)(0,22)
ix(42) a(79)(0,22)
ix(34) a(64)(0,22)
ix(26) a(49)(0,22)
ix(18) a(34)(0,22)
ix(10) a(19)(0,22)
あまり部分
ix(2) a(4)(0:22) a(3)(25:31) a(3)(0:24) a(2)(27:31)
ix(1) a(2)(0:26) a(1)(29:31) a(1)(0:28)
8倍精度演算では繰り返し部分を削除し前後をつなげれば良い。
ix(5)
ix(4)
ix(3)
ix(2)
ix(1)
2+a(8)(15:15)
a(8)(0:14) a(7)(17:31)
a(6)(0:18) a(5)(21:31)
a(4)(0:22) a(3)(25:31)
a(2)(0:26) a(1)(29:31)
a(7)(0:16) a(6)(19:31)
a(5)(0:20) a(4)(23:31)
a(3)(0:24) a(2)(27:31)
a(1)(0:28)
減算の配列代入
integer*4 a(128) =>integer*8 ix(69)
ix(69)
ix(68)
ix(67)
ix(66)
ix(65)
ix(64)
ix(63)
ix(62)
ix(61)
ix(60)
ix(59)
4+a(128)(14:15)
a(128)(0:13) a(127)(16:31)
a(126)(0:17) a(125)(20:31)
a(124)(0:21) a(123)(24:31)
a(122)(0:25) a(121)(28:31)
a(120)(0:29)
a(119)(0:1) a(118)(4:31)
a(117)(0:5) a(116)(8:31)
a(115)(0:9) a(114)(12:31)
a(113)(0:13) a(112)(16:31)
a(111)(0:17) a(110)(20:31)
a(127)(0:15) a(126)(18:31)
a(125)(0:19) a(124)(22:31)
a(123)(0:23) a(122)(26:31)
a(121)(0:27) a(120)(30:31)
a(119)(2:31)
a(118)(0:3) a(117)(6:31)
a(116)(0:7) a(115)(10:31)
a(114)(0:11) a(113)(14:31)
a(112)(0:15) a(111)(18:31)
a(110)(0:19) a(109)(22:31)
ix(66)からix(59)までのパターンを7回繰り返す。
ix(58) a(109)(0,21)
ix(50) a(94)(0,21)
ix(42) a(79)(0,21)
ix(34) a(64)(0,21)
ix(26) a(49)(0,21)
ix(18) a(34)(0,21)
ix(10) a(19)(0,21)
あまり部分
ix(2) a(4)(0:21) a(3)(24:31) a(3)(0:23) a(2)(26:31)
ix(1) a(2)(0:25) a(1)(28:31) a(1)(0:27)
8倍精度演算では繰り返し部分を削除し前後をつなげれば良い。
ix(5)
ix(4)
ix(3)
ix(2)
ix(1)
4+a(8)(14:15)
a(8)(0:13) a(7)(16:31)
a(6)(0:17) a(5)(20:31)
a(4)(0:21) a(3)(24:31)
a(2)(0:25) a(1)(28:31)
a(7)(0:15) a(6)(18:31)
a(5)(0:19) a(4)(22:31)
a(3)(0:23) a(2)(26:31)
a(1)(0:27)
乗算の配列代入
integer*4 a(128) =>integer*4 ix(137)
ix(137)
ix(136)
ix(135)
ix(134)
ix(133)
ix(132)
ix(131)
ix(130)
ix(129)
ix(128)
ix(127)
ix(126)
ix(125)
ix(124)
ix(123)
ix(122)
ix(121)
1
a(128)(0:15)
a(127)(0:17)
a(126)(0:19)
a(125)(0:21)
a(124)(0:23)
a(123)(0:25)
a(122)(0:27)
a(121)(0:29)
a(120)(2:30)
a(120)(0:1)
a(119)(0:3)
a(118)(0:5)
a(117)(0:7)
a(116)(0:9)
a(115)(0:11)
a(114)(0:13)
a(127)(18:31)
a(126)(20:31)
a(125)(22:31)
a(124)(24:31)
a(123)(26:31)
a(122)(28:31)
a(121)(30:31)
a(119)(4:31)
a(118)(6:31)
a(117)(8:31)
a(116)(10:31)
a(115)(12:31)
a(114)(14:31)
a(113)(16:31)
ix(136)からix(121)までのパターンを7回繰り返す。
ix(120)
ix(104)
ix(88)
ix(72)
ix(56)
ix(40)
ix(24)
a(113)(0:15)
a(98)(0:15)
a(83)(0:15)
a(68)(0:15)
a(53)(0:15)
a(38)(0:15)
a(23)(0:15)
あまり部分
ix(8)
ix(7)
ix(6)
ix(5)
ix(4)
ix(3)
ix(2)
ix(1)
a(8)(0:15)
a(7)(0:17)
a(6)(0:19)
a(5)(0:21)
a(4)(0:23)
a(3)(0:25)
a(2)(0:27)
a(1)(0:29)
a(7)(18:31)
a(6)(20:31)
a(5)(22:31)
a(4)(24:31)
a(3)(26:31)
a(2)(28:31)
a(1)(30:31)
8倍精度演算では繰り返し部分を削除し,ix(9)=1とあまり
の部分となります。
桁上がりと丸め位置
加減算:integer*8 iz(69)
加算:iz(69)が4以上 桁上がりあり。
仮数部iz(1)(2)~iz(69)(1) 丸め位置 iz(1)(1)
加算:iz(69)が3 以下 桁上がりなし。
仮数部iz(1)(1)~iz(69)(0) 丸め位置 iz(1)(0)
減算:iz(69)が4以上
仮数部iz(1)(2)~iz(69)(1)
減算:iz(69)が2または3
仮数部iz(1)(1)~iz(69)(0)
減算:iz(69)が1
仮数部iz(1)(0)~iz(68)(59)
桁下がりなし。
丸め位置 iz(1)(1)
桁下がりあり。1ビット
丸め位置 iz(1)(0)
桁下がりあり。2ビット
丸めなし。
別処理が必要
減算:iz(69)が0 桁下がりあり。
仮数部iz(1)(1)~iz(68)(59) 可変
丸めなし
乗算
integer*4 ix(137),iy(137),iz(274)
ix(i)*iy(j)
iz(i+j) 上位30ビット
iz(I+j-1) 下位30ビット
iz(274)は常に0となる。
乗算:iz(273)が2以上 桁上がりあり。
仮数部iz(137)(1)~iz(273)(0)
丸め位置 iz(137)(0)
乗算:iz(273)が2未満 桁上がりなし。
仮数部iz(137)(0)~iz(272)(29)
丸め位置 iz(136)(29)
桁合わせ
i=l/60
J=l-60*i
i=0 nooperation
i≧1
do m=1,69-i
iy(m)=iy(m+i)
end do
do m=69-i+1,69
iy(m)=0
end do
l:指数部の差から得られたシフト数
iand の引数はinteger*8で,ishftの引数はinteger*4で
J=0 nooperation
j ≧1
do m=1,68-i
iy(m)=ishft(iy(m),-j)+ishft(iand(iy(m+1),2**j-1),60-j)
end do
iy(69-i)=ishft(iy(69-i),-j)
減算でiz(69)=0の場合
iz (l ) 1  l  68 で最初に1となるビット位置m
桁下がり数 2  (68  l )  60  (60  m)
l  68 nooperatio n
l  67
do n  l ,1,1
iz (n  68  l )  iz ( n)
end do
do n  1,68  l
iz (n)  0
end do
iz(68)=iand(iz(68),2**m-1)
do n=68,2,-1
iz(n)=ishft(iand(iz(n),2**m-1),60-m)
+iand((ishft(iz(n-1),-m),2**(60-m)-1)
end do
iz(1)=ishft(iand(iz(1),2**m-1),60-m)
整数型8バイトの詰め込み
integer*8
iz(68)=>iz(64)
以下のマスクを準備しておく。
integer*8 ip4,ip8,ip12,ip16,ip20,ip24,ip32,
c
ip36,ip40,ip44,ip48,ip52,ip56,ip60
data
data
:
:
data
data
ip4/z000000000000000f/
ip8/z00000000000000ff/
ip56/z00ffffffffffffff/
ip60/z0fffffffffffffff/
乗算の場合は結果の仮数部をinteger*4 izz(136)に入
れた後、2要素組みでinteger*8 iz(68)に入れておきます。
iz(1)=ior(iz(1),ishft(iand(iz(2),2**4-1),60))
iz(2)=ior(ishft(iz(2),-4),ishft(iand(iz(3),2**8-1),56))
iz(3)=ior(ishft(iz(3),-8),ishft(iand(iz(4),2**12-1),52))
iz(4)=ior(ishft(iz(4),-12),ishft(iand(iz(5),2**16-1),48))
iz(5)=ior(ishft(iz(5),-16),ishft(iand(iz(6),2**20-1),44))
iz(6)=ior(ishft(iz(6),-20),ishft(iand(iz(7),2**24-1),40))
iz(7)=ior(ishft(iz(7),-24),ishft(iand(iz(8),2**28-1),36))
iz(8)=ior(ishft(iz(8),-28),ishft(iand(iz(9),2**32-1),32))
iz(9)=ior(ishft(iz(9),-32),ishft(iand(iz(10),2**36-1),28))
iz(10)=ior(ishft(iz(10),-36),ishft(iand(iz(11),2**40-1),24))
iz(11)=ior(ishft(iz(11),-40),ishft(iand(iz(12),2**44-1),20))
iz(12)=ior(ishft(iz(12),-44),ishft(iand(iz(13),2**48-1),16))
iz(13)=ior(ishft(iz(13),-48),ishft(iand(iz(14),2**52-1),12))
iz(14)=ior(ishft(iz(14),-52),ishft(iand(iz(15),2**56-1),8))
iz(15)=ior(ishft(iz(15),-56),ishft(iand(iz(16),2**60-1),4))
iz(1)~iz(15)のパターンを3回繰り返す。
iz(61)=ior(iz(65),ishft(iand(iz(66),2**4-1),60))
iz(62)=ior(ishft(iz(66),-4),ishft(iand(iz(67),2**8-1),56))
iz(63)=ior(ishft(iz(67),-8),ishft(iand(iz(68),2**12-1),52))
iz(64)=iand(ishft(iz(68),-12),2**48-1)
準備したマスクを
使用する
3.ヒルベルト行列Hを用いた連立一次方程式の求解の例
1
ヒルベルト行列H ij 
(1  i, j  n )
i  j 1
を用いてHx  b x  (1,1,......,1)
T
となる様にbを定めこの方程式を解き
得られたHy  bから max
(
abs
(
y
(
i
)

1
))
を
1i  n
T
求めます。
nは大と仮定して条件数を以下の近似式
として結果をチェックしています。 ヒルベルト行列の条件数
1
ヒルベルト行列H ij 
(1  i, j  n )
i  j 1
(n  i  1)!(n  j  1)!
1
i j
逆行列H ji  (1)
(i  j  1)[(i  1)!( j  1)!] 2 (n  i)!(n  j)!
1
1
H ijのノルムは1   ......  nが大とすると,
2
n
ln(n )     0.57721566490153286060 (オイラー数 )
1
逆行列H ji のノルムを | H ji
1
| の最大値とします。
またnは大として、スターリングの公式n!~
2 e  n n
逆行列の絶対値Pは変形して,
(n  i)!(n  j)!i 2 j2
P
(n  i)(n  j)(i  j  1)[i! j!] 2 (n  i)!(n  j)!
n
1
2
を使用します。
i  an, j  bnとすると,
a 2 b 2 n 2 ((1  a )n )!((1  b)n )!
P
((a  b)n  1)(1  a )(1  b)[(an )!(bn )!] 2 ((1  a )n )!((1  b)n )!
1 a 1 b
1  a (1a ) n 1  b (1 b ) n 1  a 2 an 1  b 2 bn
1 a 1 b

(
)
(
)
(
) (
)
2
1 b
a
b
(1  a )(1  b)((a  b)n  1)4 1  a
ab
Pはaとbに対して対称より, a  bとすると、
a2
1  a 2 (1a ) n 1  a 4 an
P
(
)
(
)
2
2
a
(1  a )(2an  1)4 1  a
1  a (1a ) 1  a 2 a
1 a2
f (a )  ln[(
)
(
) ]とするとf ' (a )  ln( 2 )
1 a
a
a
0.5  a  0.75ではf (a )はa 
0.5  0.7071で最大となります。
i  an, j  bnが整数となる事から, a  0.7とします。
するとPmax 
0.0243 17 2.8 n 17 0.6 n
0.0243 1.530979 n
( ) ( )

10
1.4n  1 7
3
1.4n  1
ヒルベルト行列の条件数
n
条件数
(ビット数表示) 400
2022
450
2276
500
2530
550
2785
600
3039
650
3293
700
3547
750
3801
800
4056
850
4310
900
4564
950
4818
1000
5072
1050
5327
1100
5581
1150
5835
1200
6089
1250
6344
1300
6598
1350
6852
1400
7106
1450
7361
1500
7615
128倍精度
有効ビット数 4081
188 倍精度
有効ビット数
6001
248 倍精度
有効ビット数 7921
実測結果は以下の様になっています。
ヒルベルト行列の精度
N
最大誤差
400
500
600
700
800
1000
1100
1400
1.014E-621
1.681E-467
1.321E-314
1.349E-161
7.603E-009
1.013E-280
4.211E-127
1.013E-245
精度
128倍精度
128倍精度
128倍精度
128倍精度
128倍精度
188倍精度
188倍精度
248倍精度
最大誤差のビット数  有効ビット数  条件数のビット数
となってい ます。
248倍精度演算ではN  1400が使用できるメモリ容量の
上限となっ ています。
超多倍長演算での精度
N=100でのヒルベルト行列計算
精度
308
368
428
488
488
条件数0.127E+152
ビット数501
有効ビット数
理論値
2.80E-2812
2.52E-3390
2.66E-3968
2.80E-4546 (注)
2.80E-4546
9841
11761
13681
15601
15601
誤差
実測
4.73E-2814
3.38E-3392
1.61E-3971
5.36E-4198
1.00E-4547
(注)逆数計算で4倍精度の初期値から7回反復した場合の値
308,368,428倍精度は7回反復,488倍精度は8回反復が
必要
ヒルベルト行列のN=400の実行時間一覧表
方式
浮動型
浮動型
浮動型
整数型
整数型
整数型
整数型
精度
64倍精度
96倍精度
128倍精度
68倍精度
128倍精度
188倍精度
248倍精度
x5570
540.603
1551.696
3467.115
179.059
652.896
1235.567
2125.342
単位: 秒
e5430
743.938
2165.918
4280.500
277.818
918.142
1945.560
3337.811
32倍精度変数をつなげる方式に比べ,
整数演算方式の性能が非常に良くなっています。
超多倍長精度での性能
N=100でのヒルベルト行列計算
精度
実行時間 (秒)
x5570
e5430
308
50.298
81.123
368
70.468 115.572
428
95.133 156.090
488
123.216 205.238
488
123.253 205.404
反復回数7回
反復回数の増加の影響はほとんどありません。
4.量子モンテカルロ法による物性スペクトル計算への適用例
量子モンテカルロ法による物性スペクトル計算を数値計算的に言えば
サイズ NのL個の行列 B1 , B2 ,......,B Lから L  1個の行列を定め
G m  ( Bm Bm 1 .......B1 B0 )[I  B L B L 1 ......B1 ] 1 (0  m  L, B0  I )
L  1個のグリーン関数 Tr (G m ) (Tr : 行列のトレース )の値を求める事
となります。
行列積B m B m 1 .......B1をそのまま計算すると桁落ちが大きいので、
行列積計算をQDR分解を用いて計算します。QDR分解とは,
行列Vをグラムシュミットの直交化でV=QR’
(Q:直交行列,R’:上三角行列)
にして,R’の対角要素からなる行列DとR’=DRとなるR
(上三角行列で対角要素は1)からV=QDRと分解する事
を言います。
計算の方法は以下の様になります。
( S. R. White et al, PRB 40, 506 (1989) が提案)
B m B m 1 ......B1を
B1  Q1D1R1 '
'
''
B 2 Q1  Q 2 D 2 R 2 B 2 B1  Q 2 D 2 R 2 D1R1  Q 2 D 2 D1 R 2 R1  Q 2 D 2 R 2
''
:
:
''
B m Q m 1  Q m D m R m
''
B m B m 1 ......B1  QDR
で計算します。
また[I  B L B L 1 ........B1 ] 1 は
B L B L 1 ........B1  Q1 D1 R 1とするQDR分解で
D1  Q1 R 1
T
1
 Q 2 D 2 R 2 を求めI  B L B L 1 ........B1  Q1Q 2 D 2 R 2 R 1
とQDR分解が出来ます。このとき
[I  B L B L 1 ........B1 ] 1  R 1 D 1Q 1  R 1 D 1Q T と演算量も削減されます。
Dは対角行列なので通常はベクトル(1次元配列)に収められます。
今回扱ったケースは静的かつ規則的なパス
Si
m
 ( 1) m に対するものでパラメ ータt 0 , N, L,
, Uのうち, t 0  1, U  10, N  100, L  448と固定。
(ここで, t 0 は電子のホッピング , Uは電子間クーロン
斥力に関連するパラメ ータでNは粒子数を表わして
います。)
G m : グリーン関数
U
L 1

), E ( m ) | Tr ( G m ) | として
L
2
L
1
E (0)  E ( L)  1, E (
) 
で結果の検証を行いました。
2
P
P  e Q (Q 
 の値は10000 /  が絶対温度(K )での温度を表わしています。
以前は倍精度変数を複数個つなげる方式では
  28でオーバーフロー, 整数演算方式で
32倍精度演算で  250,32倍精度変数を 2つつなげた
64倍精度演算で  600まで正しく計算できていました。
今まで扱った量子モンテカルロ法による物性スペクトル計算
ではB L ......B1  QDRとし ( I  QDR ) 1 を求めるのに,
D  Q T R 1  Q' D' R ' とQDR分解し,
Q( D  Q T R 1 ) R  QQ' D' R ' R  Q' ' D' ' R ' '  I  QDRから
逆行列を求めます。
U L  1
(
))とすると,
L
2
1
結果の絶対値の最小値は ,  が小さいので
P
Dの最大数はP 2 となり, グラムシュミット法で
P  e Q (Q 
平方数の和の平方根を求めるため,
プログラムに現れる最 大数はP 4 となります。
今回は扱う が大きいので条件数は / Lの大きさに依存
する度合いが大きくなります。
これは, B L ......B1  QDRとし ( I  QDR ) 1 を求める過程で
D  Q T R 1のQDR分解の際オーバーフロ ーが発生する事に
現れます。
正確には, b 
a1  a 2
2
2
 ......  a n の計算の際
2
a i  a i の計算でオーバーフロ ーが発生します。
これを防ぐには, a max  絶対値最大値 (a i , i  1,2,...., n )
として, b | a max |  c1  c 2
2
2
 .....  c n (c i 
2
ai
)
a max
とします。これで更に 大きな で計算出来る様になりましたが,
 / Lの値も大きくなりますので、正しい答えので る
 の最大数における, D' ' の最大数S,
Se
 UL 
としてその影響を調査しました。
調査ではN  20, U  10, L  448と固定しています。
これは, 実行時間短縮とN  20で正しい結果が得られる場合は
N  100でも正しい結果が得られている事によります。
調査結果
条件 N  20, U  10, L  448
精度
68倍精度
128倍精度
188倍精度
248倍精度
308倍精度
β の最大数
732
1620
2590
3609
3776
最大値
2.518D+1287
7.778D+2441
6.198D+3593
6.580D+4745
6.591D+4930
α
1.64
2.09
2.43
2.72
2.76
368倍精度では308倍精度と同じく、β=3776では正しく
計算出来ていて,β=3777では結果が不正となっている事か
ら308倍精度の結果が限界を示していると言えます。
368倍精度演算で正しく計算されている例
n=
20
l=
448
beta, dt= 3776.00000000000000000000000000000
8.42857142857142857142857142857143
u, t0= 10.0000000000000000000000000000000
1.00000000000000000000000000000000
fac= 9.18072515031978755045201686537202
For denominator: mstep=
1
For green func: mstep2=
1
ispin=
1
QDR = 6.993199813124998895732748089737576E+4922
I+QDR= 6.993199813124998895732748089737576E+4922
ispin=
2
QDR = 6.591017770912797832925133116465994E+4930
I+QDR= 6.591017770912797832925133116465994E+4930
0.0000000000D+00
0.1879571429D+04
0.1888000000D+04
0.1896428571D+04
0.3776000000D+04
-0.1000000000D+01
-0.7381849773-890
-0.1520746834-893
-0.7381849773-890
-0.1000000000D+01
368倍精度演算でも正しく計算されてない例
n=
20
l=
448
beta, dt= 3777.00000000000000000000000000000
8.43080357142857142857142857142857
u, t0= 10.0000000000000000000000000000000
1.00000000000000000000000000000000
fac= 9.18194073789880841037203642516443
For denominator: mstep=
1
For green func: mstep2=
1
ispin=
1
QDR = 8.886250347365217688103022558980503E+4923
I+QDR= 8.886250347365217688103022558980503E+4923
ispin=
2
QDR = 8.395584469058393694708873673477994E+4931
I+QDR= 3.111402625840683560090283433225110E+4770
0.0000000000D+00
0.1880069196D+04
0.1888500000D+04
0.1896930804D+04
0.3777000000D+04
-0.4999999997D+00
-0.4586860821-890
-0.7614617438-894
-0.2814546226-890
-0.5000000000D+00
パラメータ領域拡大結果
測定結果一覧
x5570
測定条件 N  100, U  10, L  448
と絶対温度Kとの関係
絶対温度(K )  10000 / 
β
精度
730
1600
2500
10000/3
3770
68倍精度
128倍精度
188倍精度
248倍精度
308倍精度
絶対値最小値
実測値
0.824D-384
0.170D-582
0.773D-728
0.292D-840
0.156D-893
理論値
0.269D-383
0.214D-582
0.462D-728
0.978D-841
0.397D-894
実行時間
(秒)
57642
185097
403155
673631
975735
この条件では,32倍精度  250(絶対温度40K )
から,68倍精度で13.7 K ,128倍精度で 6.26K
188倍精度で 4K ,248倍精度で3K ,308倍精度
で 2.65Kまでパラメータ領域が 拡大されました。
これ以上の演算精度を用いても改善はされま せんの
でこの値が限界と言えます。
5.おわりに
整数演算方式を用いる事により,量子モンテカルロ法による
物性スペクトル計算において既存の方式では357Kまでしか
計算できなかったが、2.65Kまで計算可能とパラメータ領域を
拡大できました。また、ソースステップ数も8倍精度演算で1000
ステップ,その他の精度演算で1500ステップと作成作業
及びデバッグ作業まで一人で扱える範囲となりました。
今後さらにパラメータ領域を広げたり複雑なケースを扱うには
指数部の拡張が必要であり、現在、修正量ができるだけ少なく、
効率的に作業が行える方式を検討中です。
なお、これらの情報の更新は3か月毎にHPCI戦略5の
高性能計算の扉 http://www.jicfus.jp/field5/jp/promotion
で行っています。
最後にプログラムを提供してくださいました高エネルギー加速器
研究機構物構研 岩野薫氏、計算環境を整えていただいた
高エネルギー加速器研究機構石川正准教授、湯浅富久子准教授
に感謝いたします。