From 7.x to 8.x
Version 8.x introduces a lot of API difference compared to version 7.x. This section motivates the version bump and details the most notable changes.
Why 8.x
Version 8.x introduces a new concept in xsimd: all batch types are now
parametrized by a type, say double
, and an optional architecture, say
avx512
, as in batch<double, avx512>
. It is still possible to just
require a batch of doubles and let the library pick the most appropriate
architecture, as in batch<double>
.
This new design make it possible to target multiple architecture from the same code, as detailed in the Arch Dispatching section.
As a side effect of this (almost full) rewrite of the library code, xsimd is now twice as fast to compile, and its source code size as been (roughly) divided by two. The xsimd developers also took this as an opportnuity to significantly improve test coverage.
Most Notable Changes
Batch Types
The second argument of xsimd::batch
is now a type that represents
an architecture, instead of an integer.
The previous behavior can be emulated through the
xsimd::make_sized_batch
utility.
Batch of Complex Types
Loading a batch of complex from an xtl::xcomplex<T>
now yields an
xsimd::batch<std::complex<T>>
instead of an xtl::xcomplex<T>
. It is still
possible to store an xsimd::batch<std::complex<T>>
to an
xtl::xcomplex<T>
.
Loading Batches
xsimd::batch<T>::load*
are now static functions. It is no longer supported
to update an existing batch through its load
method. The regular assign
operator can be used instead.
Indexing Batches
xsimd::batch<T>::operator[](size_t)
has been replaced with
xsimd::batch<T>::get(size_t)
. Keep in mind that this method implies a register
load for each call, so it’s wise not to use it in performance-critical
section. When needed, do an explicit store of the batch into an array and work
from there.
Architecture Detection
Many macros have been replaced by more elaborated constructs.
XSIMD_INSTR_SET_AVAILABLE
has been replaced by the type alias xsimd::default_arch
.
Likewise architecture-specific macros like XSIMD_X86_INSTR_SET_AVAILABLE
has
been replaced by xsimd::upported_architectures::contains<xsimd::sse3>()
. Macro like XSIMD_WITH_SSE3
are still
defined to 0
or 1
to guard architecture-specific code.