![]() |
HPC/並列プログラミングポータルでは、HPC(High Performance Computing)プログラミングや並列プログラミングに関する情報を集積・発信しています。 |
[記事一覧を見る]
このように、MySQLのWebサイトで配布されているインテル コンパイラー版バイナリはGCC版バイナリよりも高速ということが分かったが、さらにこれを高速化することはできないだろうか。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の体験版を使用した。この体験版は国内でインテル コンパイラーの代理店となっているエクセルソフトの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は、そのままではインテル コンパイラーでコンパイルできないという問題がある。この件はすでに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; }
インテル コンパイラーでは、浮動小数点の精度を「-fp-model」コンパイルオプションで指定できる。今回は「precise」を指定したが、もし高い精度が不要な場合はこれを「fast=1」(高速)に変更することでより高速化できる可能性がある。もし興味のある方は試してみてほしい。
[PageInfo]
LastUpdate: 2009-11-19 20:12:30, ModifiedBy: hiromichi-m
[Permissions]
view:all, edit:login users, delete/config:members