«前の日記(2008-09-22) 最新 次の日記(2008-12-24)» 編集

meta's blog - The Power To Serve

筆者について

FreeBSDを通じてOSSにささかな貢献を。

OSS活動をご支援いただける方を募集しています


2008-09-28 ベンチマーク

Pentium 4 3GHz HT vs Athlon 64 3200+ (環境解説篇)

ベンチマークするのも今更な枯れた環境でベンチマークします。

対象の2台の概要は

  • Pentium 4 3GHz Prescott HT
    • Fedora 9 x86
    • gcc 4.3.0
    • Kernel 2.6.26
    • ext3
  • Athlon 64 3200+ 2.0GHz@2.2GHz Winchester
    • Debian lenny x86_64
    • gcc 4.3.1
    • Kernel 2.6.26
    • ReiserFS

という感じ。OS が違う時点で色々違うけど気にしない。

Pentium 4 3GHz 機の環境

CPU は Pentium 4 3GHz Prescott HT でメモリは 1GB、OS は Fedora 9。cpuinfo は HT なので同じような情報がもう1個分あるけど省略。

$ /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 15
model           : 3
model name      : Intel(R) Pentium(R) 4 CPU 3.00GHz
stepping        : 4
cpu MHz         : 3000.666
cache size      : 1024 KB
physical id     : 0
siblings        : 2
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 5
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe constant_tsc pebs bts pni monitor ds_cpl cid xtpr
bogomips        : 6004.60
clflush size    : 64
power management:

カーネルはこんな感じ。

$ uname -a
Linux fedora.vmeta.jp 2.6.26.3-29.fc9.i686 #1 SMP Wed Sep 3 03:42:27 EDT 2008 i686 i686 i386 GNU/Linux

コンパイラはこう。

$ gcc -v
Using built-in specs.
Target: i386-redhat-linux
コンフィグオプション: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info
--with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix
--enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions
--enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin
--with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile
--enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar
--disable-libjava-multilib --with-cpu=generic  --build=i386-redhat-linux
スレッドモデル: posix
gcc version 4.3.0 20080428 (Red Hat 4.3.0-8) (GCC)

Athlon 64 3200+ 機の環境

CPU は Athlon64 3200+ の +10% オーバークロック、OS は Debian lenny、メモリは 1GB。

$ lv /proc/cpuinfo
processor       : 0
vendor_id       : AuthenticAMD
cpu family      : 15
model           : 31
model name      : AMD Athlon(tm) 64 Processor 3200+
stepping        : 0
cpu MHz         : 2199.797
cache size      : 512 KB
fpu             : yes
fpu_exception   : yes
cpuid level     : 1
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt lm 3dnowext 3dnow up rep_good lahf_lm
bogomips        : 4404.84
TLB size        : 1024 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management: ts fid vid ttp

64bit 対応なので amd64 で環境を構築している。

$ uname -a
Linux fender64 2.6.26-1-amd64 #1 SMP Wed Sep 10 15:31:12 UTC 2008 x86_64 GNU/Linux

コンパイラは Fedora とマイナーバージョンが違うけど気にしない。

$ gcc -v
Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.3.1-9'
--with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++
--prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext
--enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.3 --program-suffix=-4.3
--enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-cld
--enable-checking=release  --build=x86_64-linux-gnu --host=x86_64-linux-gnu
--target=x86_64-linux-gnu
Thread model: posix
gcc version 4.3.1 (Debian 4.3.1-9)

Pentium 4 3GHz HT vs Athlon 64 3200+ (bzip2篇)

bzip2 で gcc-4.3.2 の tarball を圧縮してみる。 bzip2 はそれぞれの環境でソースからコンパイルしたものを使用する。オプションはデフォルトのまま。 ディスクの I/O の影響があるので user の値だけを見る。 最適化オプションありとなしの場合で調査した。

Pen 4 3GHz HT (デフォルト -O2)

マルチスレッドには対応してないので Hyper-Threading の恩恵はほぼなし。

$ time /usr/local/bin/bzip2 -9 gcc-4.3.2.tar
real	2m37.268s
user	2m36.117s
sys	0m0.828s

Pen 4 3GHz HT (-O0)

最適化なしだと当然タイムは落ちる。

$ time /usr/local/bin/bzip2 -9 gcc-4.3.2.tar
real	3m57.649s
user	3m56.639s
sys	0m0.741s

Athlon 64 3200+ +10%OC (-O2)

Pen 4 を大きく上回る結果になった。

$ time /usr/local/bin/bzip2 -9 gcc-4.3.2.tar
real	1m56.965s
user	1m55.879s
sys	0m0.824s

Athlon 64 3200+ +10%OC (-O0)

最適化をしなかった場合の落ち込みは Pen 4 より激しく、結果は逆転した。

$ time /usr/local/bin/bzip2 -9 gcc-4.3.2.tar
real	4m36.903s
user	4m35.345s
sys	0m0.792s

