選択した最適化に応じて g++ が結果を変えるように見えることに気付いたとき、私はパフォーマンスの最適化に取り組んでおり、もちろん回帰テストを行っています。これまで-O2 -march=[whatever]
のところ、選択したアーキテクチャに関係なく、数値計算でまったく同じ結果が得られるはずだと考えていました。ただし、これは g++ には当てはまらないようです。ivybridge までの古いアーキテクチャを使用すると、どのアーキテクチャに対しても clang と同じ結果が得られますが、haswell 以降の gcc では異なる結果が得られます。これは gcc のバグですか、それとも最適化について何か誤解していましたか? clang がこの動作を示さないように見えるので、私は本当に驚いています。
違いがマシンの精度の範囲内であることは十分に認識していますが、それでも単純な回帰チェックを妨げていることに注意してください。
コード例を次に示します。
#include <iostream>
#include <armadillo>
int main(){
arma::arma_rng::set_seed(3);
arma::sp_cx_mat A = arma::sprandn<arma::sp_cx_mat>(20,20, 0.1);
arma::sp_cx_mat B = A + A.t();
arma::cx_vec eig;
arma::eigs_gen(eig, B, 1, "lm", 0.001);
std::cout << "eigenvalue: " << eig << std::endl;
}
以下を使用してコンパイル:
g++ -march=[architecture] -std=c++14 -O2 -o test example.cpp -larmadillo
gcc バージョン: 6.2.1
クランバージョン: 3.8.0
64 ビット用にコンパイルされ、Intel Skylake プロセッサで実行されます。