[ODE] Re: ALLOCA
Martin C. Martin
martin at metahuman.org
Thu Feb 26 08:22:52 MST 2004
He basically suggested a stripped down version of auto_ptr that works
with arrays.
- Martin
Olivier Michel wrote:
> 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
>>>>>
>>
>>
>>
> _______________________________________________
> ODE mailing list
> ODE at q12.org
> http://q12.org/mailman/listinfo/ode
More information about the ODE
mailing list