2016-10-17 4 views
-1

Eigen :: vectorsを使用しているコードを持っているので、EigenがこのコードをSSE用に最適化しているかどうかを確認します。固有値にSSE命令の最適化コードがあるかどうかを確認する

私はVisual Studio 2012 Expressを使用していますが、コマンドラインオプション"/ Qvec-report:2"を設定すると、C++コードの最適化の詳細が得られます。ビジュアルスタジオやEigenにコードが最適化されているかどうかを教えてくれるオプションはありますか?

私のコードは以下の通りです:

#include <iostream> 
#include <vector> 
#include <time.h> 
#include<Eigen/StdVector> 
int main(char *argv[], int argc) 
{ 
    int tempSize=100; 
/** I am aligning these vectors as specfied on http://eigen.tuxfamily.org/dox/group__TopicStlContainers.html */ 
    std::vector<Eigen::Vector3d,Eigen::aligned_allocator<Eigen::Vector3d>> eiVec(tempSize); 
    std::vector<Eigen::Vector3d,Eigen::aligned_allocator<Eigen::Vector3d>> eiVec1(tempSize); 
    std::vector<Eigen::Vector3d,Eigen::aligned_allocator<Eigen::Vector3d>> eiVec2(tempSize); 

    for(int i=0;i<100;i++) 
    { 
     eiVec1[i] = Eigen::Vector3d::Zero(); 
     eiVec2[i] = Eigen::Vector3d::Zero(); 
    } 

    Eigen::Vector3d *eV = &eiVec.front(); 
    const Eigen::Vector3d *eV1 = &eiVec1.front(); 
    const Eigen::Vector3d *eV2 = &eiVec2.front(); 

/** Below loop is not vectorized by visual studio due to code 1304: 
    Because here comes the operations at level of Eigen, I want to 
    know here whether Eigen has optimized this operation or not? */ 
    for(int i=0;i<100;i++) 
    { 
     eV[i] = eV1[i] - eV2[i]; 
    } 
    return 0; 
} 
+0

'Vector3d'のためのSSE最適化はあまりありません(1つのパケットと1つのスカラ演算に分割することができますが、非整列のロード/ストアを犠牲にして)。 – chtz

+0

はい@chtz、それはvector3dを最適化していませんが、私がvector4dを使用すると、このコードが最適化されます。私はPeterCordesによって下に指定されるようにアセンブリを見ているので。 –

答えて

2

は、ASMの出力を見てください。

内側ループの内側にSUBPD(packed double)が表示されている場合は、ベクトル化されます。 SUBSD(スカラー倍精度)とSUBPDはどこにも表示されていない場合は表示されません。

+0

私は、コード内にブレークポイントを作成することによって、デバッグモードでasm出力を調べることができると思います。私はリリースモードで自分のビルドをコンパイルしているうちに、ASMを調べる方法はわかりません。ビジュアルスタジオのAFAIKは、リリースビルドでのみ最適化が行われます。私が間違っていると私を修正してください。 –

+0

@ShubhamSaini:最適化された実行可能ファイルでデバッガを使用することができます。より簡単にバイナリを逆アセンブルしてその機能を探すことができます。私は数年前に1つのプロジェクトでVSを使用していましたので、IDK *はWindows上でこれらを簡単にやっていますが、適切なツール(例えば 'objdump -Mintel -drwC my.exe | less')では難しくありません。あなたは、デバッグビルドを見ても役に立たないことは間違いありません。 –

+0

あなたの提案をありがとう。非常に小さなプログラムにはいいですが、あなたのプロジェクトが大きすぎる、つまり20以上のクラスとファイルが含まれている場合はそれほど役に立ちません。 –

関連する問題