EIGEN на MSVC V120, векторизация включена, в то время как оценка неэффективна (возможно) - PullRequest
0 голосов
/ 16 января 2019

Я использую Eigen версии 3.3.5 с MSVC VC ++ VS2013.

Я прочитал много постов по eigen и векторизации под MSVC и другими компиляторами.

Соответствующие опции компилятора:

  • sse2 (проверено, векторизируется ли сборка тестовой функции из документа eigen)
  • O2, быстрый код
  • подкладка (проверены различные варианты)
  • глобальная оптимизация кода

Я признаю, что я довольно новичок в семействе компиляторов msvc, поиск по нему может быть менее эффективным при работе с шаблонами, чем gcc или clang.

void fooa(Vector3f& u, Vector3f& v, Vector3f& w, Affine3f & t){
  EIGEN_ASM_COMMENT("begin mul v*t");
  u = t*u;
  v = t*u;
  w = t*u;
  EIGEN_ASM_COMMENT("end mul v*t");
}

Приведенный выше код в msvc вызывает вызовы:

Eigen::internal::evaluator<Eigen::Block<Eigen::Matrix<float,4,1,0,4,1>,3,1,0> >::evaluator<Eigen::Block<Eigen::Matrix<float,4,1,0,4,1>,3,1,0> >

и до:

Eigen::DenseStorage<float,4,4,1,0>::DenseStorage<float,4,4,1,0> (013F222370h)  

в то время как gcc не влияет, существенно влияя на производительность, мое приложение использует много подобных операций.

Это частично векторизация? это проблема шаблона? или вопрос оптимизации? Самое главное, могу ли я сделать что-то для вывода, аналогичного приведенному ниже, касающегося gcc?

MSVC:

        EIGEN_ASM_COMMENT("inizio prova mul v*t");
    u = t*u;
000000013F221431  test        al,0Fh  
000000013F221433  je          fooa+4Fh (013F22144Fh)  
000000013F221435  lea         rdx,[string L"c:\\users\\user\\docume"... (013F224550h)]  
000000013F22143C  lea         rcx,[string L"(internal::UIntPtr(a"... (013F2245F0h)]  
000000013F221443  mov         r8d,6Dh  
000000013F221449  call        qword ptr [__imp__wassert (013F224160h)]  
000000013F22144F  movss       xmm0,dword ptr [rbx]  
000000013F221453  movss       xmm4,dword ptr [__real@3f800000 (013F224990h)]  
000000013F22145B  lea         rax,[rbp+27h]  
000000013F22145F  movss       dword ptr [rbp-39h],xmm0  
000000013F221464  movss       xmm1,dword ptr [rbx+4]  
000000013F221469  movss       dword ptr [rbp-35h],xmm1  
000000013F22146E  movss       xmm3,dword ptr [rbx+8]  
000000013F221473  movss       dword ptr [rbp-2Dh],xmm4  
000000013F221478  movss       dword ptr [rbp-31h],xmm3  
000000013F22147D  test        al,0Fh  
000000013F22147F  je          fooa+0AFh (013F2214AFh)  
000000013F221481  lea         rdx,[string L"c:\\users\\user\\docume"... (013F224550h)]  
000000013F221488  lea         rcx,[string L"(internal::UIntPtr(a"... (013F2245F0h)]  
000000013F22148F  mov         r8d,6Dh  
000000013F221495  call        qword ptr [__imp__wassert (013F224160h)]  
000000013F22149B  movss       xmm4,dword ptr [rbp-2Dh]  
000000013F2214A0  movss       xmm3,dword ptr [rbp-31h]  
000000013F2214A5  movss       xmm1,dword ptr [rbp-35h]  
000000013F2214AA  movss       xmm0,dword ptr [rbp-39h]  
000000013F2214AF  movss       xmm2,xmm0  
000000013F2214B3  movaps      xmm0,xmm1  
000000013F2214B6  movaps      xmm1,xmm3  
    v = t*u;
000000013F2214B9  lea         rcx,[rbp-39h]  
    EIGEN_ASM_COMMENT("inizio prova mul v*t");
    u = t*u;
