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.