diff options
author | Mukulika <mukulikapahari@gmail.com> | 2021-09-13 15:31:56 +0530 |
---|---|---|
committer | Mukulika <mukulikapahari@gmail.com> | 2021-09-13 15:42:42 +0530 |
commit | 50850c0fbb274484dada41b1e2f3567de30aa0c5 (patch) | |
tree | 8fddc5061b122e5a49f6d1c7d4b006d3c833b22f /doc/source/reference/alignment.rst | |
parent | b892ed2c7fa27b2e0d73c12d12ace4b4d4e12897 (diff) | |
download | numpy-50850c0fbb274484dada41b1e2f3567de30aa0c5.tar.gz |
DOC: Moved NumPy Internals into Under-the-hood docs
Diffstat (limited to 'doc/source/reference/alignment.rst')
-rw-r--r-- | doc/source/reference/alignment.rst | 101 |
1 files changed, 5 insertions, 96 deletions
diff --git a/doc/source/reference/alignment.rst b/doc/source/reference/alignment.rst index 5e4315b38..70ded916a 100644 --- a/doc/source/reference/alignment.rst +++ b/doc/source/reference/alignment.rst @@ -1,104 +1,13 @@ -.. _alignment: +:orphan: +**************** Memory Alignment -================ +**************** -Numpy Alignment Goals ---------------------- +.. This document has been moved to ../dev/alignment.rst. -There are three use-cases related to memory alignment in numpy (as of 1.14): +This document has been moved to :ref:`alignment`. - 1. Creating structured datatypes with fields aligned like in a C-struct. - 2. Speeding up copy operations by using uint assignment in instead of memcpy - 3. Guaranteeing safe aligned access for ufuncs/setitem/casting code -Numpy uses two different forms of alignment to achieve these goals: -"True alignment" and "Uint alignment". - -"True" alignment refers to the architecture-dependent alignment of an -equivalent C-type in C. For example, in x64 systems ``numpy.float64`` is -equivalent to ``double`` in C. On most systems this has either an alignment of -4 or 8 bytes (and this can be controlled in gcc by the option -``malign-double``). A variable is aligned in memory if its memory offset is a -multiple of its alignment. On some systems (eg sparc) memory alignment is -required, on others it gives a speedup. - -"Uint" alignment depends on the size of a datatype. It is defined to be the -"True alignment" of the uint used by numpy's copy-code to copy the datatype, or -undefined/unaligned if there is no equivalent uint. Currently numpy uses uint8, -uint16, uint32, uint64 and uint64 to copy data of size 1,2,4,8,16 bytes -respectively, and all other sized datatypes cannot be uint-aligned. - -For example, on a (typical linux x64 gcc) system, the numpy ``complex64`` -datatype is implemented as ``struct { float real, imag; }``. This has "true" -alignment of 4 and "uint" alignment of 8 (equal to the true alignment of -``uint64``). - -Some cases where uint and true alignment are different (default gcc linux): - arch type true-aln uint-aln - ---- ---- -------- -------- - x86_64 complex64 4 8 - x86_64 float128 16 8 - x86 float96 4 - - - -Variables in Numpy which control and describe alignment -------------------------------------------------------- - -There are 4 relevant uses of the word ``align`` used in numpy: - - * The ``dtype.alignment`` attribute (``descr->alignment`` in C). This is meant - to reflect the "true alignment" of the type. It has arch-dependent default - values for all datatypes, with the exception of structured types created - with ``align=True`` as described below. - * The ``ALIGNED`` flag of an ndarray, computed in ``IsAligned`` and checked - by ``PyArray_ISALIGNED``. This is computed from ``dtype.alignment``. - It is set to ``True`` if every item in the array is at a memory location - consistent with ``dtype.alignment``, which is the case if the data ptr and - all strides of the array are multiples of that alignment. - * The ``align`` keyword of the dtype constructor, which only affects structured - arrays. If the structure's field offsets are not manually provided numpy - determines offsets automatically. In that case, ``align=True`` pads the - structure so that each field is "true" aligned in memory and sets - ``dtype.alignment`` to be the largest of the field "true" alignments. This - is like what C-structs usually do. Otherwise if offsets or itemsize were - manually provided ``align=True`` simply checks that all the fields are - "true" aligned and that the total itemsize is a multiple of the largest - field alignment. In either case ``dtype.isalignedstruct`` is also set to - True. - * ``IsUintAligned`` is used to determine if an ndarray is "uint aligned" in - an analogous way to how ``IsAligned`` checks for true-alignment. - -Consequences of alignment -------------------------- - -Here is how the variables above are used: - - 1. Creating aligned structs: In order to know how to offset a field when - ``align=True``, numpy looks up ``field.dtype.alignment``. This includes - fields which are nested structured arrays. - 2. Ufuncs: If the ``ALIGNED`` flag of an array is False, ufuncs will - buffer/cast the array before evaluation. This is needed since ufunc inner - loops access raw elements directly, which might fail on some archs if the - elements are not true-aligned. - 3. Getitem/setitem/copyswap function: Similar to ufuncs, these functions - generally have two code paths. If ``ALIGNED`` is False they will - use a code path that buffers the arguments so they are true-aligned. - 4. Strided copy code: Here, "uint alignment" is used instead. If the itemsize - of an array is equal to 1, 2, 4, 8 or 16 bytes and the array is uint - aligned then instead numpy will do ``*(uintN*)dst) = *(uintN*)src)`` for - appropriate N. Otherwise numpy copies by doing ``memcpy(dst, src, N)``. - 5. Nditer code: Since this often calls the strided copy code, it must - check for "uint alignment". - 6. Cast code: This checks for "true" alignment, as it does - ``*dst = CASTFUNC(*src)`` if aligned. Otherwise, it does - ``memmove(srcval, src); dstval = CASTFUNC(srcval); memmove(dst, dstval)`` - where dstval/srcval are aligned. - -Note that the strided-copy and strided-cast code are deeply intertwined and so -any arrays being processed by them must be both uint and true aligned, even -though the copy-code only needs uint alignment and the cast code only true -alignment. If there is ever a big rewrite of this code it would be good to -allow them to use different alignments. |