2016-10-17 114 views
-1

我正在使用Eigen :: vectors的代碼,我想確認Eigen是否爲SSE優化了此代碼。確定特徵是否爲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; 
} 
+0

對於'Vector3d'來說,SSE優化並沒有太多的要求(它只能被拆分成一個數據包和一個標量操作,代價是未對齊的加載/存儲)。 – chtz

+0

是@chtz,它不優化vector3d,但是如果我使用vector4d,它會優化此代碼。正如我通過PeterCordes下面指定的程序集所看到的那樣。 –

回答

2

看那ASM輸出。

如果在內部循環中看到SUBPD(packed double),它將被矢量化。如果你只能看到SUBSD(標量雙精度)並且沒有任何SUBPD,它就沒有。

+0

我想我可以在調試模式下通過在代碼中創建斷點來查看asm輸出。我不知道有什麼方法可以在釋放模式下編譯我的構建時查看ASM。 AFAIK在visual studio中,優化只在發佈版本中進行。請糾正我,如果我錯了 –

+0

@ShubhamSaini:您可以在優化的可執行文件上使用調試器,或者更簡單地說,您可以反彙編二進制文件並查找該函數。我幾年前只在一個項目中使用VS,所以IDK *在Windows上最容易做這些事情,但使用正確的工具(例如'objdump -Mintel -drwC my.exe | less')並不困難。你是正確的,看着一個調試版本將是無用的。 –

+0

感謝您的建議。這對於很小的程序來說很好,但是如果你的項目太大了,也就沒什麼用處,即它包含20多個類和文件 –