000000013F2214BD  shufps      xmm0,xmm0,0  
000000013F2214C1  shufps      xmm2,xmm2,0  
000000013F2214C5  shufps      xmm1,xmm1,0  
000000013F2214C9  mulps       xmm0,xmmword ptr [rdi+10h]  
000000013F2214CD  mulps       xmm1,xmmword ptr [rdi+20h]  
000000013F2214D1  mulps       xmm2,xmmword ptr [rdi]  
000000013F2214D4  addps       xmm2,xmm0  
000000013F2214D7  movss       xmm0,xmm4  
000000013F2214DB  addps       xmm2,xmm1  
000000013F2214DE  shufps      xmm0,xmm0,0  
000000013F2214E2  mulps       xmm0,xmmword ptr [rdi+30h]  
000000013F2214E6  addps       xmm2,xmm0  
000000013F2214E9  movaps      xmm0,xmm2  
000000013F2214EC  movaps      xmm1,xmm2  
000000013F2214EF  shufps      xmm0,xmm2,55h  
000000013F2214F3  shufps      xmm1,xmm2,0AAh  
    EIGEN_ASM_COMMENT("inizio prova mul v*t");
    u = t*u;
000000013F2214F7  movss       dword ptr [rbp-25h],xmm0  
000000013F2214FC  movss       dword ptr [rbp-21h],xmm1  
000000013F221501  movss       dword ptr [rbx],xmm2  
000000013F221505  movss       xmm0,dword ptr [rbp-25h]  
000000013F22150A  movss       dword ptr [rbx+4],xmm0  
000000013F22150F  movss       xmm1,dword ptr [rbp-21h]  
000000013F221514  movss       dword ptr [rbx+8],xmm1  
    v = t*u;
000000013F221519  call        Eigen::DenseStorage<float,4,4,1,0>::DenseStorage<float,4,4,1,0> (013F222370h)  
000000013F22151E  movss       xmm0,dword ptr [rbx]  
000000013F221522  lea         rcx,[rbp+27h]  
000000013F221526  movss       dword ptr [rbp-39h],xmm0  
000000013F22152B  movss       xmm1,dword ptr [rbx+4]  
000000013F221530  movss       dword ptr [rbp-35h],xmm1  
000000013F221535  movss       xmm0,dword ptr [rbx+8]  
000000013F22153A  mov         dword ptr [rbp-2Dh],3F800000h  
000000013F221541  movss       dword ptr [rbp-31h],xmm0  
000000013F221546  call        Eigen::DenseStorage<float,4,4,1,0>::DenseStorage<float,4,4,1,0> (013F222370h)  
000000013F22154B  lea         rax,[rbp-39h]  
000000013F22154F  lea         rdx,[rbp+37h]  
000000013F221553  mov         qword ptr [rbp-11h],rax  
000000013F221557  lea         rax,[rbp-39h]  
000000013F22155B  lea         rcx,[rbp-19h]  
000000013F22155F  xor         r8d,r8d  
000000013F221562  mov         qword ptr [rbp-19h],rdi  
000000013F221566  mov         qword ptr [rbp-9],rdi  
000000013F22156A  mov         qword ptr [rbp+7],rax  
000000013F22156E  mov         qword ptr [rbp+17h],4  
000000013F221576  call        Eigen::internal::product_evaluator<Eigen::Product<Eigen::Matrix<float,4,4,0,4,4>,Eigen::Matrix<float,4,1,0,4,1>,1>,3,Eigen::DenseShape,Eigen::DenseShape,float,float>::packet<16,__m128> (013F222420h)  
    w = t*u;
000000013F22157B  lea         rcx,[rbp-39h]  
    v = t*u;
000000013F22157F  movaps      xmm2,xmmword ptr [rax]  
000000013F221582  movaps      xmm0,xmm2  
000000013F221585  movaps      xmm1,xmm2  
000000013F221588  shufps      xmm0,xmm2,55h  
000000013F22158C  shufps      xmm1,xmm2,0AAh  
000000013F221590  movss       dword ptr [rbp-25h],xmm0  
000000013F221595  movss       dword ptr [rbp-21h],xmm1  
000000013F22159A  movss       dword ptr [r14],xmm2  
000000013F22159F  movss       xmm0,dword ptr [rbp-25h]  
000000013F2215A4  movss       dword ptr [r14+4],xmm0  
000000013F2215AA  movss       xmm1,dword ptr [rbp-21h]  
000000013F2215AF  movss       dword ptr [r14+8],xmm1  
    w = t*u;
