2016-07-07 21 views
0

C++固有ライブラリはSSE、NEONなどの異なるアーキテクチャのベクトル化を行います。しかし、gccのような最新のコンパイラでは、-O3フラグを使ってベクトル化フラグを有効にすると、自動的にベクトル化が行われます。なぜライブラリはコンパイラの自動ベクトル化ではなくハードコード化ベクトル化が必要です

私の質問は、Eigenやその他のライブラリがコンパイラがこれを自動的に行うときにベクトル化をハードコード化するのはなぜですか?

+1

おそらく、彼らはコンパイラを信頼するわけではありません。あるいは、あなた自身が言ったように、「gccのような最新のコンパイラは、自動的にベクトル化を行います」* - おそらくほとんどが十分ではありません。 –

+1

ライブラリは長い間存在していましたが、バージョン2.0は2009年初めのもので、すでにSSE2コードが使用されています。コンパイラはそれ以来戻ってこなかった。 –

+1

ソースをチェックすると、そこには自動配信されないものがたくさんあることがわかります。 – harold

答えて

2

2 * A-4 * Bのような基本的な係数演算のために、自動ベクトル化ではコンパイラが良くなってきているというのは事実ですが、Eigenのようなライブラリは最近のコンパイラよりはるかに優れていません。しかし、行列積、縮小、転置、べき乗などのやや複雑な式の場合、コンパイラはあまり働かない。一方、Eigenは、表現セマンティックのより高いレベルの知識を利用して、それらを明示的にベクトル化することができます。さらに、複雑なスカラ型はコンパイラによってベクトル化されません。 Eigenの明示的ベクトル化(-DEIGEN_DONT_VECTORIZE)を無効にすることで、自分で確認できます。

関連する問題