[ODE] Re: ALLOCA
Olivier Michel
Olivier.Michel at cyberbotics.com
Thu Feb 26 09:35:10 MST 2004
Hi,
It seems I missed something (actually the quoted text mentioned in the
[..] below didn't reached the list). I would be very curious to know how
to avoid the FREEA() macro... I may improve my patch with this idea...
-Olivier
> Jon Watte wrote:
>
>> Regarding ALLOCA, you might not need a FREEA() macro, if you
>> structure the
>> macro something like so:
>
> [..]
>
> True, I think that'd work nicely. (I often forget that ODE
> is in C++!)
>
> --Adam
Jon Watte wrote:
>I'm concerned that using MALLOC would make it significantly slower.
>
>What I've found useful in these situations is to have a linear
>allocator -- alloca() is linear in its usage pattern. Thus, you can
>allocate a large block (megabytes?) up front, and you implement the
>functions as:
>
>char * block;
>size_t top;
>
>void init_alloca()
>{
> block = malloc( MAX_ALLOCA_SIZE );
> // maybe do something that aligns "block" on 16 bytes
> top = 0;
>}
>
>void * alloca( size_t size )
>{
> // round size to good alignment
> size = (size + 15) & -16;
> top += size;
> assert( top <= MAX_ALLOCA_SIZE );
> return block+top-size;
>}
>
>void * freea( void const * ptr )
>{
> top = min( top, (char const *)ptr - block );
>}
>
>
>Make 'em inline, and you're about as efficient as alloca() is, but
>you don't gobble the stack. The cost is that you have to define how
>deep you want to go up-front. Note that this implementation is
>branch-less (assuming "min" turns into a conditional move).
>
>At the cost of adding branches (which flush pipelines and cause
>stalls when mis-predicted), you could make it return malloc() memory
>if it runs out of pre-allocated memory, and free() the block if the
>pointer isn't in the range of [block, block+MAX_ALLOCA_SIZE). This
>would make it still "work" for large problems, albeit slower.
>
>
>Cheers,
>
> / h+
>
>
>-----Original Message-----
>From: ode-bounces at q12.org [mailto:ode-bounces at q12.org]On Behalf Of
>Olivier Michel
>Sent: Thursday, February 12, 2004 3:32 AM
>Cc: ode
>Subject: Re: [ODE] SIGSEGV in dSolveLCP() at ode/src/lcp.cpp:1137
>
>
>Well, it works fine now. I patched the lcp.cpp file as follow:
>
>#define ALLOCA(x) malloc(x)
>#define FREEA(a) free(x)
>
>and I added a FREEA() for each ALLOCA() call in the source code. Now my
>simulation never crashes (great!).
>We could do the same for other files (step.cpp, matrix.cpp, etc.) and
>set up some #ifdef stuff so that the user can compile ODE in stack
>allocation of dynamic allocation mode.
>
>I volunteer to implement this patch if it will be integrated into the
>main ODE CVS trunk.
>
>Let me know what do you think about it.
>
>-Olivier
>
>
>Olivier Michel wrote:
>
>
>
>>Thanks for the replies. However, I cannot work around this problem:
>>
>>(1) I tryed increasing the heap size under Linux: "ulimit -s
>>unlimited" to increase the heap size from 8192 to unlimited, but that
>>didn't helped (might be ineffective).
>>
>>(2) I tryed to use dWorldStepFast1 instead of dWorldStep, but then all
>>my bodies are falling down breaking the joints I set. I set all the
>>masses to 1 to try to avoid this problem but it didn't change anything
>>(still collapsing the model).
>>
>>It seems the simulation works with fine dSolveLCP() when the n
>>parameter remains below ~200. However, when my two humanoid robots hit
>>each other (~44 bodies connected through joints), n reaches 384 and
>>the SIGSEGV occurs...
>>
>>I will try to replace all the ALLOCA from lcp.cpp to dynamical
>>allocations / desallocations as it seems to be the only way to work
>>around this problem, isn't it ?
>>
>>If it works, may I contribute this alternative to the ODE cvs if this
>>is usefull for others ?
>>
>>-Olivier
>>
>>Martin C. Martin wrote:
>>
>>
>>
>>>Search the docs for "stack," and you'll see at least two things you
>>>can do.
>>>
>>>- Martin
>>>
>>>Olivier Michel wrote:
>>>
>>>
>>>
>>>>Hi there,
>>>>
>>>>I have a bug in my ODE simulation which occurs in ODE dSolveLCP()
>>>>function after a while and when two objects enter in collision, but
>>>>I don't understand why a SIGSEGV occurs while creating a stack
>>>>object in ode/src/lcp.cpp:1137. Here is what I get from gdb (under
>>>>Linux/woody):
>>>>
>>>>Program received signal SIGSEGV, Segmentation fault.
>>>>[Switching to Thread 1024 (LWP 6180)]
>>>>0x0817333e in dSolveLCP (n=351, A=0xbfef1630, x=0xbfeef480,
>>>>b=0xbfeeff90,
>>>> w=0xbfeee970, nub=0, lo=0xbfff9af0, hi=0xbfff8fe0, findex=0xbfff8a54)
>>>> at ode/src/lcp.cpp:1137
>>>>1137 dLCP lcp
>>>>(n,nub,A,x,b,w,lo,hi,L,d,Dell,ell,delta_w,state,findex,p,C,Arows);
>>>>
>>>>How can the creation of a dLCP object cause a SIGSEGV ? Shall I try
>>>>to replace it by something like:
>>>>
>>>>dLCP *lcp = new dLCP(...);
>>>>
>>>>Any hint would be appreciated.
>>>>
>>>>-Olivier
>>>>
>>>>
>
>
More information about the ODE
mailing list