000000013F2215B5  call        Eigen::DenseStorage<float,4,4,1,0>::DenseStorage<float,4,4,1,0> (013F222370h)  
000000013F2215BA  lea         rax,[rbp-39h]  
000000013F2215BE  xor         r14d,r14d  
000000013F2215C1  mov         qword ptr [rbp-19h],rax  
000000013F2215C5  lea         rax,[rbp-39h]  
000000013F2215C9  lea         rdx,[rbp-19h]  
000000013F2215CD  lea         rcx,[rbp+27h]  
000000013F2215D1  mov         qword ptr [rbp-1],r14  
000000013F2215D5  mov         qword ptr [rbp+0Fh],4  
000000013F2215DD  mov         qword ptr [rbp-9],rax  
000000013F2215E1  call        Eigen::internal::evaluator<Eigen::Block<Eigen::Matrix<float,4,1,0,4,1>,3,1,0> >::evaluator<Eigen::Block<Eigen::Matrix<float,4,1,0,4,1>,3,1,0> > (013F2223B0h)  
000000013F2215E6  mov         eax,dword ptr [rbx]  
000000013F2215E8  mov         rcx,qword ptr [rbp+27h]  
000000013F2215EC  mov         dword ptr [rcx],eax  
000000013F2215EE  mov         eax,dword ptr [rbx+4]  
000000013F2215F1  mov         dword ptr [rcx+4],eax  
000000013F2215F4  mov         eax,dword ptr [rbx+8]  
000000013F2215F7  mov         dword ptr [rcx+8],eax  
000000013F2215FA  mov         dword ptr [rbp-2Dh],3F800000h  
000000013F221601  lea         rcx,[rbp+37h]  
000000013F221605  call        Eigen::DenseStorage<float,4,4,1,0>::DenseStorage<float,4,4,1,0> (013F222370h)  
000000013F22160A  lea         rax,[rbp-39h]  
000000013F22160E  lea         rdx,[rbp+47h]  
000000013F221612  mov         qword ptr [rbp-11h],rax  
000000013F221616  lea         rax,[rbp-39h]  
000000013F22161A  lea         rcx,[rbp-19h]  
000000013F22161E  xor         r8d,r8d  
000000013F221621  mov         qword ptr [rbp-19h],rdi  
000000013F221625  mov         qword ptr [rbp-9],rdi  
000000013F221629  mov         qword ptr [rbp+7],rax  
000000013F22162D  mov         qword ptr [rbp+17h],4  
000000013F221635  call        Eigen::internal::product_evaluator<Eigen::Product<Eigen::Matrix<float,4,4,0,4,4>,Eigen::Matrix<float,4,1,0,4,1>,1>,3,Eigen::DenseShape,Eigen::DenseShape,float,float>::packet<16,__m128> (013F222420h)  
000000013F22163A  lea         rdx,[rbp-19h]  
000000013F22163E  lea         rcx,[rbp+27h]  
000000013F221642  mov         qword ptr [rbp-1],r14  
000000013F221646  movaps      xmm0,xmmword ptr [rax]  
000000013F221649  movaps      xmmword ptr [rbp+37h],xmm0  
000000013F22164D  lea         rax,[rbp+37h]  
000000013F221651  mov         qword ptr [rbp+0Fh],4  
000000013F221659  mov         qword ptr [rbp-19h],rax  
000000013F22165D  lea         rax,[rbp+37h]  
000000013F221661  mov         qword ptr [rbp-9],rax  
000000013F221665  call        Eigen::internal::evaluator<Eigen::Block<Eigen::Matrix<float,4,1,0,4,1>,3,1,0> >::evaluator<Eigen::Block<Eigen::Matrix<float,4,1,0,4,1>,3,1,0> > (013F2223B0h)  
000000013F22166A  mov         rax,qword ptr [rbp+27h]  
    EIGEN_ASM_COMMENT("fine prova mul v*t");
}
000000013F22166E  lea         r11,[rsp+0B0h]  
    w = t*u;
