<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <div class="moz-cite-prefix">On 08/14/2014 07:27 AM, Matthew
      Supernaw wrote:<br>
      <br>
      Hi,<br>
      <br>
      <br>
      Actually I was impressed by how fast cppad appears to be without
      adjoint code.  I'm more worried<br>
      about how it seems to choke on a matrix a bit bigger than
      300x300.  Question is  whether this is just<br>
      due to my naive implementation.  So far the cppad gurus are
      silent. <br>
      <br>
      The order of the gradient stack is probably<br>
      crucial.  When I developed the multi-threaded autodif version I
      made the gradient stacks thread-local so<br>
      each thread has its own gradient stack.  Problem is that
      performance gain is not as much as one might<br>
      expect so I suspect cache contention problems.  I tried Intel's
      tools for this but could not identify<br>
      where the problem was. <br>
      <br>
      Presumably when using multi-threading the cppad people have solved
      the gradient stack problem. <br>
      that would be the thing they refer to as the tape.<br>
      <br>
              Dave<br>
      <br>
      <br>
      <br>
      <br>
    </div>
    <blockquote cite="mid:D2EE0DB5-39A8-4120-BCE5-E19A03EBAB0E@noaa.gov"
      type="cite">
      <div><font class="Apple-style-span" size="4">Hi Dave,</font></div>
      <div><font class="Apple-style-span" size="4"><br>
        </font></div>
      <div><font class="Apple-style-span" size="4">I'd be surprised if
          you find that cppad(running sequentially) is superior to
          autodiff. Autodiff is really fast. If I recall
          correctly, cppad was used in tmb because it plays well with
          openmp. And given that most ADMB users no little about c++
          development, it may be a desired feature to have Autodiff work
          with something like openmp.</font></div>
      <div><font class="Apple-style-span" size="4"><br>
        </font></div>
      <div><font class="Apple-style-span" size="4">A while ago I started
          reviewing the autodiff code, focusing on the operations that
          interface prevariables and the gradient stack. What I quickly
          came to realize is almost everything is accessed via pointer,
          which is good for atomic operations. Without fully
          understanding the subtle details of these interactions and
          whether or not order in the gradient stack is important, It
          appears there are a lot of areas that could benefit from
          atomic ops and thus allowing admb to run concurrently without
          doing any locking(accept when absolutely necessary). </font></div>
      <div><font class="Apple-style-span" size="4"><br>
        </font></div>
      <div><font class="Apple-style-span" size="4">For instance:</font></div>
      <div><font class="Apple-style-span" size="4"><br>
        </font></div>
      <div><font class="Apple-style-span" size="4">   if
          (++gradient_structure::RETURN_PTR >
          gradient_structure::MAX_RETURN) {</font></div>
      <div><font class="Apple-style-span" size="4">       
          gradient_structure::RETURN_PTR =
          gradient_structure::MIN_RETURN;</font></div>
      <div><font class="Apple-style-span" size="4">    }</font></div>
      <div><font class="Apple-style-span" size="4"><br>
        </font></div>
      <div><span class="Apple-style-span" style="font-size: large; ">may
          work as:</span></div>
      <div><font class="Apple-style-span" size="4"><br>
        </font></div>
      <div><font class="Apple-style-span" size="4"><br>
        </font></div>
      <div>
        <div><font class="Apple-style-span" size="4">   if (<b>atomic_increment(</b>gradient_structure::RETURN_PTR)
            > gradient_structure::MAX_RETURN) {</font></div>
        <div><font class="Apple-style-span" size="4">        <b>compare_and_swap</b>(gradient_structure::RETURN_PTR
            , gradient_structure::MIN_RETURN);</font></div>
        <div><font class="Apple-style-span" size="4">    }</font></div>
      </div>
      <div><font class="Apple-style-span" size="4"><br>
        </font></div>
      <div><font class="Apple-style-span" size="4">*this code is
          repeated at every prevariable op/function and could probably
          just be put into a function. </font></div>
      <div><font class="Apple-style-span" size="4"><br>
        </font></div>
      <div><font class="Apple-style-span" size="4">And this:</font></div>
      <div><font class="Apple-style-span" size="4"><br>
        </font></div>
      <div>
        <div><font class="Apple-style-span" size="4"><br>
          </font></div>
        <div><font class="Apple-style-span" size="4">/**</font></div>
        <div><font class="Apple-style-span" size="4"> * Description not
            yet available.</font></div>
        <div><font class="Apple-style-span" size="4"> * \param</font></div>
        <div><font class="Apple-style-span" size="4"> */</font></div>
        <div><font class="Apple-style-span" size="4">inline void
            grad_stack::set_gradient_stack4(void (*func) (void),</font></div>
        <div><font class="Apple-style-span" size="4"><span
              class="Apple-tab-span" style="white-space: pre; "> </span>  
             double *dep_addr,</font></div>
        <div><font class="Apple-style-span" size="4"><span
              class="Apple-tab-span" style="white-space: pre; "> </span>  
             double *ind_addr1,</font></div>
        <div><font class="Apple-style-span" size="4"><span
              class="Apple-tab-span" style="white-space: pre; "> </span>  
             double *ind_addr2)</font></div>
        <div><font class="Apple-style-span" size="4">{</font></div>
        <div><font class="Apple-style-span" size="4">#ifdef NO_DERIVS</font></div>
        <div><font class="Apple-style-span" size="4">   if
            (!gradient_structure::no_derivatives)</font></div>
        <div><font class="Apple-style-span" size="4">   {</font></div>
        <div><font class="Apple-style-span" size="4">#endif</font></div>
        <div><font class="Apple-style-span" size="4">      if (ptr >
            ptr_last)</font></div>
        <div><font class="Apple-style-span" size="4">      {</font></div>
        <div><font class="Apple-style-span" size="4"><span
              class="Apple-tab-span" style="white-space: pre; "> </span> //
            current buffer is full -- write it to disk and reset pointer</font></div>
        <div><font class="Apple-style-span" size="4"><span
              class="Apple-tab-span" style="white-space: pre; "> </span> //
            and counter</font></div>
        <div><font class="Apple-style-span" size="4"><span
              class="Apple-tab-span" style="white-space: pre; "> </span> this->write_grad_stack_buffer();</font></div>
        <div><font class="Apple-style-span" size="4">      }</font></div>
        <div><font class="Apple-style-span" size="4">      ptr->func
            = func;</font></div>
        <div><font class="Apple-style-span" size="4">     
            ptr->dep_addr = dep_addr;</font></div>
        <div><font class="Apple-style-span" size="4">     
            ptr->ind_addr1 = ind_addr1;</font></div>
        <div><font class="Apple-style-span" size="4">     
            ptr->ind_addr2 = ind_addr2;</font></div>
        <div><font class="Apple-style-span" size="4">      ptr++;</font></div>
        <div><font class="Apple-style-span" size="4">#ifdef NO_DERIVS</font></div>
        <div><font class="Apple-style-span" size="4">   }</font></div>
        <div><font class="Apple-style-span" size="4">#endif</font></div>
        <div><font class="Apple-style-span" size="4">}</font></div>
        <div><font class="Apple-style-span" size="4"><br>
          </font></div>
        <div><font class="Apple-style-span" size="4">Might work as:</font></div>
        <div><font class="Apple-style-span" size="4"><br>
          </font></div>
        <div><font class="Apple-style-span" size="4">/**</font></div>
        <div><font class="Apple-style-span" size="4"> * Description not
            yet available.</font></div>
        <div><font class="Apple-style-span" size="4"> * \param</font></div>
        <div><font class="Apple-style-span" size="4"> */</font></div>
        <div><font class="Apple-style-span" size="4">inline void
            grad_stack::set_gradient_stack4(void (*func) (void),</font></div>
        <div><font class="Apple-style-span" size="4"><span
              class="Apple-tab-span" style="white-space: pre; "> </span>  
             double *dep_addr,</font></div>
        <div><font class="Apple-style-span" size="4"><span
              class="Apple-tab-span" style="white-space: pre; "> </span>  
             double *ind_addr1,</font></div>
        <div><font class="Apple-style-span" size="4"><span
              class="Apple-tab-span" style="white-space: pre; "> </span>  
             double *ind_addr2)</font></div>
        <div><font class="Apple-style-span" size="4">{</font></div>
        <div><font class="Apple-style-span" size="4">#ifdef NO_DERIVS</font></div>
        <div><font class="Apple-style-span" size="4">   if
            (!gradient_structure::no_derivatives)</font></div>
        <div><font class="Apple-style-span" size="4">   {</font></div>
        <div><font class="Apple-style-span" size="4">#endif</font></div>
        <div><font class="Apple-style-span" size="4">
            <div style="font-size: medium; "><font
                class="Apple-style-span" size="4">   <b>  
                  grad_stack_entry* ptr_l = ptr;</b></font></div>
            <div style="font-size: medium; "><font
                class="Apple-style-span" size="4">      <b>atomic_increment</b>(ptr);</font></div>
            <div style="font-size: medium; "><font
                class="Apple-style-span" size="4"><br>
              </font></div>
          </font></div>
        <div><font class="Apple-style-span" size="4">      if (</font><span
            class="Apple-style-span" style="font-size: large; ">ptr_l</span> <span
            class="Apple-style-span" style="font-size: large; ">>
            ptr_last)</span></div>
        <div><font class="Apple-style-span" size="4">      {</font></div>
        <div><font class="Apple-style-span" size="4"><span
              class="Apple-tab-span" style="white-space: pre; "> </span><b>lock</b>();</font></div>
        <div><font class="Apple-style-span" size="4"><span
              class="Apple-tab-span" style="white-space: pre; "> </span> //
            current buffer is full -- write it to disk and reset pointer</font></div>
        <div><font class="Apple-style-span" size="4"><span
              class="Apple-tab-span" style="white-space: pre; "> </span> //
            and counter</font></div>
        <div><font class="Apple-style-span" size="4"><span
              class="Apple-tab-span" style="white-space: pre; "> </span> this->write_grad_stack_buffer();</font></div>
        <div><font class="Apple-style-span" size="4"><span
              class="Apple-tab-span" style="white-space: pre; "> </span><b>unlock</b>();</font></div>
        <div><font class="Apple-style-span" size="4">      }</font></div>
        <div><font class="Apple-style-span" size="4"><br>
          </font></div>
        <div><font class="Apple-style-span" size="4">    </font></div>
        <div><font class="Apple-style-span" size="4">      </font><span
            class="Apple-style-span" style="font-size: large; "><b>ptr_l</b></span><font
            class="Apple-style-span" size="4">->func = func;</font></div>
        <div><font class="Apple-style-span" size="4">      </font><span
            class="Apple-style-span" style="font-size: large; "><b>ptr_l</b></span><font
            class="Apple-style-span" size="4">->dep_addr = dep_addr;</font></div>
        <div><font class="Apple-style-span" size="4">      </font><span
            class="Apple-style-span" style="font-size: large; "><b>ptr_l</b></span><font
            class="Apple-style-span" size="4">->ind_addr1 =
            ind_addr1;</font></div>
        <div><font class="Apple-style-span" size="4">      </font><span
            class="Apple-style-span" style="font-size: large; "><b>ptr_l</b></span><font
            class="Apple-style-span" size="4">->ind_addr2 =
            ind_addr2;</font></div>
        <div><font class="Apple-style-span" size="4">      </font></div>
        <div><font class="Apple-style-span" size="4">#ifdef NO_DERIVS</font></div>
        <div><font class="Apple-style-span" size="4">   }</font></div>
        <div><font class="Apple-style-span" size="4">#endif</font></div>
        <div><font class="Apple-style-span" size="4">}</font></div>
      </div>
      <div><font class="Apple-style-span" size="4"> </font></div>
      <div><font class="Apple-style-span" size="4">The above code is
          untested and not well though out. It may also require some
          memory barriers. </font></div>
      <div><font class="Apple-style-span" size="4"><br>
        </font></div>
      <div><font class="Apple-style-span" size="4">Anyway, I may be on
          the wrong track here, but at a first glance it seems like a
          real possibility as far simplifying concurrent operations for
          the average user.  </font><span class="Apple-style-span"
          style="font-size: large; ">Do you think this would work?</span></div>
      <div><font class="Apple-style-span" size="4"><br>
        </font></div>
      <div><font class="Apple-style-span" size="4">Matthew</font></div>
      <div><span class="Apple-style-span" style="font-size: 17px; "><br>
        </span></div>
      <div>
        <span class="Apple-style-span" style="border-collapse: separate;
          color: rgb(0, 0, 0); font-family: Helvetica; font-style:
          normal; font-variant: normal; font-weight: normal;
          letter-spacing: normal; line-height: normal; orphans: 2;
          text-align: -webkit-auto; text-indent: 0px; text-transform:
          none; white-space: normal; widows: 2; word-spacing: 0px;
          -webkit-border-horizontal-spacing: 0px;
          -webkit-border-vertical-spacing: 0px;
          -webkit-text-decorations-in-effect: none;
          -webkit-text-size-adjust: auto; -webkit-text-stroke-width:
          0px; font-size: medium; ">
          <div>
            <div>Matthew Supernaw</div>
            <div>Scientific Programmer</div>
            <div>National Oceanic and Atmospheric Administration</div>
            <div>National Marine Fisheries Service</div>
            <div>Sustainable Fisheries Division</div>
            <div>St. Petersburg, FL, 33701</div>
            <div>Office 727-551-5606</div>
            <div>Fax 727-824-5300</div>
          </div>
        </span>
      </div>
      <br>
      <div>
        <div>On Aug 13, 2014, at 12:26 PM, <a moz-do-not-send="true"
            href="mailto:developers-request@admb-project.org">developers-request@admb-project.org</a>
          wrote:</div>
        <br class="Apple-interchange-newline">
        <blockquote type="cite">
          <div>Send Developers mailing list submissions to<br>
            <span class="Apple-tab-span" style="white-space:pre"> </span><a
              moz-do-not-send="true"
              href="mailto:developers@admb-project.org">developers@admb-project.org</a><br>
            <br>
            To subscribe or unsubscribe via the World Wide Web, visit<br>
            <span class="Apple-tab-span" style="white-space:pre"> </span><a class="moz-txt-link-freetext" href="http://lists.admb-project.org/mailman/listinfo/developers">http://lists.admb-project.org/mailman/listinfo/developers</a><br>
            or, via email, send a message with subject or body 'help' to<br>
            <span class="Apple-tab-span" style="white-space:pre"> </span><a class="moz-txt-link-abbreviated" href="mailto:developers-request@admb-project.org">developers-request@admb-project.org</a><br>
            <br>
            You can reach the person managing the list at<br>
            <span class="Apple-tab-span" style="white-space:pre"> </span><a class="moz-txt-link-abbreviated" href="mailto:developers-owner@admb-project.org">developers-owner@admb-project.org</a><br>
            <br>
            When replying, please edit your Subject line so it is more
            specific<br>
            than "Re: Contents of Developers digest..."<br>
            <br>
            <br>
            Today's Topics:<br>
            <br>
              1. trying to compare autodif with cppad (dave fournier)<br>
              2. Re: trying to compare autodif with cppad (dave
            fournier)<br>
              3. Re: trying to compare autodif with cppad (Steve
            Martell)<br>
            <br>
            <br>
