Автовекторизация в визуальной студии 2012 для векторов типа Eigen неэффективна

У меня есть std :: vector типов Eigen :: vector3d, и когда я компилирую этот код, используя Microsoft Visual Studio 2012, имеющий / Qvec-отчет: 2 установите флажок для сообщения деталей векторизации. Он показывает, что цикл не векторизован по причине 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;
}

Так что я не могу понять, что, как сказать компилятору, здесь будут данные фиксированного размера и назначение фиксированного размера.

0

Решение

От Собственная документация

В Eigen арифметические операторы, такие как operator+ не выполняйте никаких вычислений самостоятельно, они просто возвращают «объект выражения», описывающий выполняемое вычисление. Фактическое вычисление происходит позже, когда вычисляется все выражение, обычно в operator =

Так eV1[i] - eV2[i] не возвращает Eigen::Vector3d — так применяется причина 1304. Вы может быть быть в состоянии разыграть это — но я бы не стал делать ставку на это.

1

Другие решения

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

0

По вопросам рекламы [email protected]