[ODE] SIGSEGV in dSolveLCP() at ode/src/lcp.cpp:1137

Jon Watte hplus-ode at mindcontrol.org
Thu Feb 12 09:53:12 MST 2004


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
>
_______________________________________________
ODE mailing list
ODE at q12.org
http://q12.org/mailman/listinfo/ode




More information about the ODE mailing list