我有std::Vector3d类型,当我使用Microsoft 2012编译这段代码时,它有/Qvec-report: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;
}所以我无法理解如何告诉编译器,这是固定大小的数据和固定大小的分配将发生在这里。
发布于 2016-10-17 11:59:08
来自特征文献
在本征中,像
operator+这样的算术运算符本身不执行任何计算,它们只是返回一个描述要执行的计算的“表达式对象”。当计算整个表达式时(通常是在operator=中),实际的计算将在以后进行。
因此,eV1[i] - eV2[i]没有返回一个Eigen::Vector3d -所以理由1304适用。你也许能投-但我不赌。
发布于 2017-06-26 00:08:36
考虑将eiVec1和eiVec12改为matrix<double, 3, 100>,并将减法改为eiVec = eiVec1 - eiVec2
https://stackoverflow.com/questions/40084969
复制相似问题