000000013F221676  movss       xmm2,dword ptr [rax]  
000000013F22167A  movss       dword ptr [rbp-29h],xmm2  
000000013F22167F  movss       xmm0,dword ptr [rax+4]  
000000013F221684  movss       dword ptr [rbp-25h],xmm0  
000000013F221689  movss       xmm1,dword ptr [rax+8]  
    EIGEN_ASM_COMMENT("fine prova mul v*t");
}
000000013F22168E  mov         rbx,qword ptr [r11+10h]  
000000013F221692  mov         rdi,qword ptr [r11+20h]  
000000013F221696  mov         r14,qword ptr [r11+28h]  
    w = t*u;
000000013F22169A  movss       dword ptr [rbp-21h],xmm1  
000000013F22169F  movss       dword ptr [rsi],xmm2  
000000013F2216A3  movss       xmm0,dword ptr [rbp-25h]  
000000013F2216A8  movss       dword ptr [rsi+4],xmm0  
000000013F2216AD  movss       xmm1,dword ptr [rbp-21h]  
000000013F2216B2  movss       dword ptr [rsi+8],xmm1  
    EIGEN_ASM_COMMENT("fine prova mul v*t");
}

GCC:

# 18 "main.cpp" 1
#inizio prova mul v*t
# 0 "" 2
#NO_APP
movss   4(%rdi), %xmm0
shufps  $0, %xmm0, %xmm0
movss   (%rdi), %xmm1
shufps  $0, %xmm1, %xmm1
movaps  (%rcx), %xmm2
mulps   16(%rcx), %xmm0
mulps   %xmm1, %xmm2
movaps  %xmm0, %xmm1
movss   8(%rdi), %xmm0
shufps  $0, %xmm0, %xmm0
addps   %xmm2, %xmm1
mulps   32(%rcx), %xmm0
addps   %xmm1, %xmm0
addps   48(%rcx), %xmm0
movaps  %xmm0, (%rsp)
movss   (%rsp), %xmm0
movss   4(%rsp), %xmm1
movss   8(%rsp), %xmm3
movss   %xmm0, (%rdi)
shufps  $0, %xmm0, %xmm0
movss   %xmm1, 4(%rdi)
shufps  $0, %xmm1, %xmm1
movss   %xmm3, 8(%rdi)
movaps  (%rcx), %xmm2
mulps   16(%rcx), %xmm1
mulps   %xmm0, %xmm2
movaps  %xmm3, %xmm0
shufps  $0, %xmm0, %xmm0
addps   %xmm2, %xmm1
mulps   32(%rcx), %xmm0
addps   %xmm1, %xmm0
addps   48(%rcx), %xmm0
movaps  %xmm0, (%rsp)
movss   (%rsp), %xmm0
movss   %xmm0, (%rsi)
movss   4(%rsp), %xmm0
movss   %xmm0, 4(%rsi)
movss   8(%rsp), %xmm0
movss   %xmm0, 8(%rsi)
movss   4(%rdi), %xmm0
shufps  $0, %xmm0, %xmm0
movss   (%rdi), %xmm1
shufps  $0, %xmm1, %xmm1
movaps  (%rcx), %xmm2
mulps   16(%rcx), %xmm0
mulps   %xmm1, %xmm2
movaps  %xmm0, %xmm1
movss   8(%rdi), %xmm0
shufps  $0, %xmm0, %xmm0
addps   %xmm2, %xmm1
mulps   32(%rcx), %xmm0
addps   %xmm1, %xmm0
addps   48(%rcx), %xmm0
movaps  %xmm0, (%rsp)
movss   (%rsp), %xmm0
movss   %xmm0, (%rdx)
movss   4(%rsp), %xmm0
movss   %xmm0, 4(%rdx)
movss   8(%rsp), %xmm0
movss   %xmm0, 8(%rdx)
#APP
# 22 "main.cpp" 1
#fine prova mul v*t
# 0 "" 2
...