判断 eigen 是否有针对 SSE 指令的优化代码
Determine whether eigen has optimized code for SSE instructions or not
我有一段代码正在使用 Eigen::vectors,我想确认 Eigen 是否针对 SSE 优化了这段代码。
我正在使用 Visual Studio 2012 Express,我可以在其中设置命令行选项 "/Qvec-report:2",它给出了 C++ 的优化细节代码。 visual studio 或 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 by visual studio due to code 1304:
Because here comes the operations at level of Eigen, I want to
know here whether Eigen has optimized this operation or not? */
for(int i=0;i<100;i++)
{
eV[i] = eV1[i] - eV2[i];
}
return 0;
}
查看 asm 输出。
如果您在内部循环中看到 SUBPD(压缩双精度),则它已矢量化。如果您只看到 SUBSD(标量双精度)而在任何地方都没有看到 SUBPD,则它没有。
我有一段代码正在使用 Eigen::vectors,我想确认 Eigen 是否针对 SSE 优化了这段代码。
我正在使用 Visual Studio 2012 Express,我可以在其中设置命令行选项 "/Qvec-report:2",它给出了 C++ 的优化细节代码。 visual studio 或 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 by visual studio due to code 1304:
Because here comes the operations at level of Eigen, I want to
know here whether Eigen has optimized this operation or not? */
for(int i=0;i<100;i++)
{
eV[i] = eV1[i] - eV2[i];
}
return 0;
}
查看 asm 输出。
如果您在内部循环中看到 SUBPD(压缩双精度),则它已矢量化。如果您只看到 SUBSD(标量双精度)而在任何地方都没有看到 SUBPD,则它没有。