//================================================================================================= /*! // \file blaze/math/simd/Reduce.h // \brief Header file for the generic SIMD reduction functionality // // Copyright (C) 2012-2020 Klaus Iglberger - All Rights Reserved // // This file is part of the Blaze library. You can redistribute it and/or modify it under // the terms of the New (Revised) BSD License. Redistribution and use in source and binary // forms, with or without modification, are permitted provided that the following conditions // are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // 3. Neither the names of the Blaze development group nor the names of its contributors // may be used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT // SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED // TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR // BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH // DAMAGE. */ //================================================================================================= #ifndef _BLAZE_MATH_SIMD_REDUCE_H_ #define _BLAZE_MATH_SIMD_REDUCE_H_ //************************************************************************************************* // Includes //************************************************************************************************* #include #include #include #include #include #include namespace blaze { //================================================================================================= // // SIMD REDUCTION // //================================================================================================= //************************************************************************************************* /*!\brief Reduces the elements in the given SIMD vector. // \ingroup simd // // \param a The SIMD vector to be reduced. // \param op The reduction operation. // \return The result of the reduction operation. */ template< typename T, typename OP > inline decltype(auto) reduce( const SIMDPack& a, OP op ) { using ValueType = typename T::ValueType; alignas( AlignmentOf_v ) ValueType array[T::size]; storea( array, *a ); ValueType redux( array[0UL] ); for( size_t k=1UL; k inline decltype(auto) reduce( const SIMDPack& a, const Add& /*op*/ ) { return sum( *a ); } /*! \endcond */ //************************************************************************************************* //************************************************************************************************* /*! \cond BLAZE_INTERNAL */ /*!\brief Reduces the elements in the given SIMD vector by means of multiplication. // \ingroup simd // // \param a The vector to be reduced by multiplication. // \return The produdct of all vector elements. */ template< typename T > inline decltype(auto) reduce( const SIMDPack& a, const Mult& /*op*/ ) { return prod( *a ); } /*! \endcond */ //************************************************************************************************* } // namespace blaze #endif