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

Posted

技术标签:

【中文标题】Visual Studio 2012 中 Eigen 类型向量的自动向量化效果不佳【英文标题】:Auto-vectorization in visual studio 2012 on vectors of Eigen type is not performing well 【发布时间】:2016-10-17 11:14:46 【问题描述】:

我有 Eigen::vector3d 类型的 std::vector,当我使用 Microsoft Visual Studio 2012 编译此代码时,该代码打开了 /Qvec-report:2 标志以报告矢量化详细信息。它显示 Loop not vectorized 由于原因 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;

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

【问题讨论】:

【参考方案1】:

来自the Eigen documentation

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

所以 eV1[i] - eV2[i] 没有返回 Eigen::Vector3d - 所以原因 1304 适用。你可能可以施放它——但我不会打赌。

【讨论】:

根据此 CookBook (blogs.msdn.microsoft.com/nativeconcurrency/2012/07/10/…) 规则第 7 条。避免数据类型转换,显式或隐式。所以我不认为投它是明智的。即使我在铸造原因 1304 保持不变后对其进行了测试。【参考方案2】:

考虑将eiVec1eiVec12 更改为matrix&lt;double, 3, 100&gt; 并将减法作为eiVec = eiVec1 - eiVec2

【讨论】:

以上是关于Visual Studio 2012 中 Eigen 类型向量的自动向量化效果不佳的主要内容,如果未能解决你的问题,请参考以下文章

visual studio 2012 启动出现如下错误,怎么处理

visual studio2012怎么安装

在 Visual Studio 2010 和 Visual Studio 2012 中,带有 col、colgroup、tbody 和 thead 的 HTML 表格标记引发编译错误

Visual Studio 2012 与 Visual Studio 2010 (delta) [关闭]

我需要用于 .NET 4.5 的 Visual Studio 2012 还是 Visual Studio 2010 适合 4.5?

如何用visual studio2012编c++程序?