Aligned long views over byte arrays and heap ByteBuffers

Vitaly Davidovich vitalyd at gmail.com
Wed Jan 20 13:27:22 UTC 2016


Hi Paul,

isAligned(int,int) could probably use a better name since it's not
returning a boolean.  How about alignIndex(int,int)?

By the way, what's the rationale behind adding new APIs vs the runtime
detection option we discussed earlier?

Thanks

On Wed, Jan 20, 2016 at 8:12 AM, Paul Sandoz <paul.sandoz at oracle.com> wrote:

> I propose the following methods on ByteBuffer:
>
> /**
>  * Returns the memory address, pointing to the byte at the given index,
>  * modulus the given unit size.
>  *
>  * <p> A return value of zero indicates the byte at the index is aligned to
>  * the unit size, otherwise the value indicates how much the index should
> be
>  * rounded down or up to locate the nearest aligned byte.
>  *
>  * <p> If the unit size is a power of two then this method may be utilized
>  * to determine if unit size bytes from the index can be accessed
>  * atomically, if supported by the native platform.
>  *
>  * @param  index
>  *         The index to query for alignment, must be non-negative, no upper
>  *         bounds check is performed
>  *
>  * @param  unitSize
>  *         The unit size, must be positive
>  *
>  * @return  The indexed byte's memory address modulus the unit size
>  *
>  * @throws IllegalArgumentException
>  *         If the index is negative or the unit size is non-positive
>  *
>  * @see #alignedSlice(int)
>  * @since 9
>  */
> public final int isAligned(int index, int unitSize)
>
> /**
>  * Creates a new byte buffer whose content is a shared and aligned
>  * subsequence of this buffer's content.
>  *
>  * <p> The content of the new buffer will start at this buffer's current
>  * position rounded up to the index of the nearest aligned byte for the
>  * given unit size, and end at this buffer's limit rounded down to the
> index
>  * of the nearest aligned byte for the given unit size.
>  * The new buffer's current position and limit will equal this buffer's
>  * position if rounding results in out-of-bound values.  If rounding is
>  * within bounds the following expressions will be true for a new buffer
>  * {@code nb} and unit size {@code unitSize}:
>  * <pre>{@code
>  * nb.isAligned(nb.position(), unitSize) == 0
>  * nb.isAligned(nb.limit(), unitSize) == 0
>  * (nb.limit() - nb.position()) % unitSize == 0
>  * }</pre>
>  *
>  * <p> Changes to this buffer's content will be visible in the new
>  * buffer, and vice versa; the two buffers' position, limit, and mark
>  * values will be independent.
>  *
>  * <p> The new buffer's position will be zero, its mark will be undefined,
>  * and its byte order will be {@link ByteOrder#BIG_ENDIAN BIG_ENDIAN}.
>  *
>  * The new buffer will be direct if, and only if, this buffer is direct,
> and
>  * it will be read-only if, and only if, this buffer is read-only.  </p>
>  *
>  * @param  unitSize
>  *         The unit size, must be positive
>  *
>  * @return  The new byte buffer
>  *
>  * @throws IllegalArgumentException
>  *         If the unit size is non-positive
>  *
>  * @see #isAligned(int, int)
>  * @see #slice()
>  * @since 9
>  */
> public final ByteBuffer alignedSlice(int unitSize)
>
> Paul.
>
> > On 18 Jan 2016, at 19:08, John Rose <john.r.rose at oracle.com> wrote:
> >
> >
> >> On Jan 18, 2016, at 6:17 AM, Aleksey Shipilev <
> aleksey.shipilev at oracle.com> wrote:
> >>
> >> That being said, there probably are VMs
> >
> >
> > Such exotic VMs (for tiny platforms, perhaps) can throw appropriate UOEs.
> >
> > Most widespread 32-bit system ABIs align long variables. We can expect
> nearly all JVMs to loosely follow ABI practices.
> >
> > If you don't like the UOEs and want bullet proof GC-able buffers, simply
> use long arrays.
> >
> > Later, we will get into odd territory if we introduce jumbo alignments
> for fast vector work. (E.g. AlignedLong4[] or Aligned<Long4>[] or even
> Aligned<256,Long4>[].) Such arrays will need special GC processing to
> enforce alignment, and byte arrays will probably never be conformable to
> such requirements. We may want to have a factory method for building
> maximally aligned buffers.
> >
> > – John
> >
>
>


More information about the valhalla-dev mailing list