.. Copyright (c) 2016, Johan Mabille, Sylvain Corlay Distributed under the terms of the BSD 3-Clause License. The full license is in the file LICENSE, distributed with this software. .. raw:: html .. _Arch Dispatching: Arch Dispatching ================ `xsimd` provides a generic way to dispatch a function call based on the architecture the code was compiled for and the architectures available at runtime. The :cpp:func:`xsimd::dispatch` function takes a functor whose call operator takes an architecture parameter as first operand, followed by any number of arguments ``Args...`` and turn it into a dispatching functor that takes ``Args...`` as arguments. .. doxygenfunction:: xsimd::dispatch :project: xsimd Following code showcases a usage of the :cpp:func:`xsimd::dispatch` function: .. code-block:: c++ #include "sum.hpp" // Create the dispatching function, specifying the architecture we want to // target. auto dispatched = xsimd::dispatch>(sum{}); // Call the appropriate implementation based on runtime information. float res = dispatched(data, 17); This code does *not* require any architecture-specific flags. The architecture specific details follow. The ``sum.hpp`` header contains the function being actually called, in an architecture-agnostic description: .. literalinclude:: ../../../test/doc/sum.hpp The SSE2 and AVX2 version needs to be provided in other compilation units, compiled with the appropriate flags, for instance: .. literalinclude:: ../../../test/doc/sum_avx2.cpp .. literalinclude:: ../../../test/doc/sum_sse2.cpp