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.
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.
The second argument of :cppxsimd::batch
is now a type that represents an architecture, instead of an integer.
The previous behavior can be emulated through the :cppxsimd::make_sized_batch
utility.
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>
.
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.
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.
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.