CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
116 lines
3.4 KiB
C++
116 lines
3.4 KiB
C++
// Copyright (c) Advanced Micro Devices, Inc., or its affiliates.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
#pragma once
|
|
|
|
#include "ck/utility/data_type.hpp"
|
|
#include "ck/utility/math_v2.hpp"
|
|
#include "ck/utility/reduction_common.hpp"
|
|
#include "ck/utility/reduction_operator.hpp"
|
|
|
|
namespace ck {
|
|
namespace detail {
|
|
|
|
// Check for NaN; guarantee NaNs are NOT propagated to result (i.e., ignore NaNs)
|
|
template <typename ReduceOperation, typename AccDataType>
|
|
struct AccumulateWithNanIgnore
|
|
{
|
|
__device__ static inline void Calculate(AccDataType& accuVal, AccDataType currVal)
|
|
{
|
|
if(!ck::math::isnan(currVal))
|
|
{
|
|
ReduceOperation{}(accuVal, currVal);
|
|
}
|
|
};
|
|
};
|
|
|
|
template <bool PropagateNan, typename ReduceOperation, typename AccDataType>
|
|
struct AccumulateWithNanCheck;
|
|
|
|
// Does not check for NaN; does not guarantee NaNs be propagated to result
|
|
// e.g., given that max(a, b) = a > b ? a : b
|
|
// then max(NaN, 1) returns 1
|
|
// max(1, NaN) returns NaN
|
|
// since any comparison involving NaNs returns false
|
|
template <typename ReduceOperation, typename AccDataType>
|
|
struct AccumulateWithNanCheck<false, ReduceOperation, AccDataType>
|
|
{
|
|
// cppcheck-suppress constParameter
|
|
__host__ __device__ static inline void Calculate(AccDataType& accuVal, AccDataType currVal)
|
|
{
|
|
ReduceOperation{}(accuVal, currVal);
|
|
};
|
|
};
|
|
|
|
// Check for NaN; guarantees NaNs be propagated to result
|
|
template <typename ReduceOperation, typename AccDataType>
|
|
struct AccumulateWithNanCheck<true, ReduceOperation, AccDataType>
|
|
{
|
|
__host__ __device__ static inline void Calculate(AccDataType& accuVal, AccDataType currVal)
|
|
{
|
|
using ck::math::isnan;
|
|
|
|
if(isnan(currVal))
|
|
{
|
|
accuVal = currVal;
|
|
}
|
|
else
|
|
{
|
|
ReduceOperation{}(accuVal, currVal);
|
|
};
|
|
};
|
|
};
|
|
|
|
template <bool PropagateNan, typename ReduceOperation, typename AccDataType, typename IndexDataType>
|
|
struct AccumulateWithIndexAndNanCheck;
|
|
|
|
template <typename ReduceOperation, typename AccDataType, typename IndexDataType>
|
|
struct AccumulateWithIndexAndNanCheck<false, ReduceOperation, AccDataType, IndexDataType>
|
|
{
|
|
__host__ __device__ static inline void
|
|
// cppcheck-suppress constParameter
|
|
Calculate(AccDataType& accuVal,
|
|
AccDataType currVal,
|
|
IndexDataType& accuIndex,
|
|
IndexDataType currIndex)
|
|
{
|
|
bool changed = false;
|
|
|
|
ReduceOperation{}(accuVal, currVal, changed);
|
|
|
|
if(changed)
|
|
accuIndex = currIndex;
|
|
};
|
|
};
|
|
|
|
template <typename ReduceOperation, typename AccDataType, typename IndexDataType>
|
|
struct AccumulateWithIndexAndNanCheck<true, ReduceOperation, AccDataType, IndexDataType>
|
|
{
|
|
// The method is called when the ReduceOperation is indexable and the user asked for indices
|
|
__host__ __device__ static inline void Calculate(AccDataType& accuVal,
|
|
AccDataType currVal,
|
|
IndexDataType& accuIndex,
|
|
IndexDataType currIndex)
|
|
{
|
|
using ck::math::isnan;
|
|
|
|
if(isnan(currVal))
|
|
{
|
|
accuVal = currVal;
|
|
accuIndex = currIndex;
|
|
}
|
|
else
|
|
{
|
|
bool changed = false;
|
|
|
|
ReduceOperation{}(accuVal, currVal, changed);
|
|
|
|
if(changed)
|
|
accuIndex = currIndex;
|
|
}
|
|
};
|
|
};
|
|
|
|
} // namespace detail
|
|
} // namespace ck
|