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