// Copyright © Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #pragma once #include "RMSNormShapeCatalog.hpp" #include #include #include #include #include #include #include #include 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 void runGpuVsCpuRMSNormFwd(const std::vector& ioDims, const std::vector& scaleDims, const TensorLayout& layout, double epsilon, float fillRange = 1.0f, bool includeInvRms = false, bool includeBias = false) { const unsigned int seed = getGlobalTestSeed(); auto inputTensor = Tensor(ioDims, layout); auto scaleTensor = Tensor(scaleDims, layout); auto outputCpu = Tensor(ioDims, layout); auto outputGpu = Tensor(ioDims, layout); inputTensor.fillWithRandomValues( static_cast(-fillRange), static_cast(fillRange), seed); scaleTensor.fillWithRandomValues( static_cast(-fillRange), static_cast(fillRange), seed + 1); std::vector invRmsDims = ioDims; for(size_t i = 0; i < invRmsDims.size(); ++i) { if(scaleDims[i] != 1) { invRmsDims[i] = 1; } } auto invRmsTensorCpu = includeInvRms ? Tensor(invRmsDims, layout) : Tensor({}); auto invRmsTensorGpu = includeInvRms ? Tensor(invRmsDims, layout) : Tensor({}); auto biasTensor = includeBias ? Tensor(scaleDims, layout) : Tensor({}); if(includeBias) { biasTensor.fillWithRandomValues(static_cast(-fillRange), static_cast(fillRange), seed + 2); } CpuFpReferenceRMSNorm::forward( inputTensor, scaleTensor, outputCpu, epsilon, includeInvRms ? &invRmsTensorCpu : nullptr, includeBias ? &biasTensor : nullptr); GpuFpReferenceRMSNorm::fprop( inputTensor, scaleTensor, outputGpu, epsilon, includeInvRms ? &invRmsTensorGpu : nullptr, includeBias ? &biasTensor : nullptr); assertAllClose(outputCpu, outputGpu, getTolerance()); if(includeInvRms) { assertAllClose(invRmsTensorCpu, invRmsTensorGpu, getTolerance()); } } // ============================================================================ // RMSNormFwdTestSuite — parameterized fixture for shape-based CPU-vs-GPU tests // ============================================================================ template class RMSNormFwdTestSuite : public ::testing::TestWithParam { protected: void runRMSNormFwdTest() { SKIP_IF_NO_DEVICES(); const auto& tc = GetParam(); runGpuVsCpuRMSNormFwd(tc.ioDims, tc.scaleDims, tc.layout, 1e-5, 1.0f, true, true); } }; } // namespace gpu_rmsnorm_fwd_ref_test