2016-10-17 15 views
-1

Eigen :: vectors를 사용하는 코드를 가지고 있으므로 Eigen이이 코드를 SSE에 맞게 최적화했는지 확인하고자합니다.고유 코드가 SSE 명령어에 최적화 된 코드인지 여부 확인

Visual Studio 2012 Express를 사용하여 C++ 코드의 최적화 정보를 제공하는 "/ Qvec-report : 2" 명령 줄 옵션을 설정할 수 있습니다. 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

봐가.

내부 루프 내부에 SUBPD (packed double)가 표시되면 벡터화됩니다. SUBSD (스칼라 더블)와 SUBPD 만 볼 수 있다면 아무 것도 볼 수 없습니다.

+0

코드에서 중단 점을 작성하여 디버그 모드에서 asm 출력을 조사 할 수 있다고 생각합니다. 릴리스 모드에서 빌드를 컴파일하는 동안 ASM을 조사 할 수있는 방법을 모르겠습니다. AFAIK는 Visual Studio에서 최적화는 릴리즈 빌드에서만 발생합니다. 내가 틀렸다면 나를 바로 잡으십시오. –

+0

@ShubhamSaini : 최적화 된 실행 파일에서 디버거를 사용할 수 있습니다. 더 간단히 바이너리를 분해하고 그 함수를 찾을 수 있습니다. 몇 년 전만해도 VS를 한 프로젝트에만 사용 했으므로 IDK *는 Windows에서 이러한 작업을 가장 쉽게 수행하지만 올바른 도구 (예 :'objdump -Mintel -drwC my.exe | less')에서는 어렵지 않습니다. 당신은 디버그 빌드를 보는 것이 쓸모 없을 것이라고 옳다. –

+0

제안 해 주셔서 감사합니다. 아주 작은 프로그램에는 좋지만 프로젝트가 너무 커서 예를 들어 20 개 이상의 클래스와 파일이 포함되어있는 경우 유용하지 않습니다. –