----------------------------------------------------------------------<br>
            <br>
            Message: 1<br>
            Date: Tue, 12 Aug 2014 20:26:23 -0700<br>
            From: dave fournier <a class="moz-txt-link-rfc2396E" href="mailto:davef@otter-rsch.com"><davef@otter-rsch.com></a><br>
            To: <a class="moz-txt-link-rfc2396E" href="mailto:developers@admb-project.org">"developers@admb-project.org"</a>
            <a class="moz-txt-link-rfc2396E" href="mailto:developers@admb-project.org"><developers@admb-project.org></a><br>
            Subject: [Developers] trying to compare autodif with cppad<br>
            Message-ID: <a class="moz-txt-link-rfc2396E" href="mailto:53EADADF.8080002@otter-rsch.com"><53EADADF.8080002@otter-rsch.com></a><br>
            Content-Type: text/plain; charset="iso-8859-1";
            Format="flowed"<br>
            <br>
            <br>
               There has been a lot of material about TMB lately.  I
            think that TMB <br>
            uses cppad as its underlying AD engine.   I am interested in<br>
            trying to understand if cppad is superior to autodif and if
            so whether <br>
            ADMB could be modified to use cppad.<br>
            <br>
            As a first attempt I have been working at reproducing the LU
            <br>
            decomposition to calculate the log of<br>
            (the absolutevalue of ) the determinant of a matrix.  The
            code is <br>
            attached.  myreverse.cpp calculates the log det and<br>
            the gradient via reverse model AD using cppad.
             myreverse_admb.cpp does <br>
            the same thing using autodif.<br>
            <br>
            For a 300x300 matrix the time required for these
            calculations is <br>
            approximately  .25 seconds for autodif and 19 seconds for
            cppad so that<br>
            autodif is about 75 times faster.  Obviously there may be
            techniques <br>
            which can speed up cppad or I may have made<br>
            some beginners error.  Perhaps the experts among us could
            comment.<br>
            <br>
            I could not compare matrices larger than 300x300 because the
            cppad code <br>
            crashed.  The autodif version<br>
            could do a 500x500 matrix in 1.23 seconds and a 1000x1000
            matrix in 11 <br>
            seconds.<br>
            <br>
            -------------- next part --------------<br>
            A non-text attachment was scrubbed...<br>
            Name: myreverse_admb.cpp<br>
            Type: text/x-c++src<br>
            Size: 1243 bytes<br>
            Desc: not available<br>
            URL:
