Visual Studio 2012中对Eigen类型矢量的自动矢量化效果不佳

时间:2016-10-17 11:14:46

标签: c++ visual-studio-2012 eigenvector sse2 auto-vectorization

我有eigen :: vector3d类型的std :: vector,当我使用带有 / Qvec-report:2 标志的Microsoft Visual Studio 2012编译此代码时,用于报告矢量化详细信息。由于原因1304(循环包含不同类型的赋值)在msdn页面上指定,它显示循环未向量化 - https://msdn.microsoft.com/en-us/library/jj658585.aspx

我的代码如下:

#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;
}

所以我无法理解如何告诉编译器,这是固定大小的数据,固定大小的分配将在这里发生。

2 个答案:

答案 0 :(得分:1)

来自the Eigen documentation

  

在Eigen中,诸如operator+之类的算术运算符本身不执行任何计算,它们只返回描述要执行的计算的“表达式对象”。实际计算在稍后评估整个表达式时发生,通常在operator =

因此eV1[i] - eV2[i]未返回Eigen::Vector3d - 因此1304适用。你可能能够投出它 - 但我不会赌它。

答案 1 :(得分:0)

考虑将eiVec1eiVec12更改为matrix<double, 3, 100>并将减法更改为eiVec = eiVec1 - eiVec2