mirror of
https://github.com/ROCm/composable_kernel.git
synced 2026-05-21 05:19:20 +00:00
* Initial adding of generic reduction * Initial adding of generic reduction ... * Updates to make compiling done * clang-format all files * clang-format some files again * Renaming in profiler/include/profile_reduce.hpp * Updates and make BlockWise cases passed * Updates and make ThreadWise and MultiBlockTwoCall cases passed * Remove the support for MUL and NORM1 reduceOp from the profiler and the device instances * Change to replace the dim0_max_vector_size/dim1_max_vector_size template argument in the device reduce classes * format * adding pooling * added max and average pooling * comment out cout and kernel timing * Tiny simplification in profiler/reduce_profiler.cpp * Add example for reduce_blockwise * Tiny updates * Change to pass the ElementWiseOp from device layer to kernel * Fix the vectorDim and vectorSize in Device layer * Enable vector load on both dim0 and dim1 for Threadwise method * Tiny updates * Change to let the user to pass the preUnaryOp and posUnaryOp * Make pooling example work * split device_reduce_instance into two libraries * Tiny update * Replace nanPropaOpt enum by boolean propagate_nan * Simplification in DeviceReduce layer codes * update build * Change to clarify the difference between ck::half_t and half_float::half * Renaming in all the reduction codes * Add VectorSize as template parameter for device layer * Add BetaIsZero as kernel template and as AccDataType for alpha * print * Small updates for pooling * Updates for host_generic_reduction for reference * Update to make AVG pooling pass * Update to make MAX pooling with indices output pass * fix * add OutDst vector store to threadwise reduction and pooling * tweak * turn off check_indices that caused build issue * refactor pooling * clean up * turn off check_indices for building issue for php-compiler * add more tile size for odd C * tweak conv for odd C * update script * clean up elementwise op * add hack in reduction_operator.hpp to avoid compile error. To fix it, need to use element_wise_op in reduction op * Add OutVectorSize as device and kernel tunable, also update to Elementwise Operations * Move reduce operator mapping to host layer file reduction_operator_mapping.hpp from reduction_operator.hpp * Change to the unary operators * Move the definitions of unary operations to element_wise_operation.hpp * re-org files * Refine in device interfaces and multiblock kernels * Split the reduction configurations into instances for specific methods * Update in getTypeString() of device pool2d * Renaming in host and kernel * Tiny update in profiler/src/profiler.cpp * Uncomment in device_operation/CMakeLists.txt to enable the building of all operations * Make check_indices a templated function to remove some linking issue * Renaming in the profiler reduce module * Add support for double Reduction (but disable MultiblockAtomicAdd for double) * Tiny correction of literal string * Rename DevicePoolFwd to DevicePool2dFwd * Split device_reduce_instance_xxx.cpp files according to the data types to speed up compiling * Add comments for lists of configurations, lists of instances and references of add_reduce_instances_xxx * Remove un-used header file gridwise_generic_reduction_wrapper_common.hpp * Renaming and refining in the Reduction codes * Tiny change in the unary operators * Renaming symbols and files * Renaming symbols in the kernels * Move kernel kernel_set_buffer_value to separate file * Add IndexDataType template parameter for kernels and use int32_t as index data type in device layer * Tiny update in the kernels * Remove definition of sqrtf()/isnan()/abs() for half_t due to some ADL issue * Simplify a helper function in device layer * Tiny adjustment in testing data initialization * Renaming in kernel/device/host * Add two testing scripts for reduction * Refine the Unary operators in element_wise_operation.hpp * Update in the reduce profiler module * Update to the reduction testing scripts * reduce compile parallelism * change CI docker to rocm5.0 * remove unused variables * fix build Co-authored-by: Chao Liu <chao.liu2@amd.com>
170 lines
5.5 KiB
C++
170 lines
5.5 KiB
C++
/*******************************************************************************
|
|
*
|
|
* MIT License
|
|
*
|
|
* Copyright (c) 2020 Advanced Micro Devices, Inc.
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in all
|
|
* copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
* SOFTWARE.
|
|
*
|
|
*******************************************************************************/
|
|
#ifndef CK_REDUCTION_OPERATOR_MAPPING_HPP
|
|
#define CK_REDUCTION_OPERATOR_MAPPING_HPP
|
|
|
|
#include "reduction_operator.hpp"
|
|
#include "reduction_enums.hpp"
|
|
#include "element_wise_operation.hpp"
|
|
|
|
namespace ck {
|
|
|
|
// The templated struct reduce_binary_operator maps the enum Ids of binary operators to their
|
|
// respective functor classes.
|
|
// The boolean member "indexable" are also provided in reduce_binary_operactor for
|
|
// easier checking by the upper-layer codes in the kernels.
|
|
|
|
template <typename T, ReduceTensorOp_t Op>
|
|
struct reduce_binary_operator;
|
|
|
|
template <typename T>
|
|
struct reduce_binary_operator<T, ReduceTensorOp_t::ADD>
|
|
{
|
|
using opType = reduce::Add<T>;
|
|
using dataType = T;
|
|
|
|
static constexpr bool indexable = false;
|
|
};
|
|
|
|
template <typename T>
|
|
struct reduce_binary_operator<T, ReduceTensorOp_t::MUL>
|
|
{
|
|
using opType = reduce::Mul<T>;
|
|
using dataType = T;
|
|
|
|
static constexpr bool indexable = false;
|
|
};
|
|
|
|
template <typename T>
|
|
struct reduce_binary_operator<T, ReduceTensorOp_t::MIN>
|
|
{
|
|
using opType = reduce::Min<T>;
|
|
using dataType = T;
|
|
|
|
static constexpr bool indexable = true;
|
|
};
|
|
|
|
template <typename T>
|
|
struct reduce_binary_operator<T, ReduceTensorOp_t::MAX>
|
|
{
|
|
using opType = reduce::Max<T>;
|
|
using dataType = T;
|
|
|
|
static constexpr bool indexable = true;
|
|
};
|
|
|
|
template <typename T>
|
|
struct reduce_binary_operator<T, ReduceTensorOp_t::AMAX>
|
|
{
|
|
using opType = reduce::AMax<T>;
|
|
using dataType = T;
|
|
|
|
static constexpr bool indexable = true;
|
|
};
|
|
|
|
template <typename T>
|
|
struct reduce_binary_operator<T, ReduceTensorOp_t::AVG>
|
|
{
|
|
using opType = reduce::Add<T>;
|
|
using dataType = T;
|
|
|
|
static constexpr bool indexable = false;
|
|
};
|
|
|
|
template <typename T>
|
|
struct reduce_binary_operator<T, ReduceTensorOp_t::NORM1>
|
|
{
|
|
using opType = reduce::Add<T>;
|
|
using dataType = T;
|
|
|
|
static constexpr bool indexable = false;
|
|
};
|
|
|
|
template <typename T>
|
|
struct reduce_binary_operator<T, ReduceTensorOp_t::NORM2>
|
|
{
|
|
using opType = reduce::Add<T>;
|
|
using dataType = T;
|
|
|
|
static constexpr bool indexable = false;
|
|
};
|
|
|
|
// The templated struct reduce_unary_operator maps the enum Ids of Reduce operators to two unary
|
|
// functor classes.
|
|
// The two unary functors are called before and afer the Reduction is executed respectively
|
|
template <typename T, ReduceTensorOp_t Op, bool IsFirstReduce, bool IsLastReduce>
|
|
struct reduce_unary_operator
|
|
{
|
|
using InElementwiseOperation = tensor_operation::element_wise::UnaryIdentic<T, T>;
|
|
using AccElementwiseOperation = tensor_operation::element_wise::UnaryIdentic<T, T>;
|
|
};
|
|
|
|
template <typename T, bool IsFirstReduce>
|
|
struct reduce_unary_operator<T, ReduceTensorOp_t::AVG, IsFirstReduce, true>
|
|
{
|
|
using InElementwiseOperation = tensor_operation::element_wise::UnaryIdentic<T, T>;
|
|
using AccElementwiseOperation = tensor_operation::element_wise::UnaryIdentic<T, T, true>;
|
|
};
|
|
|
|
template <typename T, bool IsLastReduce>
|
|
struct reduce_unary_operator<T, ReduceTensorOp_t::NORM1, true, IsLastReduce>
|
|
{
|
|
using InElementwiseOperation = tensor_operation::element_wise::UnaryAbs<T, T>;
|
|
using AccElementwiseOperation = tensor_operation::element_wise::UnaryIdentic<T, T>;
|
|
};
|
|
|
|
template <typename T, bool IsLastReduce>
|
|
struct reduce_unary_operator<T, ReduceTensorOp_t::AMAX, true, IsLastReduce>
|
|
{
|
|
using InElementwiseOperation = tensor_operation::element_wise::UnaryAbs<T, T>;
|
|
using AccElementwiseOperation = tensor_operation::element_wise::UnaryIdentic<T, T>;
|
|
};
|
|
|
|
template <typename T>
|
|
struct reduce_unary_operator<T, ReduceTensorOp_t::NORM2, true, false>
|
|
{
|
|
using InElementwiseOperation = tensor_operation::element_wise::UnarySquare<T, T>;
|
|
using AccElementwiseOperation = tensor_operation::element_wise::UnaryIdentic<T, T>;
|
|
};
|
|
|
|
template <typename T>
|
|
struct reduce_unary_operator<T, ReduceTensorOp_t::NORM2, true, true>
|
|
{
|
|
using InElementwiseOperation = tensor_operation::element_wise::UnarySquare<T, T>;
|
|
using AccElementwiseOperation = tensor_operation::element_wise::UnarySqrt<T, T>;
|
|
};
|
|
|
|
template <typename T>
|
|
struct reduce_unary_operator<T, ReduceTensorOp_t::NORM2, false, true>
|
|
{
|
|
using InElementwiseOperation = tensor_operation::element_wise::UnaryIdentic<T, T>;
|
|
using AccElementwiseOperation = tensor_operation::element_wise::UnarySqrt<T, T>;
|
|
};
|
|
|
|
} // end of namespace ck
|
|
|
|
#endif
|