<a class="moz-txt-link-rfc2396E" href="http://lists.admb-project.org/pipermail/developers/attachments/20140812/649cb355/attachment-0002.cpp"><http://lists.admb-project.org/pipermail/developers/attachments/20140812/649cb355/attachment-0002.cpp></a><br>
            -------------- next part --------------<br>
            A non-text attachment was scrubbed...<br>
            Name: myreverse.cpp<br>
            Type: text/x-c++src<br>
            Size: 3464 bytes<br>
            Desc: not available<br>
            URL:
<a class="moz-txt-link-rfc2396E" href="http://lists.admb-project.org/pipermail/developers/attachments/20140812/649cb355/attachment-0003.cpp"><http://lists.admb-project.org/pipermail/developers/attachments/20140812/649cb355/attachment-0003.cpp></a><br>
            <br>
            ------------------------------<br>
            <br>
            Message: 2<br>
            Date: Wed, 13 Aug 2014 06:57:31 -0700<br>
            From: dave fournier <a class="moz-txt-link-rfc2396E" href="mailto:davef@otter-rsch.com"><davef@otter-rsch.com></a><br>
            To: Kasper Kristensen <a class="moz-txt-link-rfc2396E" href="mailto:kaskr@dtu.dk"><kaskr@dtu.dk></a><br>
            Cc: <a class="moz-txt-link-rfc2396E" href="mailto:developers@admb-project.org">"developers@admb-project.org"</a>
            <a class="moz-txt-link-rfc2396E" href="mailto:developers@admb-project.org"><developers@admb-project.org></a><br>
            Subject: Re: [Developers] trying to compare autodif with
            cppad<br>
            Message-ID: <a class="moz-txt-link-rfc2396E" href="mailto:53EB6ECB.1000604@otter-rsch.com"><53EB6ECB.1000604@otter-rsch.com></a><br>
            Content-Type: text/plain; charset="iso-8859-1";
            Format="flowed"<br>
            <br>
            On 08/12/2014 10:01 PM, Kasper Kristensen wrote:<br>
            <br>
            Sorry about forgetting the hpp file. It is now attached.
             CPPAD version <br>
            is now much faster<br>
            with the -DNDEBUG option.  However when I increase the
            matrix size to <br>
            500x500  (I'm aiming for fast 2,000x2,000)<br>
             the cppad version produces NANS. Also note that the autodif
            version <br>
            produces the numbers and stores them<br>
            in a file named vector for the cppad version.<br>
            <br>
                  Dave<br>
            <br>
            <br>
            <br>
            <blockquote type="cite">Dave,<br>
            </blockquote>
            <blockquote type="cite"><br>
            </blockquote>
            <blockquote type="cite">I could not run your test because
              "myldet.hpp" was not attached.<br>
            </blockquote>
            <blockquote type="cite">Did you try set the "-DNDEBUG" flag
              with the cppad compilation? If I recall correctly this
              could make a big difference.<br>
            </blockquote>
            <blockquote type="cite"><br>
            </blockquote>
            <blockquote type="cite">Kasper<br>
            </blockquote>
            <blockquote type="cite"><br>
            </blockquote>
            <blockquote type="cite"><br>
            </blockquote>
            <blockquote type="cite"><br>
            </blockquote>
            <blockquote type="cite">________________________________________<br>
            </blockquote>
            <blockquote type="cite">From:
              <a class="moz-txt-link-abbreviated" href="mailto:developers-bounces@admb-project.org">developers-bounces@admb-project.org</a>
              [<a class="moz-txt-link-abbreviated" href="mailto:developers-bounces@admb-project.org">developers-bounces@admb-project.org</a>] on behalf of dave
              fournier [<a class="moz-txt-link-abbreviated" href="mailto:davef@otter-rsch.com">davef@otter-rsch.com</a>]<br>
            </blockquote>
            <blockquote type="cite">Sent: Wednesday, August 13, 2014
              5:26 AM<br>
            </blockquote>
            <blockquote type="cite">To: <a class="moz-txt-link-abbreviated" href="mailto:developers@admb-project.org">developers@admb-project.org</a><br>
            </blockquote>
            <blockquote type="cite">Subject: [Developers] trying to
              compare autodif with cppad<br>
            </blockquote>
            <blockquote type="cite"><br>
            </blockquote>
            <blockquote type="cite">     There has been a lot of
              material about TMB lately.  I think that TMB<br>
            </blockquote>
            <blockquote type="cite">uses cppad as its underlying AD
              engine.   I am interested in<br>
            </blockquote>
            <blockquote type="cite">trying to understand if cppad is
              superior to autodif and if so whether<br>
            </blockquote>
            <blockquote type="cite">ADMB could be modified to use cppad.<br>
            </blockquote>
            <blockquote type="cite"><br>
            </blockquote>
            <blockquote type="cite">As a first attempt I have been
              working at reproducing the LU<br>
            </blockquote>
            <blockquote type="cite">decomposition to calculate the log
              of<br>
            </blockquote>
            <blockquote type="cite">(the absolutevalue of ) the
              determinant of a matrix.  The code is<br>
            </blockquote>
            <blockquote type="cite">attached.  myreverse.cpp calculates
              the log det and<br>
            </blockquote>
            <blockquote type="cite">the gradient via reverse model AD
              using cppad.  myreverse_admb.cpp does<br>
            </blockquote>
            <blockquote type="cite">the same thing using autodif.<br>
            </blockquote>
            <blockquote type="cite"><br>
            </blockquote>
            <blockquote type="cite">For a 300x300 matrix the time
              required for these calculations is<br>
            </blockquote>
            <blockquote type="cite">approximately  .25 seconds for
              autodif and 19 seconds for cppad so that<br>
            </blockquote>
            <blockquote type="cite">autodif is about 75 times faster.
               Obviously there may be techniques<br>
            </blockquote>
            <blockquote type="cite">which can speed up cppad or I may
              have made<br>
            </blockquote>
            <blockquote type="cite">some beginners error.  Perhaps the
              experts among us could comment.<br>
            </blockquote>
            <blockquote type="cite"><br>
            </blockquote>
            <blockquote type="cite">I could not compare matrices larger
              than 300x300 because the cppad code<br>
            </blockquote>
            <blockquote type="cite">crashed.  The autodif version<br>
            </blockquote>
            <blockquote type="cite">could do a 500x500 matrix in 1.23
              seconds and a 1000x1000 matrix in 11<br>
            </blockquote>
            <blockquote type="cite">seconds.<br>
            </blockquote>
            <blockquote type="cite"><br>
            </blockquote>
            <blockquote type="cite"><br>
            </blockquote>
            <br>
            -------------- next part --------------<br>
            A non-text attachment was scrubbed...<br>
            Name: myldet.hpp<br>
            Type: text/x-c++hdr<br>
            Size: 4652 bytes<br>
            Desc: not available<br>
            URL:
<a class="moz-txt-link-rfc2396E" href="http://lists.admb-project.org/pipermail/developers/attachments/20140813/33736199/attachment-0001.hpp"><http://lists.admb-project.org/pipermail/developers/attachments/20140813/33736199/attachment-0001.hpp></a><br>
            -------------- next part --------------<br>
            A non-text attachment was scrubbed...<br>
            Name: myreverse.cpp<br>
            Type: text/x-c++src<br>
            Size: 3464 bytes<br>
            Desc: not available<br>
            URL:
<a class="moz-txt-link-rfc2396E" href="http://lists.admb-project.org/pipermail/developers/attachments/20140813/33736199/attachment-0002.cpp"><http://lists.admb-project.org/pipermail/developers/attachments/20140813/33736199/attachment-0002.cpp></a><br>
            -------------- next part --------------<br>
            A non-text attachment was scrubbed...<br>
            Name: reverse_one.cpp<br>
            Type: text/x-c++src<br>
            Size: 2858 bytes<br>
            Desc: not available<br>
            URL:
<a class="moz-txt-link-rfc2396E" href="http://lists.admb-project.org/pipermail/developers/attachments/20140813/33736199/attachment-0003.cpp"><http://lists.admb-project.org/pipermail/developers/attachments/20140813/33736199/attachment-0003.cpp></a><br>
            <br>
            ------------------------------<br>
            <br>
            Message: 3<br>
            Date: Wed, 13 Aug 2014 16:26:23 +0000<br>
            From: Steve Martell <a class="moz-txt-link-rfc2396E" href="mailto:SteveM@iphc.int"><SteveM@iphc.int></a><br>
            To: dave fournier <a class="moz-txt-link-rfc2396E" href="mailto:davef@otter-rsch.com"><davef@otter-rsch.com></a><br>
            Cc: <a class="moz-txt-link-rfc2396E" href="mailto:developers@admb-project.org">"developers@admb-project.org"</a>
            <a class="moz-txt-link-rfc2396E" href="mailto:developers@admb-project.org"><developers@admb-project.org></a>,<br>
            <span class="Apple-tab-span" style="white-space:pre"> </span>Kasper
            Kristensen <a class="moz-txt-link-rfc2396E" href="mailto:kaskr@dtu.dk"><kaskr@dtu.dk></a><br>
            Subject: Re: [Developers] trying to compare autodif with
            cppad<br>
            Message-ID:
            <a class="moz-txt-link-rfc2396E" href="mailto:29A1581F-2ADE-412F-85C2-6D2904CEA97D@iphc.int"><29A1581F-2ADE-412F-85C2-6D2904CEA97D@iphc.int></a><br>
            Content-Type: text/plain; charset="iso-8859-1"<br>
            <br>
            Dave I was able to compile and run your examples.<br>
---------------------------------------------------------------------<br>
            With n=300 here are the run times.<br>
            myreverse_admb (safe mode):<br>
            real    0m0.643s<br>
            user    0m0.615s<br>
            sys     0m0.015s<br>
            <br>
            <br>
            myreverse_admb (optimize):<br>
            real    0m0.368s<br>
            user    0m0.337s<br>
            sys     0m0.014s<br>
            <br>
            Using the cppad<br>
            myreverse:<br>
            real    0m17.875s<br>
            user    0m17.010s<br>
            sys     0m0.847s<br>
            <br>
            <br>
            myreverse with -DNDEBUG flag:<br>
            real    0m5.287s<br>
            user    0m4.894s<br>
            sys     0m0.378s<br>
            <br>
---------------------------------------------------------------------<br>
            With n=500<br>
            myreverse_admb (safe mode):<br>
            real    0m2.414s<br>
            user    0m2.341s<br>
            sys     0m0.035s<br>
            <br>
            myreverse_admb (optimize):<br>
            real    0m1.450s<br>
            user    0m1.378s<br>
            sys     0m0.035s<br>
            <br>
            Using the cppad<br>
            myreverse:<br>
            n = 500<br>
            cppad-20140530 error from a known source:<br>
            dw = f.Reverse(q, w): has a nan,<br>
            but none of its Taylor coefficents are nan.<br>
            Error detected by false result for<br>
               ! ( hasnan(value) && check_for_nan_ )<br>
            at line 202 in the file<br>
               /usr/include/cppad/local/reverse.hpp<br>
            Assertion failed: (false), function Default, file
            /usr/include/cppad/error_handler.hpp, line 210.<br>
            Abort trap: 6<br>
            <br>
            real    1m19.457s<br>
            user    1m15.951s<br>
            sys     0m3.180s<br>
            bash-3.2$<br>
            <br>
            myreverse with -DNDEBUG flag:<br>
            n=500<br>
            output is nan's<br>
            real    0m23.766s<br>
            user    0m22.090s<br>
            sys     0m1.643s<br>
---------------------------------------------------------------------<br>
            Steve<br>
            <br>
            <br>
            On Aug 13, 2014, at 6:58 AM, dave fournier
            <a class="moz-txt-link-rfc2396E" href="mailto:davef@otter-rsch.com"><davef@otter-rsch.com></a> wrote:<br>
            <br>
            <blockquote type="cite">On 08/12/2014 10:01 PM, Kasper
              Kristensen wrote:<br>
            </blockquote>
            <blockquote type="cite"><br>
            </blockquote>
            <blockquote type="cite">Sorry about forgetting the hpp file.
              It is now attached.  CPPAD version is now much faster<br>
            </blockquote>
            <blockquote type="cite">with the -DNDEBUG option.  However
              when I increase the matrix size to 500x500  (I'm aiming
              for fast 2,000x2,000)<br>
            </blockquote>
            <blockquote type="cite">the cppad version produces NANS.
              Also note that the autodif version produces the numbers
              and stores them<br>
            </blockquote>
            <blockquote type="cite">in a file named vector for the cppad
              version.<br>
            </blockquote>
            <blockquote type="cite"><br>
            </blockquote>
            <blockquote type="cite">     Dave<br>
            </blockquote>
            <blockquote type="cite"><br>
            </blockquote>
            <blockquote type="cite"><br>
            </blockquote>
            <blockquote type="cite"><br>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">Dave,<br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite"><br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">I could not run your test because
                "myldet.hpp" was not attached.<br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">Did you try set the "-DNDEBUG"
                flag with the cppad compilation? If I recall correctly
                this could make a big difference.<br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite"><br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">Kasper<br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite"><br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite"><br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite"><br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">________________________________________<br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">From:
                <a class="moz-txt-link-abbreviated" href="mailto:developers-bounces@admb-project.org">developers-bounces@admb-project.org</a>
                [<a class="moz-txt-link-abbreviated" href="mailto:developers-bounces@admb-project.org">developers-bounces@admb-project.org</a>] on behalf of dave
                fournier [<a class="moz-txt-link-abbreviated" href="mailto:davef@otter-rsch.com">davef@otter-rsch.com</a>]<br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">Sent: Wednesday, August 13, 2014
                5:26 AM<br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">To: <a class="moz-txt-link-abbreviated" href="mailto:developers@admb-project.org">developers@admb-project.org</a><br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">Subject: [Developers] trying to
                compare autodif with cppad<br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite"><br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">    There has been a lot of
                material about TMB lately.  I think that TMB<br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">uses cppad as its underlying AD
                engine.   I am interested in<br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">trying to understand if cppad is
                superior to autodif and if so whether<br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">ADMB could be modified to use
                cppad.<br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite"><br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">As a first attempt I have been
                working at reproducing the LU<br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">decomposition to calculate the log
                of<br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">(the absolutevalue of ) the
                determinant of a matrix.  The code is<br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">attached.  myreverse.cpp
                calculates the log det and<br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">the gradient via reverse model AD
                using cppad.  myreverse_admb.cpp does<br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">the same thing using autodif.<br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite"><br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">For a 300x300 matrix the time
                required for these calculations is<br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">approximately  .25 seconds for
                autodif and 19 seconds for cppad so that<br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">autodif is about 75 times faster.
                 Obviously there may be techniques<br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">which can speed up cppad or I may
                have made<br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">some beginners error.  Perhaps the
                experts among us could comment.<br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite"><br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">I could not compare matrices
                larger than 300x300 because the cppad code<br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">crashed.  The autodif version<br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">could do a 500x500 matrix in 1.23
                seconds and a 1000x1000 matrix in 11<br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite">seconds.<br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite"><br>
              </blockquote>
            </blockquote>
            <blockquote type="cite">
              <blockquote type="cite"><br>
              </blockquote>
            </blockquote>
            <blockquote type="cite"><br>
            </blockquote>
            <blockquote type="cite"><myldet.hpp><myreverse.cpp><reverse_one.cpp>_______________________________________________<br>
            </blockquote>
            <blockquote type="cite">Developers mailing list<br>
            </blockquote>
            <blockquote type="cite"><a class="moz-txt-link-abbreviated" href="mailto:Developers@admb-project.org">Developers@admb-project.org</a><br>
            </blockquote>
            <blockquote type="cite"><a class="moz-txt-link-freetext" href="http://lists.admb-project.org/mailman/listinfo/developers">http://lists.admb-project.org/mailman/listinfo/developers</a><br>
            </blockquote>
            <br>
            <br>
            ________________________________<br>
            <br>
            This internet e-mail message, and any files transmitted with
            it, contains confidential, privileged information that is
            intended only for the addressee. If you have received this
            e-mail message in error, please call us at (206) 634-1838
            collect if necessary) and ask to speak to the message
            sender. Nothing in this e-mail or the act of transmitting
            it, is to be construed as a waiver of any rights or
            privileges enjoyed by the sender or the International
            Pacific Halibut Commission pursuant to the International
            Organizations Immunities Act, 22 U.S.C. Sec. 288 et seq.<br>
            <br>
            <br>
            ------------------------------<br>
            <br>
            _______________________________________________<br>
            Developers mailing list<br>
            <a class="moz-txt-link-abbreviated" href="mailto:Developers@admb-project.org">Developers@admb-project.org</a><br>
            <a class="moz-txt-link-freetext" href="http://lists.admb-project.org/mailman/listinfo/developers">http://lists.admb-project.org/mailman/listinfo/developers</a><br>
            <br>
            <br>
            End of Developers Digest, Vol 64, Issue 12<br>
            ******************************************<br>
          </div>
        </blockquote>
      </div>
      <br>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
Developers mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Developers@admb-project.org">Developers@admb-project.org</a>
<a class="moz-txt-link-freetext" href="http://lists.admb-project.org/mailman/listinfo/developers">http://lists.admb-project.org/mailman/listinfo/developers</a>
</pre>
    </blockquote>
    <br>
  </body>
</html>