laurentkneip / opengv

OpenGV is a collection of computer vision methods for solving geometric vision problems. It is hosted and maintained by the Mobile Perception Lab of ShanghaiTech.
Other
1.01k stars 354 forks source link

fivept_kneip causes stack overflow during test_relative_pose.exe - built with Visual Studio 2019, Eigen 3.4.0 #118

Closed flavioscalini closed 1 year ago

flavioscalini commented 1 year ago

The issue appears to be due to opengv::relative_pose::modules::fivept_kneip::computeBasis() in src/relative_pose/modules/fivept_kneip/code.cpp using too much stack space.

Showing a disassembly of this function below from the debugger we can see the stack pointer being adjusted at the start of the function by 196088h = 1,663,112 bytes, which is > 1 MB (default max is 1 MB). Eigen is bashing the stack with local variables for every access to groebnerMatrix due to inlining. See disassembly below (watch rsp) for the first two accesses: factor = -groebnerMatrix(30,1); and groebnerMatrix(30,1) = 0.0; as an example.

One workaround is to increase the stack size with linker flags, e.g.: set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:10000000") solves the issue for me (10 MB as an overkill, just in case, to avoid similar issues elsewhere).

void
opengv::relative_pose::modules::fivept_kneip::computeBasis(
    Eigen::Matrix<double,66,197> & groebnerMatrix )
{
00007FF771A96B90  mov         qword ptr [rsp+8],rcx  
00007FF771A96B95  push        rsi  
00007FF771A96B96  push        rdi  
00007FF771A96B97  mov         eax,196088h  
00007FF771A96B9C  call        __chkstk (07FF77155BFFAh)  
00007FF771A96BA1  sub         rsp,rax  
  double factor = 0.0;
00007FF771A96BA4  xorps       xmm0,xmm0  
00007FF771A96BA7  movsd       mmword ptr [factor],xmm0  

  sPolynomial30(groebnerMatrix);
00007FF771A96BB0  mov         rcx,qword ptr [groebnerMatrix]  
00007FF771A96BB8  call        opengv::relative_pose::modules::fivept_kneip::sPolynomial30 (07FF771562805h)  
  factor = -groebnerMatrix(30,1);
00007FF771A96BBD  mov         rcx,qword ptr [groebnerMatrix]  
00007FF771A96BC5  call        Eigen::EigenBase<Eigen::Matrix<double,66,197,0,66,197> >::derived (07FF77156DE53h)  
00007FF771A96BCA  mov         qword ptr [rsp+1C0h],rax  
00007FF771A96BD2  xor         eax,eax  
00007FF771A96BD4  test        eax,eax  
00007FF771A96BD6  je          opengv::relative_pose::modules::fivept_kneip::computeBasis+56h (07FF771A96BE6h)  
00007FF771A96BD8  mov         qword ptr [rsp+1C8h],0  
00007FF771A96BE4  jmp         opengv::relative_pose::modules::fivept_kneip::computeBasis+6Bh (07FF771A96BFBh)  
00007FF771A96BE6  mov         rcx,qword ptr [rsp+1C0h]  
00007FF771A96BEE  call        Eigen::DenseCoeffsBase<Eigen::Matrix<double,66,197,0,66,197>,3>::outerStride (07FF77155C446h)  
00007FF771A96BF3  mov         qword ptr [rsp+1C8h],rax  
00007FF771A96BFB  mov         rax,qword ptr [rsp+1C8h]  
00007FF771A96C03  mov         qword ptr [rsp+1D0h],rax  
00007FF771A96C0B  mov         rax,qword ptr [rsp+1C0h]  
00007FF771A96C13  mov         rcx,rax  
00007FF771A96C16  call        Eigen::DenseStorage<double,13002,66,197,0>::data (07FF77157FA27h)  
00007FF771A96C1B  mov         qword ptr [rsp+1D8h],rax  
00007FF771A96C23  lea         rax,[rsp+1E0h]  
00007FF771A96C2B  mov         qword ptr [rsp+1E8h],rax  
00007FF771A96C33  mov         rax,qword ptr [rsp+1E8h]  
00007FF771A96C3B  mov         rcx,qword ptr [rsp+1D8h]  
00007FF771A96C43  mov         qword ptr [rax],rcx  
00007FF771A96C46  lea         rax,[rsp+1E0h]  
00007FF771A96C4E  mov         qword ptr [rsp+1F0h],rax  
00007FF771A96C56  xor         eax,eax  
00007FF771A96C58  test        eax,eax  
00007FF771A96C5A  je          opengv::relative_pose::modules::fivept_kneip::computeBasis+102h (07FF771A96C92h)  
00007FF771A96C5C  mov         qword ptr [rsp+1F8h],42h  
00007FF771A96C68  mov         rax,qword ptr [rsp+1F0h]  
00007FF771A96C70  imul        rcx,qword ptr [rsp+1F8h],1Eh  
00007FF771A96C79  inc         rcx  
00007FF771A96C7C  imul        rcx,rcx,8  
00007FF771A96C80  mov         rax,qword ptr [rax]  
00007FF771A96C83  add         rax,rcx  
00007FF771A96C86  mov         qword ptr [rsp+200h],rax  
00007FF771A96C8E  jmp         opengv::relative_pose::modules::fivept_kneip::computeBasis+13Ch (07FF771A96CCCh)  
00007FF771A96C90  jmp         opengv::relative_pose::modules::fivept_kneip::computeBasis+13Ch (07FF771A96CCCh)  
00007FF771A96C92  mov         qword ptr [rsp+208h],42h  
00007FF771A96C9E  mov         rax,qword ptr [rsp+1F0h]  
00007FF771A96CA6  imul        rcx,qword ptr [rsp+208h],1  
00007FF771A96CAF  mov         edx,1Eh  
00007FF771A96CB4  add         rdx,rcx  
00007FF771A96CB7  mov         rcx,rdx  
00007FF771A96CBA  imul        rcx,rcx,8  
00007FF771A96CBE  mov         rax,qword ptr [rax]  
00007FF771A96CC1  add         rax,rcx  
00007FF771A96CC4  mov         qword ptr [rsp+200h],rax  
00007FF771A96CCC  lea         rcx,[rsp+1E0h]  
00007FF771A96CD4  call        Eigen::internal::evaluator<Eigen::Matrix<double,66,197,0,66,197> >::~evaluator<Eigen::Matrix<double,66,197,0,66,197> > (07FF77158400Eh)  
00007FF771A96CD9  mov         rax,qword ptr [rsp+200h]  
00007FF771A96CE1  movsd       xmm0,mmword ptr [rax]  
00007FF771A96CE5  xorps       xmm0,xmmword ptr [__xmm@80000000000000008000000000000000 (07FF772F90B50h)]  
00007FF771A96CEC  movsd       mmword ptr [factor],xmm0  
  groebnerMatrix(30,1) = 0.0;
00007FF771A96CF5  mov         rcx,qword ptr [groebnerMatrix]  
00007FF771A96CFD  call        Eigen::EigenBase<Eigen::Matrix<double,66,197,0,66,197> >::derived (07FF77156DE53h)  
00007FF771A96D02  mov         qword ptr [rsp+210h],rax  
00007FF771A96D0A  xor         eax,eax  
00007FF771A96D0C  test        eax,eax  
00007FF771A96D0E  je          opengv::relative_pose::modules::fivept_kneip::computeBasis+18Eh (07FF771A96D1Eh)  
00007FF771A96D10  mov         qword ptr [rsp+218h],0  
00007FF771A96D1C  jmp         opengv::relative_pose::modules::fivept_kneip::computeBasis+1A3h (07FF771A96D33h)  
00007FF771A96D1E  mov         rcx,qword ptr [rsp+210h]  
00007FF771A96D26  call        Eigen::DenseCoeffsBase<Eigen::Matrix<double,66,197,0,66,197>,3>::outerStride (07FF77155C446h)  
00007FF771A96D2B  mov         qword ptr [rsp+218h],rax  
00007FF771A96D33  mov         rax,qword ptr [rsp+218h]  
00007FF771A96D3B  mov         qword ptr [rsp+220h],rax  
00007FF771A96D43  mov         rax,qword ptr [rsp+210h]  
00007FF771A96D4B  mov         rcx,rax  
00007FF771A96D4E  call        Eigen::DenseStorage<double,13002,66,197,0>::data (07FF77157FA27h)  
00007FF771A96D53  mov         qword ptr [rsp+228h],rax  
00007FF771A96D5B  lea         rax,[rsp+230h]  
00007FF771A96D63  mov         qword ptr [rsp+238h],rax  
00007FF771A96D6B  mov         rax,qword ptr [rsp+238h]  
00007FF771A96D73  mov         rcx,qword ptr [rsp+228h]  
00007FF771A96D7B  mov         qword ptr [rax],rcx  
00007FF771A96D7E  lea         rax,[rsp+230h]  
00007FF771A96D86  mov         qword ptr [rsp+240h],rax  
00007FF771A96D8E  xor         eax,eax  
00007FF771A96D90  test        eax,eax  
00007FF771A96D92  je          opengv::relative_pose::modules::fivept_kneip::computeBasis+23Ah (07FF771A96DCAh)  
00007FF771A96D94  mov         qword ptr [rsp+248h],42h  
00007FF771A96DA0  mov         rax,qword ptr [rsp+240h]  
00007FF771A96DA8  imul        rcx,qword ptr [rsp+248h],1Eh  
00007FF771A96DB1  inc         rcx  
00007FF771A96DB4  imul        rcx,rcx,8  
00007FF771A96DB8  mov         rax,qword ptr [rax]  
00007FF771A96DBB  add         rax,rcx  
00007FF771A96DBE  mov         qword ptr [rsp+250h],rax  
00007FF771A96DC6  jmp         opengv::relative_pose::modules::fivept_kneip::computeBasis+274h (07FF771A96E04h)  
00007FF771A96DC8  jmp         opengv::relative_pose::modules::fivept_kneip::computeBasis+274h (07FF771A96E04h)  
00007FF771A96DCA  mov         qword ptr [rsp+258h],42h  
00007FF771A96DD6  mov         rax,qword ptr [rsp+240h]  
00007FF771A96DDE  imul        rcx,qword ptr [rsp+258h],1  
00007FF771A96DE7  mov         edx,1Eh  
00007FF771A96DEC  add         rdx,rcx  
00007FF771A96DEF  mov         rcx,rdx  
00007FF771A96DF2  imul        rcx,rcx,8  
00007FF771A96DF6  mov         rax,qword ptr [rax]  
00007FF771A96DF9  add         rax,rcx  
00007FF771A96DFC  mov         qword ptr [rsp+250h],rax  
00007FF771A96E04  lea         rcx,[rsp+230h]  
00007FF771A96E0C  call        Eigen::internal::evaluator<Eigen::Matrix<double,66,197,0,66,197> >::~evaluator<Eigen::Matrix<double,66,197,0,66,197> > (07FF77158400Eh)  
00007FF771A96E11  mov         rax,qword ptr [rsp+250h]  
00007FF771A96E19  xorps       xmm0,xmm0  
00007FF771A96E1C  movsd       mmword ptr [rax],xmm0