Partial fix for #2917
- add newAlignedPinnedByteArray# for allocating pinned BAs with arbitrary alignment - the old newPinnedByteArray# now aligns to 16 bytes Foreign.alloca will use newAlignedPinnedByteArray#, and so might end up wasting less space than before (we used to align to 8 by default). Foreign.allocaBytes and Foreign.mallocForeignPtrBytes will get 16-byte aligned memory, which is enough to avoid problems with SSE instructions on x86, for example. There was a bug in the old newPinnedByteArray#: it aligned to 8 bytes, but would have failed if the header was not a multiple of 8 (fortunately it always was, even with profiling). Also we occasionally wasted some space unnecessarily due to alignment in allocatePinned(). I haven't done anything about Foreign.malloc/mallocBytes, which will give you the same alignment guarantees as malloc() (8 bytes on Linux/x86 here).
Showing
- compiler/prelude/primops.txt.pp 5 additions, 0 deletionscompiler/prelude/primops.txt.pp
- includes/StgMiscClosures.h 1 addition, 0 deletionsincludes/StgMiscClosures.h
- rts/Linker.c 1 addition, 0 deletionsrts/Linker.c
- rts/PrimOps.cmm 35 additions, 11 deletionsrts/PrimOps.cmm
- rts/sm/Compact.c 4 additions, 0 deletionsrts/sm/Compact.c
- rts/sm/Evac.c 14 additions, 6 deletionsrts/sm/Evac.c
- rts/sm/Storage.c 3 additions, 8 deletionsrts/sm/Storage.c
Loading
Please register or sign in to comment