Intel C++ Compiler で C++ 標準ライブラリを使うときに気をつけたいこと
2ヶ月以上ぶりです.
最近 Intel C++ Compiler (icpc) を使う機会が増えたのですが, GCC で書いたプログラムを他のコンピュータ (自分でシステム管理ができないタイプ) でコンパイル/実行しようとしたときに躓いたのでメモ.
Intel C++ Compiler Linux 版は GCC とのバイナリ互換性を持ってます. それは GCC をバックエンドコンパイラとして使用する必要があるからか, 使用しているからなのかは僕は詳しく知りませんが...
なので, STL などの標準ライブラリは GCC のヘッダをそのまま使っているようです. そのため, 今使っている GCC が古いと問題にある場合があります. 例えば move semantics とかですね. rvalue reference があっても STL などのコンテナが対応していないのでは問題になります.
僕が特に躓いたのは関数の std::begin/std::end が
GCC は 4.4.5 で Intel C++ Compiler は 13.1 です.
#include <vector> int main(int argc, char** argv) {}
$ icpc -H main.cpp . /usr/include/c++/4.4.5/vector .. /usr/include/c++/4.4.5/bits/stl_algobase.h ... /usr/include/c++/4.4.5/x86_64-redhat-linux/bits/c++config.h .... /usr/include/bits/wordsize.h .... /usr/include/c++/4.4.5/x86_64-redhat-linux/bits/os_defines.h ..... /usr/include/features.h ...... /usr/include/sys/cdefs.h ....... /usr/include/bits/wordsize.h ...... /usr/include/gnu/stubs.h ....... /usr/include/bits/wordsize.h ....... /usr/include/gnu/stubs-64.h .... /usr/include/c++/4.4.5/x86_64-redhat-linux/bits/cpu_defines.h ... /usr/include/c++/4.4.5/cstddef .... /opt/intel/Compiler/Intel/composer_xe_2013.1.117/compiler/include/stddef.h ..... /usr/lib/gcc/x86_64-redhat-linux/4.4.5/include/stddef.h ... /usr/include/c++/4.4.5/bits/functexcept.h .... /usr/include/c++/4.4.5/exception_defines.h ... /usr/include/c++/4.4.5/bits/cpp_type_traits.h ... /usr/include/c++/4.4.5/ext/type_traits.h ... /usr/include/c++/4.4.5/ext/numeric_traits.h ... /usr/include/c++/4.4.5/bits/stl_pair.h .... /usr/include/c++/4.4.5/bits/move.h ..... /usr/include/c++/4.4.5/cstddef ...... /opt/intel/Compiler/Intel/composer_xe_2013.1.117/compiler/include/stddef.h ....... /usr/lib/gcc/x86_64-redhat-linux/4.4.5/include/stddef.h ..... /usr/include/c++/4.4.5/bits/concept_check.h ... /usr/include/c++/4.4.5/bits/stl_iterator_base_types.h .... /usr/include/c++/4.4.5/cstddef ..... /opt/intel/Compiler/Intel/composer_xe_2013.1.117/compiler/include/stddef.h ...... /usr/lib/gcc/x86_64-redhat-linux/4.4.5/include/stddef.h ... /usr/include/c++/4.4.5/bits/stl_iterator_base_funcs.h ... /usr/include/c++/4.4.5/bits/stl_iterator.h ... /usr/include/c++/4.4.5/debug/debug.h .. /usr/include/c++/4.4.5/bits/allocator.h ... /usr/include/c++/4.4.5/x86_64-redhat-linux/bits/c++allocator.h .... /usr/include/c++/4.4.5/ext/new_allocator.h ..... /usr/include/c++/4.4.5/new ...... /usr/include/c++/4.4.5/cstddef ....... /opt/intel/Compiler/Intel/composer_xe_2013.1.117/compiler/include/stddef.h ........ /usr/lib/gcc/x86_64-redhat-linux/4.4.5/include/stddef.h ...... /usr/include/c++/4.4.5/exception .. /usr/include/c++/4.4.5/bits/stl_construct.h .. /usr/include/c++/4.4.5/bits/stl_uninitialized.h .. /usr/include/c++/4.4.5/bits/stl_vector.h ... /usr/include/c++/4.4.5/initializer_list .. /usr/include/c++/4.4.5/bits/stl_bvector.h .. /usr/include/c++/4.4.5/bits/vector.tcc
こんな感じで STL は GCC のものを直接使ってるようです.
ちょっとこれだと困ったので, 管理者にせめて 4.6.3 辺りにバージョンアップしてくれないか相談してみます.