円周率10億桁を計算する #3


2012-12-18 付で、多倍長演算ライブラリ gmpLink が、5.1.0 になった。

早速buildしてみよう。環境は、gcc-4.4.5 /debian64-2.6.32-5-amd64 /VirtualBox 4.2.4 /Windows 7 /DELL XPS8300 /3.4G Intel Core i7-2600。ramは、16GByte実装、うち12GByteをVirtualBoxに割り当てている。
root@debian64:/home/nitobe# wget ftp://ftp.gmplib.org/pub/gmp-5.1.0/gmp-5.1.0.tar.bz2Link 
     :
root@debian64:/home/nitobe# tar xvf gmp-5.1.0.tar.bz2
     :
root@debian64:/home/nitobe# cd gmp-5.1.0
root@debian64:/home/nitobe# mkdir build
root@debian64:/home/nitobe# cd build
root@debian64:/home/nitobe# ../configure -prefix=/usr/local/gmp-5.1.0
     :
root@debian64:/home/nitobe# make -j 4
     :
root@debian64:/home/nitobe# make check
     :
root@debian64:/home/nitobe# make install
     :
root@debian64:/home/nitobe# tree -L 1 /usr/local
/usr/local
├── bin
├── etc
├── games
├── gmp-4.2.2
├── gmp-5.0.5
├── gmp-5.1.0
├── include
├── lib
├── man -> share/man
├── sbin
├── share
└── src

12 directories, 0 files
root@debian64:/home/nitobe#

makefile を整えて
nitobe@debian64:/home/nitobe/itchyny# cat makefile
CC=gcc
OPT= -static -O3 -m64 -mtune=amdfam10
GMP422=gmp-4.2.2
GMP422_INC=-I/usr/local/$(GMP422)/include
GMP422_LIB=/usr/local/$(GMP422)/lib/libgmp.a
GMP505=gmp-5.0.5
GMP505_INC=-I/usr/local/$(GMP505)/include
GMP505_LIB=/usr/local/$(GMP505)/lib/libgmp.a
GMP510=gmp-5.1.0
GMP510_INC=-I/usr/local/$(GMP510)/include
GMP510_LIB=/usr/local/$(GMP510)/lib/libgmp.a
SRC= pi.c
EXE= pi

.PHONY: clean

all: $(EXE)

pi: $(SRC)
        $(CC) $(OPT) $(GMP510_INC) $(SRC) -o $(EXE) $(GMP510_LIB)

pi422: $(SRC)
        $(CC) $(OPT) $(GMP422_INC) $(SRC) -o $(EXE)422 $(GMP422_LIB)

pi505: $(SRC)
        $(CC) $(OPT) $(GMP505_INC) $(SRC) -o $(EXE)505 $(GMP505_LIB)

pi510: $(SRC)
        $(CC) $(OPT) $(GMP510_INC) $(SRC) -o $(EXE)510 $(GMP510_LIB)

size: size.c
        $(CC) $(OPT) $(GMP_INC) size.c -o size $(GMP_LIB)

clean:
        rm -f pi
        rm -f pi422
        rm -f pi505
        rm -f pi510
        rm -f size
nitobe@debian64:/home/nitobe/itchyny# 
まずは、円周率1億桁の実行時間を比較する。使用するソースは itchyny Link さんのもの。itchyny さんのソースをちょっと改変。itchyny さん、ごめんなさい。
nitobe@debian64:/home/nitobe/itchyny# diff pi.c pi.c.org
66,72c66,68
<   long int digits = 100000000;
<   long int prec = digits * log2(10);
<   long int n = digits / 14;
< 
<   fprintf(stderr, "%ld digits(prec=%ld) of pi, %ld terms.¥n", digits, prec, n);
<   fprintf(stderr, "with gcc-%d.%d.%d, gmp-%s¥n",
<                 __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__, gmp_version);
---
>   int digits = 10000;
>   int prec = digits * log2(10);
>   int n = digits / 14;
125c121
<   mpf_out_str(fp, 10, digits + 10, pi);
---
>   mpf_out_str(fp, 10, digits, pi);
142d137
< 
nitobe@debian64:/home/nitobe/itchyny#
それぞれの gmp バージョンの実行ファイルをコンパイルして、実行。
nitobe@debian64:/home/nitobe/itchyny# make pi422
gcc -static -O3 -m64 -mtune=amdfam10 -I/usr/local/gmp-4.2.2/include pi.c -o pi422 /usr/local/gmp-4.2.2/lib/libgmp.a
nitobe@debian64:/home/nitobe/itchyny# make pi505
gcc -static -O3 -m64 -mtune=amdfam10 -I/usr/local/gmp-5.0.5/include pi.c -o pi505 /usr/local/gmp-5.0.5/lib/libgmp.a
nitobe@debian64:/home/nitobe/itchyny# make pi510
gcc -static -O3 -m64 -mtune=amdfam10 -I/usr/local/gmp-5.1.0/include pi.c -o pi510 /usr/local/gmp-5.1.0/lib/libgmp.a
nitobe@debian64:/home/nitobe/itchyny$ time ./pi422
with gcc-4.4.5, gmp-4.2.2
digits=100000000; prec=332192809; n=7142857
356.010 s
491.560 s

