> On Mar 10, 2017, at 8:45 AM, Karl Rupp <[email protected]> wrote:
> 
> Hey,
> 
> my only concern with this solution is that the lookup via indices relies on 
> global state. Since PETSc relies on global state at a bunch of other places 
> (e.g. logging), this may not be a relevant concern.

   The OS keeps a little global state around too :-( What's the harm in this 
little table in "global state"?
> 
> If, however, the long-term goal is to get rid of global state, then we would 
> have to store a matching deallocation routine with the raw buffer. Actually, 
> you could store the function pointers to malloc/realloc/free in the first 
> bytes of the allocated buffer instead of an index.

    That was my original thought but this is more likely to cause a random 
crash if that space is corrupted; by using integers one can detect the 
corruption before the crash occurs (in 99.9+ % of the cases of corruption)

> With 256/512-byte-alignment it may not matter in terms of memory footprint 
> whether you store a single integer or whether you store three function 
> pointers.
> 
> Best regards,
> Karli
> 
> 
> 
> On 03/10/2017 01:19 AM, Barry Smith wrote:
>> 
>>  Using different mallocs for different objects/arrays in PETSc is very iffy 
>> because each free() has to match the malloc used for that memory. This is 
>> even true with just -malloc_debug in that certain initialization functions 
>> in PETSc need to use the raw malloc() because we cannot be sure if the 
>> (*PetscTrMalloc)() has been set yet and the raw free() that comes at 
>> PetscFinalize() time needs to be matched with it.
>> 
>>  Why not have PetscMalloc() ALWAYS allocate an extra 64 bit space at the 
>> beginning and put in an integer indicating the malloc family that has been 
>> used to get the space. PetscFree() would use this integer to determine the 
>> correct free() to use. A mechanism to register new malloc families could be 
>> easily done, for example
>> 
>>    PetscMallocRegister(malloc,realloc,free,&basicmalloc);
>>    
>> PetscMallocRegister(PetscMallocDebug,PetscReallocDebug,PetscFreeDebug,&debugmalloc);
>>    
>> PetscMallocRegister(PetscMallocHBW,PetscReallocHBW,PetscFreeHBW,&hbwmalloc);
>> 
>>    To change the malloc used you would do PetscMallocPush(debugmalloc);  
>> PetscMalloc(....); .... PetscMallocPop();  Note that you can register 
>> additional malloc families at any time (it doesn't have to be as soon as the 
>> program starts up).
>> 
>>   What is wrong with the model and why shouldn't we use it?
>> 
>>  Barry
>> 
>> Notes:
>> 
>> It is easy to implement, so that is not a reason.
>> 
>> The extra memory usage is trivial.
>> 
>> The mapping from integer to malloc() or free() would be a bounds check and 
>> then accessing the function pointer from a little array so pretty cheap.
>> 
>> if certain mallocs are missing (like PetscMallocHBW) the hbwmalloc variable 
>> could be set to the basicmalloc value (or some other) so one would not need 
>> to ifdef if if () code deciding which malloc to use in many places.
>> 
>> It seems so simple something must be fundamentally flawed with it. Even with 
>> just PetscTrMallocDefault() and PetscMallocAlign() I feel like implementing 
>> it.
>> 
>> 
>> 
>> 
>> 
>> 
> 

Reply via email to