Files
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

111 lines
4.0 KiB
C++

// Copyright © Advanced Micro Devices, Inc., or its affiliates.
// SPDX-License-Identifier: MIT
#pragma once
#include "RMSNormShapeCatalog.hpp"
#include <gtest/gtest.h>
#include <hipdnn-gpu-ref/GpuFpReferenceRMSNorm.hpp>
#include <hipdnn_data_sdk/types.hpp>
#include <hipdnn_test_sdk/utilities/CpuFpReferenceRMSNorm.hpp>
#include <hipdnn_test_sdk/utilities/CpuFpReferenceValidation.hpp>
#include <hipdnn_test_sdk/utilities/Seeds.hpp>
#include <hipdnn_test_sdk/utilities/TestTolerances.hpp>
#include <hipdnn_test_sdk/utilities/TestUtilities.hpp>
namespace gpu_rmsnorm_fwd_ref_test
{
using namespace hipdnn_data_sdk::utilities;
using namespace hipdnn_test_sdk::utilities;
using namespace hipdnn_test_sdk::utilities::rmsnorm;
using namespace hipdnn_gpu_ref;
using namespace gpu_rmsnorm_ref_test;
template <typename InputDataType,
typename OutputDataType = InputDataType,
typename ScaleDataType = InputDataType,
typename ComputeDataType = double>
void runGpuVsCpuRMSNormFwd(const std::vector<int64_t>& ioDims,
const std::vector<int64_t>& scaleDims,
const TensorLayout& layout,
double epsilon,
float fillRange = 1.0f,
bool includeInvRms = false,
bool includeBias = false)
{
const unsigned int seed = getGlobalTestSeed();
auto inputTensor = Tensor<InputDataType>(ioDims, layout);
auto scaleTensor = Tensor<ScaleDataType>(scaleDims, layout);
auto outputCpu = Tensor<OutputDataType>(ioDims, layout);
auto outputGpu = Tensor<OutputDataType>(ioDims, layout);
inputTensor.fillWithRandomValues(
static_cast<InputDataType>(-fillRange), static_cast<InputDataType>(fillRange), seed);
scaleTensor.fillWithRandomValues(
static_cast<ScaleDataType>(-fillRange), static_cast<ScaleDataType>(fillRange), seed + 1);
std::vector<int64_t> invRmsDims = ioDims;
for(size_t i = 0; i < invRmsDims.size(); ++i)
{
if(scaleDims[i] != 1)
{
invRmsDims[i] = 1;
}
}
auto invRmsTensorCpu
= includeInvRms ? Tensor<ComputeDataType>(invRmsDims, layout) : Tensor<ComputeDataType>({});
auto invRmsTensorGpu
= includeInvRms ? Tensor<ComputeDataType>(invRmsDims, layout) : Tensor<ComputeDataType>({});
auto biasTensor
= includeBias ? Tensor<ScaleDataType>(scaleDims, layout) : Tensor<ScaleDataType>({});
if(includeBias)
{
biasTensor.fillWithRandomValues(static_cast<ScaleDataType>(-fillRange),
static_cast<ScaleDataType>(fillRange),
seed + 2);
}
CpuFpReferenceRMSNorm::forward<InputDataType, ScaleDataType, OutputDataType, ComputeDataType>(
inputTensor,
scaleTensor,
outputCpu,
epsilon,
includeInvRms ? &invRmsTensorCpu : nullptr,
includeBias ? &biasTensor : nullptr);
GpuFpReferenceRMSNorm::fprop<InputDataType, ScaleDataType, OutputDataType, ComputeDataType>(
inputTensor,
scaleTensor,
outputGpu,
epsilon,
includeInvRms ? &invRmsTensorGpu : nullptr,
includeBias ? &biasTensor : nullptr);
assertAllClose(outputCpu, outputGpu, getTolerance<OutputDataType>());
if(includeInvRms)
{
assertAllClose(invRmsTensorCpu, invRmsTensorGpu, getTolerance<ComputeDataType>());
}
}
// ============================================================================
// RMSNormFwdTestSuite — parameterized fixture for shape-based CPU-vs-GPU tests
// ============================================================================
template <typename DataType>
class RMSNormFwdTestSuite : public ::testing::TestWithParam<RMSNormTestCase>
{
protected:
void runRMSNormFwdTest()
{
SKIP_IF_NO_DEVICES();
const auto& tc = GetParam();
runGpuVsCpuRMSNormFwd<DataType>(tc.ioDims, tc.scaleDims, tc.layout, 1e-5, 1.0f, true, true);
}
};
} // namespace gpu_rmsnorm_fwd_ref_test