Files
TheRock/rocm-libraries/dnn-providers/miopen-provider/tests/common/ActivationCommon.hpp
T
derek.holloway 7502bf64a4
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
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

201 lines
7.0 KiB
C++

// Copyright © Advanced Micro Devices, Inc., or its affiliates.
// SPDX-License-Identifier: MIT
#pragma once
#include <exception>
#include <optional>
#include <hipdnn_flatbuffers_sdk/data_objects/pointwise_attributes_generated.h>
#include <hipdnn_flatbuffers_sdk/flatbuffer_utilities/FlatbufferTypeHelpers.hpp>
namespace test_activation_common
{
struct ActivTestCase
{
hipdnn_flatbuffers_sdk::data_objects::PointwiseMode mode;
std::optional<float> reluLowerClip;
std::optional<float> reluUpperClip;
std::optional<float> reluLowerClipSlope;
std::optional<float> swishBeta;
std::optional<float> eluAlpha;
std::optional<float> softplusBeta;
ActivTestCase(hipdnn_flatbuffers_sdk::data_objects::PointwiseMode modeLocal,
std::optional<float> reluLowerClipLocal = std::nullopt,
std::optional<float> reluUpperClipLocal = std::nullopt,
std::optional<float> reluLowerClipSlopeLocal = std::nullopt,
std::optional<float> swishBetaLocal = std::nullopt,
std::optional<float> eluAlphaLocal = std::nullopt,
std::optional<float> softplusBetaLocal = std::nullopt)
: mode(modeLocal)
, reluLowerClip(reluLowerClipLocal)
, reluUpperClip(reluUpperClipLocal)
, reluLowerClipSlope(reluLowerClipSlopeLocal)
, swishBeta(swishBetaLocal)
, eluAlpha(eluAlphaLocal)
, softplusBeta(softplusBetaLocal)
{
using PointwiseMode = hipdnn_flatbuffers_sdk::data_objects::PointwiseMode;
switch(mode)
{
case PointwiseMode::RELU_FWD:
case PointwiseMode::RELU_BWD:
case PointwiseMode::SIGMOID_FWD:
case PointwiseMode::SIGMOID_BWD:
case PointwiseMode::TANH_FWD:
case PointwiseMode::TANH_BWD:
case PointwiseMode::ELU_FWD:
case PointwiseMode::ELU_BWD:
case PointwiseMode::SOFTPLUS_FWD:
case PointwiseMode::SOFTPLUS_BWD:
case PointwiseMode::ABS:
case PointwiseMode::IDENTITY:
break;
default:
throw std::invalid_argument("Unknown activation mode");
}
}
friend std::ostream& operator<<(std::ostream& ss, const ActivTestCase& tc)
{
ss << "(mode:" << tc.mode;
if(tc.reluLowerClip)
{
ss << " reluLowerClip:" << tc.reluLowerClip.value();
}
if(tc.reluUpperClip)
{
ss << " reluUpperClip:" << tc.reluUpperClip.value();
}
if(tc.reluLowerClipSlope)
{
ss << " reluLowerClipSlope:" << tc.reluLowerClipSlope.value();
}
if(tc.swishBeta)
{
ss << " swishBeta:" << tc.swishBeta.value();
}
if(tc.eluAlpha)
{
ss << " eluAlpha:" << tc.eluAlpha.value();
}
if(tc.softplusBeta)
{
ss << " softplusBeta:" << tc.softplusBeta.value();
}
ss << ")";
return ss;
}
};
inline std::vector<ActivTestCase> createFwdActivationSmokeCases()
{
using PM = hipdnn_flatbuffers_sdk::data_objects::PointwiseMode;
std::vector<ActivTestCase> cases;
// RELU_FWD (standard ReLU) - Only activation supported by MIOpen fusion
cases.emplace_back(PM::RELU_FWD,
std::nullopt, // reluLowerClip
std::nullopt, // reluUpperClip
std::nullopt, // reluLowerClipSlope
std::nullopt, // swishBeta
std::nullopt, // eluAlpha
std::nullopt // softplusBeta
);
return cases;
}
inline std::vector<ActivTestCase> createFwdActivationFullCases()
{
using PM = hipdnn_flatbuffers_sdk::data_objects::PointwiseMode;
std::vector<ActivTestCase> cases;
// RELU_FWD (standard ReLU)
cases.emplace_back(PM::RELU_FWD,
0.0f, // reluLowerClip
std::nullopt, // reluUpperClip
std::nullopt, // reluLowerClipSlope
std::nullopt, // swishBeta
std::nullopt, // eluAlpha
std::nullopt // softplusBeta
);
// ReLU6: upper clip at 6.0 (Clipped ReLU)
cases.emplace_back(PM::RELU_FWD,
std::nullopt, // reluLowerClip
0.5f, // reluUpperClip
std::nullopt, // reluLowerClipSlope
std::nullopt, // swishBeta
std::nullopt, // eluAlpha
std::nullopt // softplusBeta
);
// CLAMP: both lower and upper clips (e.g., clip to range [0.0, 6.0])
cases.emplace_back(PM::RELU_FWD,
0.1f, // reluLowerClip
0.5f, // reluUpperClip
std::nullopt, // reluLowerClipSlope
std::nullopt, // swishBeta
std::nullopt, // eluAlpha
std::nullopt // softplusBeta
);
// Leaky ReLU: NOT supported by MIOpen's batchnorm fusion API
// MIOpen's BnFwdTrainingSpatial solver supports:
// - miopenActivationRELU (standard ReLU)
// - miopenActivationCLIPPEDRELU (ReLU with upper clip)
// - miopenActivationCLAMP (ReLU with both upper and lower clips)
// but does NOT support:
// - miopenActivationLEAKYRELU (ReLU with lower clip slope)
// See: MIOpen's BnFwdTrainingSpatial::IsApplicable() for details.
#if 0
cases.emplace_back(PM::RELU_FWD,
std::nullopt, // reluLowerClip
std::nullopt, // reluUpperClip
0.01f, // reluLowerClipSlope
std::nullopt, // swishBeta
std::nullopt, // eluAlpha
std::nullopt // softplusBeta
);
#endif
return cases;
}
inline std::vector<ActivTestCase> createBatchnormBwdActivationTestCases()
{
return {// ReLU Backward: d/dx Max(0, x) = 1 * (x > 0)
ActivTestCase(hipdnn_flatbuffers_sdk::data_objects::PointwiseMode::RELU_BWD,
0.0f,
std::nullopt,
std::nullopt,
std::nullopt,
std::nullopt,
std::nullopt),
// Clipped ReLU Backward: d/dx Clamp(x, -inf, upper)
ActivTestCase(hipdnn_flatbuffers_sdk::data_objects::PointwiseMode::RELU_BWD,
std::nullopt,
0.5f,
std::nullopt,
std::nullopt,
std::nullopt,
std::nullopt),
// CLAMP Backward: d/dx Clamp(x, lower, upper)
ActivTestCase(hipdnn_flatbuffers_sdk::data_objects::PointwiseMode::RELU_BWD,
0.1f,
0.5f,
std::nullopt,
std::nullopt,
std::nullopt,
std::nullopt)};
}
} // namespace test_activation_common