-malign-double
Barry Smith
bsmith at mcs.anl.gov
Mon Nov 16 12:12:37 CST 2009
Jed,
Seems ok to me. Feel free to update PETSc. (But I think PETSc
style would detect that your PETSC_ALIGN() macro would be called
PetscMemAlign() or something, we only use caps for macros that are
fixed values, not for macros that like functions.)
Thanks for thinking about this,
Barry
On Nov 16, 2009, at 4:11 AM, Jed Brown wrote:
> Barry Smith wrote:
>>
>> Agreed this would be a good option to have. The question is how
>> to do
>> it without having a morass of nasty nested if-defs. Note that
>> portably
>> getting alignment out of malloc() alone is already ugly and not as
>> simple a code as I would like.
>>
>> To simplify things we could always require 16 byte alignment
>> everywhere? But is that a desirable?
>
> I doubt it's harmful, I don't think I understand where the nested
> ifdefs
> come in. The required alignment only needs to be stated in one
> place, I
> have something like the following in one of my projects.
>
> /* current */
> #define
> PetscMalloc3(m1,t1,r1,m2,t2,r2,m3,t3,r3) \
> (PetscMalloc((m1)*sizeof(t1)+(m2)*sizeof(t2)+
> (m3)*sizeof(t3),r1) \
> || (*(r2) = (t2*)
> (*(r1)+m1), \
> *(r3) = (t3*)(*(r2)+m2),0))
>
> /* aligned */
> #define
> PetscMalloc3(m1,t1,r1,m2,t2,r2,m3,t3,r3) \
> (PetscMalloc((m1)*sizeof(t1)+(m2)*sizeof(t2)+
> (m3)*sizeof(t3)+2*(PETSC_MEMALIGN-1),r1) \
> || (*(r2) =
> (t2*)PETSC_ALIGN(*(r1)+m1), \
> *(r3) = (t3*)PETSC_ALIGN(*(r2)+m2),0))
>
> #define PETSC_ALIGN(p) PetscNextAligned((uintptr_t)
> (p),PETSC_MEMALIGN-1)
>
> static inline void *PetscNextAligned(uintptr_t base,uintptr_t mask)
> {return (void*)((base + mask) & ~mask);}
>
>
> Note that this is a no-op if PETSC_MEMALIGN=1 and thus compiles to
> exactly what we have now.
>
> Jed
>
More information about the petsc-dev
mailing list