2016-10-17 16 views
0

У меня есть std :: vector типов Eigen :: vector3d, и когда я компилирую этот код с помощью Microsoft Visual Studio 2012 с /Qvec-report : 2 флаг для представления сведений о векторизации. Это показывает Loop не векторизации по соображениям 1304 (Loop содержит задания, которые имеют разных типов), как указано на странице MSDN - https://msdn.microsoft.com/en-us/library/jj658585.aspxАвто-векторизация в visual 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

В соответствии с этим CookBook (https://blogs.msdn.microsoft.com/nativeconcurrency/2012/07/10/auto-vectorizer -in-visual-studio-2012-cookbook /) правило № 7. Избегайте преобразований типов данных, явных или неявных. Поэтому я не думаю, что было бы разумно бросить его. Даже я протестировал его после того, как причина 1304 осталась такой же. –

0

Рассмотрим changeing eiVec1 и eiVec12 к matrix<double, 3, 100> и делать вычитание как eiVec = eiVec1 - eiVec2