2016-10-17 22 views
0

Eigen :: vector3d型のstd :: vectorがあり、Microsoft Visual Studio 2012で/Qvec-reportを持つこのコードをコンパイルしているとき:ベクトル化の詳細を報告するための2フラグon。それが原因MSDNのページで指定されている理由1304(ループのタイプが異なる割り当てが含まれている)にベクトル化されませんループを示しています - https://msdn.microsoft.com/en-us/library/jj658585.aspxVisual Studio 2012の自動ベクトル化が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 due to code 1304 */ 
    for(int i=0;i<100;i++) 
    { 
     eV[i] = eV1[i] - eV2[i]; 
    } 
    return 0; 
} 

だから私がすることができませんコンパイラに指示する方法を理解すると、これは固定サイズのデータ​​であり、固定サイズの割り当てがここで行われます。

答えて

1

固有でthe Eigen documentation

からそのようなoperator+などの算術演算子が自分で任意の計算を実行していない、彼らは、実行すべき演算を記述する「表現オブジェクト」を返します。式全体が評価されたときに実際の計算は、後で発生し、典型的にオペレータに=

そこでeV1[i] - eV2[i]Eigen::Vector3dを返すされていない - よう理由1304が適用されます。あなたはかもしれないそれをキャストすることができる - しかし、私はそれに賭けることはありません。

+0

として減算を行うことを検討https://blogs.msdn.microsoft.com/nativeconcurrency/2012/07/10/auto-vectorizer -in-visual-studio-2012-cookbook /)rule no 7.明示的または暗黙的なデータ型変換を避けます。だから私はそれをキャストするのが賢明だとは思わない。私も、キャストした後にそれをテストしました1304は同じままです。 –

0

matrix<double, 3, 100>からeiVec1eiVec12をchangeingこの料理に応じようeiVec = eiVec1 - eiVec2

関連する問題