7月 16th, 2010

配列の初期化パフォーマン゜ (x86_64 memset緜 )

Posted in Linux by admin

 以前、Solaris(Sparc)環? 上ぜ “Sun Studio C Compiler”でコンパイルしたプログラムによる配列の初期化パフォーマン゜ の? 証のところぜ memsetの話題を挙げましたが、64bit Linux(x86_64)環? においても、あるバージョンぜ glibcで同関数パフォーマンスに影響を圏 ぼす可能性が゜ かったので調査してみました。前回同様、1024バイト配列ぜ memset初期化を1,000,000回ループさるプログラムの処理時間で? 較を行いました。また、様々なバイトの配列でも試してみました。以? がその? 果です。

■glibc-2.5-24.x86_64
1024バイト配列:		平均  0.048秒
1024*10バイト配列:		平均  0.436秒
1024*100バイト配列:		平均  6.331秒
1024*117バイト配列:		平均  7.385秒
1024*118バイト配列:		平均 36.644秒
1024*1000バイト配列:	平均304.943秒
■glibc-2.5-42.x86_64
1024バイト配列:		平均 0.029秒
1024*10バイト配列:		平均 0.216秒
1024*100バイト配列:		平均 5.187秒
1024*117バイト配列:		平均 6.074秒
1024*118バイト配列:		平均 6.130秒
1024*1000バイト配列:	平均51.958秒

 上記の? 果のように、glibc-2.5.24のパフォーマンスが2.5.42よりも劣化するということ。更に配列のサイ゜ 1024*118を超えた時点で、パフォーマンスが著しぜ 劣化するという点が挙げられます。おそらぜ 2.5.32以降で対応した修正パッケージとパッチが以? のものだと思゜ れます。memsetのコードは朮 どアセンブラなので、修正内容はあまり理解出来ません。コメントにぜ PIC(Position Independent Code)の文字が見られ、もしかしたらgccオプション「-fPIC」が使用される共有ライブラリでは更に性能が異なるのかもしれません。

http://rhn.redhat.com/errata/RHBA-2009-0080.html
an optimized memset() routine for AMD64 and Intel 64 systems has been added.
glibc-rh437394.patch

2008-08-14  Ulrich Drepper  <drepper@redhat.com>
	* sysdeps/x86_64/memset.S: Reduce size of tables for PIC.
2008-02-26  Harsha Jagasia  <harsha.jagasia@amd.com>
	* sysdeps/x86_64/memset.S: Rewrite non-SSE code path as tuned for AMD
	Barcelona machine.  Make default fall through branch of
	__x86_64_preferred_memory_instruction check as the integer code path.
2007-10-15  Ulrich Drepper  <drepper@redhat.com>
	* sysdeps/x86_64/memset.S: Use __x86_64_shared_cache_size.
	Always define bzero.
	Remove non-glibc code.
You can leave a comment, or trackback from your own site. RSS 2.0

Leave a comment