[ADOL-C] Memory issue with ADOL-C adouble creation

Alex Dowling awdowlin at andrew.cmu.edu
Wed Oct 16 11:07:06 EDT 2013


Hello,

I'm using ADOL-C and adjoint sensitivity equations to provide derivatives
for a nonlinear optimal control problem. As part of the debugging process
we ran Valgrind on the code and found some memory issues. Running with
Valgrind also caused a segmentation fault:

yajun at hessian:~/svn/psaProject/combined2$ valgrind ./compare
==1841== Memcheck, a memory error detector
==1841== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==1841== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==1841== Command: ./compare
==1841==

*Console output from the optimization code removed*

==1841== Invalid write of size 8
==1841==    at 0x4E3E7C3: adouble::adouble() (adouble.cpp:66)
==1841==    by 0x436437: tracerhs(double, double*, double*, double*,
JACTYPE, bool, int) (tracer_ss.c:34)
==1841==    by 0x439363: fQuad(double, _generic_N_Vector*,
_generic_N_Vector*, _generic_N_Vector*, void*) (ss_adjoint.c:909)
==1841==    by 0x45F3D3: CVArhsQ (in
/home/yajun/svn/psaProject/combined2/compare)
==1841==    by 0x44CFF5: cvQuadNls (in
/home/yajun/svn/psaProject/combined2/compare)
==1841==    by 0x44901C: cvStep (in
/home/yajun/svn/psaProject/combined2/compare)
==1841==    by 0x44362B: CVode (in
/home/yajun/svn/psaProject/combined2/compare)
==1841==    by 0x45AE1E: CVodeB (in
/home/yajun/svn/psaProject/combined2/compare)
==1841==    by 0x43ABAC: simCycles_withAdjoints(double*, double*, double*,
int, Logs, double*, double*, int*, int*) (ss_adjoint.c:348)
==1841==    by 0x4148FF: main (perturb.cpp:105)
==1841==  Address 0xa73e818 is not stack'd, malloc'd or (recently) free'd
==1841==
==1841==
==1841== Process terminating with default action of signal 11 (SIGSEGV)
==1841==  Access not within mapped region at address 0xA73E818
==1841==    at 0x4E3E7C3: adouble::adouble() (adouble.cpp:66)
==1841==    by 0x436437: tracerhs(double, double*, double*, double*,
JACTYPE, bool, int) (tracer_ss.c:34)
==1841==    by 0x439363: fQuad(double, _generic_N_Vector*,
_generic_N_Vector*, _generic_N_Vector*, void*) (ss_adjoint.c:909)
==1841==    by 0x45F3D3: CVArhsQ (in
/home/yajun/svn/psaProject/combined2/compare)
==1841==    by 0x44CFF5: cvQuadNls (in
/home/yajun/svn/psaProject/combined2/compare)
==1841==    by 0x44901C: cvStep (in
/home/yajun/svn/psaProject/combined2/compare)
==1841==    by 0x44362B: CVode (in
/home/yajun/svn/psaProject/combined2/compare)
==1841==    by 0x45AE1E: CVodeB (in
/home/yajun/svn/psaProject/combined2/compare)
==1841==    by 0x43ABAC: simCycles_withAdjoints(double*, double*, double*,
int, Logs, double*, double*, int*, int*) (ss_adjoint.c:348)
==1841==    by 0x4148FF: main (perturb.cpp:105)
==1841==  If you believe this happened as a result of a stack
==1841==  overflow in your program's main thread (unlikely but
==1841==  possible), you can try to increase the size of the
==1841==  main thread stack using the --main-stacksize= flag.
==1841==  The main thread stack size used in this run was 8388608.
==1841==
==1841== HEAP SUMMARY:
==1841==     in use at exit: 20,183,646 bytes in 31,127 blocks
==1841==   total heap usage: 3,172,497 allocs, 3,141,370 frees, 203,707,733
bytes allocated
==1841==
==1841== LEAK SUMMARY:
==1841==    definitely lost: 0 bytes in 0 blocks
==1841==    indirectly lost: 0 bytes in 0 blocks
==1841==      possibly lost: 34 bytes in 1 blocks
==1841==    still reachable: 20,183,612 bytes in 31,126 blocks
==1841==         suppressed: 0 bytes in 0 blocks
==1841== Rerun with --leak-check=full to see details of leaked memory
==1841==
==1841== For counts of detected and suppressed errors, rerun with: -v
==1841== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 2 from 2)
Segmentation fault (core dumped)

Here is line 34 of tracer_ss.c:
  adouble *cd = new adouble[NEQ];

And lines 53 - 70 of adouble.c:
adouble::adouble() {
    location = next_loc();
    ADOLC_OPENMP_THREAD_NUMBER;
    ADOLC_OPENMP_GET_THREAD_NUMBER;

#if defined(ADOLC_ADOUBLE_STDCZERO)
    if (ADOLC_CURRENT_TAPE_INFOS.traceFlag) {
        put_op(assign_d_zero);
        ADOLC_PUT_LOCINT(location);   // = res
    }

    ++ADOLC_CURRENT_TAPE_INFOS.numTays_Tape;
    if (ADOLC_CURRENT_TAPE_INFOS.keepTaylors)
        ADOLC_WRITE_SCAYLOR(ADOLC_GLOBAL_TAPE_VARS.store[location]); //
Line 66

    ADOLC_GLOBAL_TAPE_VARS.store[location] = 0.;
#endif
}

Has anyone seen this behavior before? Does it mean the dimensions of cd*
are violated, or is there a problem with the adouble constructor?

Versions information: ADOL-C: 2.4.1, ColPack: 1.0.9, CVODES (integrator):
2.7.0

Thanks,
Alex
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://list.coin-or.org/pipermail/adol-c/attachments/20131016/3959dd81/attachment.html>


More information about the ADOL-C mailing list