Athlon 64 3200+ +10%OC (32bit -02)

chroot 環境下に構築した 32bit 環境での結果。ただし gcc は gcc-4.1.2。 64bit 環境に比べて 12% ほど遅い。

$ time /usr/local/bin/bzip2 -9 gcc-4.3.2.tar
real	2m11.309s
user	2m10.112s
sys	0m0.872s

Athlon 64 3200+ +10%OC (32bit -O0)

最適化なしだと、64bit 環境の場合と結果は逆転したが、Pen 4 には敵わず。

$ bzip2 -d gcc-4.3.2.tar.bz2; time /usr/local/bin/bzip2 -9 gcc-4.3.2.tar
real	4m29.754s
user	4m28.333s
sys	0m0.832s

Pentium 4 3GHz HT vs Athlon 64 3200+ (emacsのビルド篇)

emacs-22.3 のビルドにかかる時間で比較する。ソースツリーは tmpfs 上に展開した。

コンパイルオプションは特に何もつけず揃えたが、ライブラリの有無で機能のオンオフが切り替わっている可能性があるのであまり当てにならない。bogomips よりは正確かも。

今回は、CPU 時間で見てもあまり意味がない。Pen 4 はHyper-Threading により OS からは複数の論理 CPU に見えるため、論理CPU ごとのCPU時間を合計すると実実行時間を越えることがあるから。ソースツリーを tmpfs 上に置いたことで IO のロスが小さくなったため real で比べても問題ない(他のタスクが走ってたら意味ないけど)ので real で比較する。

結果はまたまた Athlon 64 の勝ち。

同時に生成するプロセス数が多いと Pen 4 は Hyper-Threading により実行時間が短縮できるが、Athlon 64 はプロセス切り替えのオーバヘッド分だけ長くなるのが対照的。逆に、同時に生成するプロセス数を1つだけに制限すると Pen 4 は同時に実行可能なタスク数に対して割り当てられるタスク数が不足するので実行時間を短縮できず、Athlon 64 はオーバヘッドが減った分だけ時間が短縮された。

Pen 4 3GHz HT

$ ./configure
$ time make -j6
real	2m2.046s
user	3m30.388s
sys	0m7.021s
$ make clean; time make -j1
real	2m18.906s
user	2m13.093s
sys	0m5.302s

Athlon 64 3200+ 2GHz@2.2GHz

$ ./configure
$ time make -j6
real	1m32.491s
user	1m27.873s
sys	0m4.128s
$ make clean; time make -j1
real	1m29.504s
user	1m25.241s
sys	0m3.768s

Pentium 4 3GHz HT vs Athlon 64 3200+ (ffmpeg で H.264 エンコード篇)

本来比較したかったのはこれです。総合的に Athlon 64 が有利とい

前述の通りの環境でそれぞれビルドした ffmpeg を使ってエンコードします。オプションは同じでそれぞれの CPU に対して最適化する。

5分ほどの MPEG2 動画、20分ほどの Type 2 DV ファイルをそれぞれ H.264 の動画に変換。ビデオは H.264 700kpbs、オーディオは AAC 128kbps、コンテナは MP4 で 2pass エンコードという設定。

Pentium 4 3GHz HT

--enable-libfaac --enable-libx264 --enable-gpl --enable-libmp3lame --cpu=prescott
--enable-pthreads --prefix=/usr/local/ffmpeg

5分ほどの MPEG2 ファイルをエンコード。

$ time (
/usr/local/ffmpeg/bin/ffmpeg -y \
 -i source.vob -deinterlace \
 -s 640x480 -b 700k -ac 2 -ar 44100 \
 -ab 128k -threads 4 -vcodec libx264 \
 -acodec libfaac -f mp4 -qmin 20 -qmax 50 \
 -level 13 -pass 1 /tmp/tmp.tmp && \
/usr/local/ffmpeg/bin/ffmpeg -y \
 -i /tmp/tmp.tmp -deinterlace \
 -s 640x480 -b 700k -ac 2 -ar 44100 \
 -ab 128k -threads 4 -vcodec libx264 \
 -acodec libfaac -f mp4 -qmin 20 -qmax 50 \
 -level 13 -pass 2 output.mp4 )
real	11m19.127s
user	19m28.652s
sys	0m8.547s

Athlon 64 3200+ 2GHz@2.2GHz

コンパイルオプションはこんな感じ。

--enable-libfaac --enable-libx264 --enable-gpl --enable-libmp3lame --cpu=athlon64
--prefix=/usr/local/ffmpeg --enable-libfaad --enable-pthreads

まずは5分ほどの MPEG2 動画から。エンコードのオプションは Pentium 4 とまったく同じなので省略。

real	10m17.134s
user	9m42.060s
sys	0m11.317s

同様のオプションで Type 2 DV の動画をエンコードすると。

real	45m33.325s
user	44m7.521s
sys	0m58.312s

(書きかけ)