Show page source of インテル_コンパイラーの実力を測る――インテル_コンパイラー版MySQLは本当に速いのか?_p4 #49585

[[PageNavi(NavigationList)]]



==== より高いパフォーマンスを求めてコンパイル ====
 このように、MySQLのWebサイトで配布されているインテル コンパイラー版バイナリはGCC版バイナリよりも高速ということが分かったが、さらにこれを高速化することはできないだろうか。[http://dev.mysql.com/doc/refman/5.1/ja/mysql-binaries.html MySQLのWebサイト]によると、このインテル コンパイラー版バイナリは、下記のような設定でコンパイルされている。

{{{
CC=icc CXX=icpc CFLAGS="-O3 -unroll2 -ip -mp -no-gcc -restrict" CXXFLAGS="-O3 -unroll2 -ip -mp -no-gcc \
-restrict" ./configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data \
--libexecdir=/usr/local/mysql/bin --with-extra-charsets=complex --enable-thread-safe-client \
--enable-local-infile --enable-assembler --disable-shared --with-client-ldflags=-all-static \
--with-mysqld-ldflags=-all-static --with-embedded-server --with-innodb
}}}
 この設定では、複数のファイル間での最適化を行うIPOが行われていない。また、インテル コンパイラーは特定のCPU向けに最適化したバイナリを生成する機能があるが、こちらについても利用されていない。そこで、続いてはこれらの機能を有効にしてMySQLをコンパイルし、MySQLのWebサイトで提供されているインテル コンパイラー版バイナリと比較してみよう。

 コンパイルには、インテル コンパイラー 11.0の体験版を使用した。この体験版は国内でインテル コンパイラーの代理店となっている[http://www.xlsoft.com/jp/products/intel/download.html?sfwiki エクセルソフトのWebサイト]からダウンロード可能だ。30日の使用制限があるものの、機能的には正式版とまったく同等である。

 今回使用したコンパイル設定は下記のようにした。なお、IPOを利用する場合、アーカイバとしてLinux標準のarではなく、インテル コンパイラーに付属するxiarを利用することに注意して欲しい。

{{{
AR=xiar CC=icc CXX=icpc CFLAGS="-O3 -unroll4 -ipo -fp-model precise -no-gcc -restrict -xSSSE3" \
CXXFLAGS="-O3 -unroll4 -ipo -fp-model precise -no-gcc -restrict -xSSSE3" ./configure \
--prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data --libexecdir=/usr/local/mysql/bin \
 --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --enable-assembler \
 --disable-shared --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static \
 --with-embedded-server --with-innodb
}}}
 また、原稿執筆時に公開されているMySQL 5.1.31は、そのままではインテル コンパイラーでコンパイルできないという問題がある。この件はすでに[http://bugs.mysql.com/bug.php?id=40507 MySQLのバグリポート]で指摘されており、MySQLのソースコードを展開したディレクトリ以下の「mysys/stacktrace.c」を次のように修正することで対応できる。

{{{
ソースコード69行目の下記の部分

#if BACKTRACE_DEMANGLE

char __attribute__ ((weak)) *my_demangle(const char *mangled_name, int *status)
{
  return NULL;
}

を、次のように修正する。

#if BACKTRACE_DEMANGLE

#if defined(__INTEL_COMPILER)
#pragma weak my_demangle=my_demangle_null
char *my_demangle_null(const char *mangled_name, int *status)
#else /* __INTEL_COMPILER */
char __attribute__ ((weak)) *my_demangle(const char *mangled_name, int *status)
#endf /* !__INTEL_COMPILER */
{
  return NULL;
}
}}}


[[PageNavi(NavigationList)]]