real8m11.823s
user8m9.895s
sys0m1.692s
nitobe@debian64:/home/nitobe/itchyny$ time ./pi505
with gcc-4.4.5, gmp-5.0.5
digits=100000000; prec=332192809; n=7142857
186.400 s
230.130 s

real3m50.405s
user3m48.514s
sys0m1.648s
nitobe@debian64:/home/nitobe/itchyny$ time ./pi510
with gcc-4.4.5, gmp-5.1.0
digits=100000000; prec=332192809; n=7142857
162.630 s
200.160 s

real3m20.511s
user3m18.580s
sys0m1.616s
nitobe@debian64:~/itchyny$
4.2.2~5.0.5:63%、5.0.5~5.1.0:14% の速度向上だ。
実は、上の改変で、10億桁も計算可能になっている。66行目を 1000000000 にして、make
nitobe@debian64:~/itchyny$ make pi510
gcc -static -O3 -m64 -mtune=amdfam10 -I/usr/local/gmp-5.1.0/include pi.c -o pi510 /usr/local/gmp-5.1.0/lib/libgmp.a
nitobe@debian64:~/itchyny$ time ./pi510
1000000000 digits(prec=3321928094) of pi, 71428571 terms.
with gcc-4.4.5, gmp-5.1.0
2501.230 s
3059.550 s

real51m26.963s
user50m18.689s
sys0m41.095s
nitobe@debian64:~/itchyny$ cat format.sed
#!/bin/sed -f
/^$/d
s/^0.3/3.¥n/
s/[0-9]¥{100¥}/&¥n/g
s/e1//
nitobe@debian64:~/itchyny$ time ./format.sed output.txt >pi1g.txt

real2m4.889s
user1m38.666s
sys0m1.520s
nitobe@debian64:~/itchyny$ diff pi1g.txt ../pi/pi1g.txt
10000002c10000002
< 64388312
¥ ファイル末尾に改行がありません
---
> 64388312
nitobe@debian64:~/itchyny$ 

円周率100万桁のベンチマークは、「円周率ベンチマークをやり直すLink 」を参照していただきたい。5.0.5と比較して、35%~25%程度速くなっている。何故か、2.0G Intel(R) Core(TM) Duo CPU T2500 と Intel(R) Pentium(R) M 1.4GHz は速度の向上が全く見られない。1.2 GHz ARM Marvell Kirkwood 88F6281 SheevaPlug は、makeでエラーとなりbuild 不能。

現在の環境で、頑張れば20億桁位まで行けそうだけど、あとは ram の実装次第だよね。64GByte実装で100億桁は行けるかな?さもなくば外部記憶に逃がすか?遅くなるなぁ。

d72a1888159a65c16f1b084b477fa18b

Moore's Law (集積回路上のトランジスタ数は「18か月ごとに倍になる」)を信頼して、暫し待つか。

 


— posted by nitobe at 11:11 am   commentComment [1] 

T: Y: ALL: Online:
ThemeSwitch
  • Basic
Created in 0.0182 sec.
prev
2012.12
next
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
 
strawberry-linux geigercounter Ver.2
Sibasaki, Cyofu City, Tokyo, JAPAN
blogBar