2012-12-18 付で、多倍長演算ライブラリ gmp が、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.bz2 : 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 さんのもの。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万桁のベンチマークは、「円周率ベンチマークをやり直す 」を参照していただきたい。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億桁は行けるかな?さもなくば外部記憶に逃がすか?遅くなるなぁ。
CID1359804846 a-wada — 2013/02/02@20:34:06