Files
TheRock/rocm-libraries/shared/tensile/Tensile/Source/client/source/DataInitialization.cpp
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

464 lines
19 KiB
C++

/*******************************************************************************
*
* MIT License
*
* Copyright (C) 2019-2022 Advanced Micro Devices, Inc. All rights reserved.
*
* 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.
*
*******************************************************************************/
#include "DataInitialization.hpp"
#include "DataInitializationTyped.hpp"
#include <Tensile/Utils.hpp>
#include <hip/hip_runtime.h>
namespace Tensile
{
namespace Client
{
std::string ToString(InitMode mode)
{
switch(mode)
{
case InitMode::Zero:
return "Zero";
case InitMode::One:
return "One";
case InitMode::Two:
return "Two";
case InitMode::Random:
return "Random";
case InitMode::NaN:
return "NaN";
case InitMode::Inf:
return "Inf";
case InitMode::BadInput:
return "BadInput";
case InitMode::BadOutput:
return "BadOutput";
case InitMode::SerialIdx:
return "SerialIdx";
case InitMode::SerialDim0:
return "SerialDim0";
case InitMode::SerialDim1:
return "SerialDim1";
case InitMode::Identity:
return "Identity";
case InitMode::TrigSin:
return "TrigSin";
case InitMode::TrigCos:
return "TrigCos";
case InitMode::TrigAbsSin:
return "TrigAbsSin";
case InitMode::TrigAbsCos:
return "TrigAbsCos";
case InitMode::RandomNarrow:
return "RandomNarrow";
case InitMode::NegOne:
return "NegOne";
case InitMode::Max:
return "Max";
case InitMode::DenormMin:
return "DenormMin";
case InitMode::DenormMax:
return "DenormMax";
case InitMode::Count:
break;
}
throw std::runtime_error(
concatenate("Invalid InitMode value: ", static_cast<int>(mode)));
}
std::ostream& operator<<(std::ostream& stream, InitMode const& mode)
{
return stream << ToString(mode);
}
std::istream& operator>>(std::istream& stream, InitMode& mode)
{
std::string strValue;
stream >> strValue;
if(strValue == ToString(InitMode::Zero))
mode = InitMode::Zero;
else if(strValue == ToString(InitMode::One))
mode = InitMode::One;
else if(strValue == ToString(InitMode::Two))
mode = InitMode::Two;
else if(strValue == ToString(InitMode::Random))
mode = InitMode::Random;
else if(strValue == ToString(InitMode::NaN))
mode = InitMode::NaN;
else if(strValue == ToString(InitMode::Inf))
mode = InitMode::Inf;
else if(strValue == ToString(InitMode::BadInput))
mode = InitMode::BadInput;
else if(strValue == ToString(InitMode::BadOutput))
mode = InitMode::BadOutput;
else if(strValue == ToString(InitMode::SerialIdx))
mode = InitMode::SerialIdx;
else if(strValue == ToString(InitMode::SerialDim0))
mode = InitMode::SerialDim0;
else if(strValue == ToString(InitMode::SerialDim1))
mode = InitMode::SerialDim1;
else if(strValue == ToString(InitMode::Identity))
mode = InitMode::Identity;
else if(strValue == ToString(InitMode::TrigSin))
mode = InitMode::TrigSin;
else if(strValue == ToString(InitMode::TrigCos))
mode = InitMode::TrigCos;
else if(strValue == ToString(InitMode::TrigAbsSin))
mode = InitMode::TrigAbsSin;
else if(strValue == ToString(InitMode::TrigAbsCos))
mode = InitMode::TrigAbsCos;
else if(strValue == ToString(InitMode::RandomNarrow))
mode = InitMode::RandomNarrow;
else if(strValue == ToString(InitMode::NegOne))
mode = InitMode::NegOne;
else if(strValue == ToString(InitMode::Max))
mode = InitMode::Max;
else if(strValue == ToString(InitMode::DenormMin))
mode = InitMode::DenormMin;
else if(strValue == ToString(InitMode::DenormMax))
mode = InitMode::DenormMax;
else if(std::all_of(strValue.begin(), strValue.end(), isdigit))
{
int value = atoi(strValue.c_str());
if(value >= 0 && value < static_cast<int>(InitMode::Count))
mode = static_cast<InitMode>(value);
else
throw std::runtime_error(
concatenate("Can't convert ", strValue, " to InitMode."));
}
else
{
throw std::runtime_error(concatenate("Can't convert ", strValue, " to InitMode."));
}
return stream;
}
std::ostream& operator<<(std::ostream& stream, BoundsCheckMode const& mode)
{
std::string strValue;
if(mode == BoundsCheckMode::Disable)
strValue = "Disable";
else if(mode == BoundsCheckMode::NaN)
strValue = "NaN";
else if(mode == BoundsCheckMode::GuardPageFront)
strValue = "GuardPageFront";
else if(mode == BoundsCheckMode::GuardPageBack)
strValue = "GuardPageBack";
else if(mode == BoundsCheckMode::GuardPageAll)
strValue = "GuardPageAll";
else
throw std::runtime_error(
concatenate("Invalid BoundsCheckMode value: ", static_cast<int>(mode)));
return stream << strValue;
}
std::istream& operator>>(std::istream& stream, BoundsCheckMode& mode)
{
std::string strValue;
stream >> strValue;
if(strValue == "Disable")
mode = BoundsCheckMode::Disable;
else if(strValue == "NaN")
mode = BoundsCheckMode::NaN;
else if(strValue == "GuardPageFront")
mode = BoundsCheckMode::GuardPageFront;
else if(strValue == "GuardPageBack")
mode = BoundsCheckMode::GuardPageBack;
else if(strValue == "GuardPageAll")
mode = BoundsCheckMode::GuardPageAll;
else if(std::all_of(strValue.begin(), strValue.end(), isdigit))
{
int value = atoi(strValue.c_str());
if(value >= 0 && value < static_cast<int>(BoundsCheckMode::MaxMode))
mode = static_cast<BoundsCheckMode>(value);
else
throw std::runtime_error(
concatenate("Can't convert ", strValue, " to BoundsCheckMode."));
}
else
{
throw std::runtime_error(
concatenate("Can't convert ", strValue, " to BoundsCheckMode."));
}
return stream;
}
double DataInitialization::GetRepresentativeBetaValue(po::variables_map const& args)
{
auto argValue = args["init-beta"].as<int>();
if(argValue == 0)
return 0.0;
if(argValue == 1)
return 1.0;
return 1.5;
}
template <typename TypedInputs>
std::shared_ptr<TypedDataInitialization<TypedInputs>>
DataInitialization::GetTyped(po::variables_map const& args,
ClientProblemFactory const& problemFactory,
size_t maxWorkspaceSize)
{
auto* ptr
= new TypedDataInitialization<TypedInputs>(args, problemFactory, maxWorkspaceSize);
return std::shared_ptr<TypedDataInitialization<TypedInputs>>(ptr);
}
std::shared_ptr<DataInitialization>
DataInitialization::Get(po::variables_map const& args,
ClientProblemFactory const& problemFactory,
size_t maxWorkspaceSize)
{
auto aType = args["a-type"].as<DataType>();
auto bType = args["b-type"].as<DataType>();
auto cType = args["c-type"].as<DataType>();
auto dType = args["d-type"].as<DataType>();
auto alphaType = args["alpha-type"].as<DataType>();
auto betaType = args["beta-type"].as<DataType>();
auto contractionInputsTypeId
= ContractionInputs::TypeId(aType, bType, cType, dType, alphaType, betaType);
switch(contractionInputsTypeId)
{
case ContractionInputs_S_S_S::TypeId():
{
return GetTyped<ContractionInputs_S_S_S>(args, problemFactory, maxWorkspaceSize);
}
case ContractionInputs_D_D_D::TypeId():
{
return GetTyped<ContractionInputs_D_D_D>(args, problemFactory, maxWorkspaceSize);
}
case ContractionInputs_C_C_C::TypeId():
{
return GetTyped<ContractionInputs_C_C_C>(args, problemFactory, maxWorkspaceSize);
}
case ContractionInputs_Z_Z_Z::TypeId():
{
return GetTyped<ContractionInputs_Z_Z_Z>(args, problemFactory, maxWorkspaceSize);
}
#ifdef TENSILE_USE_HALF
case ContractionInputs_H_H_H::TypeId():
{
return GetTyped<ContractionInputs_H_H_H>(args, problemFactory, maxWorkspaceSize);
}
case ContractionInputs_H_H_S::TypeId():
{
return GetTyped<ContractionInputs_H_H_S>(args, problemFactory, maxWorkspaceSize);
}
case ContractionInputs_H_S_S::TypeId():
{
return GetTyped<ContractionInputs_H_S_S>(args, problemFactory, maxWorkspaceSize);
}
#endif // TENSILE_USE_HALF
case ContractionInputs_I8x4_I32_I32::TypeId():
{
return GetTyped<ContractionInputs_I8x4_I32_I32>(
args, problemFactory, maxWorkspaceSize);
}
case ContractionInputs_I32_I32_I32::TypeId():
{
return GetTyped<ContractionInputs_I32_I32_I32>(
args, problemFactory, maxWorkspaceSize);
}
case ContractionInputs_I8_I32_I32::TypeId():
{
return GetTyped<ContractionInputs_I8_I32_I32>(
args, problemFactory, maxWorkspaceSize);
}
#ifdef TENSILE_USE_BF16
case ContractionInputs_B_B_S::TypeId():
{
return GetTyped<ContractionInputs_B_B_S>(args, problemFactory, maxWorkspaceSize);
}
case ContractionInputs_B_S_S::TypeId():
{
return GetTyped<ContractionInputs_B_S_S>(args, problemFactory, maxWorkspaceSize);
}
#endif // TENSILE_USE_BF16
#ifdef TENSILE_USE_FP8_BF8
case ContractionInputs_F8_F8_S::TypeId():
{
return GetTyped<ContractionInputs_F8_F8_S>(args, problemFactory, maxWorkspaceSize);
}
case ContractionInputs_F8_S_S::TypeId():
{
return GetTyped<ContractionInputs_F8_S_S>(args, problemFactory, maxWorkspaceSize);
}
case ContractionInputs_B8_B8_S::TypeId():
{
return GetTyped<ContractionInputs_B8_B8_S>(args, problemFactory, maxWorkspaceSize);
}
case ContractionInputs_B8_S_S::TypeId():
{
return GetTyped<ContractionInputs_B8_S_S>(args, problemFactory, maxWorkspaceSize);
}
// Hybrid cases: F8B8SS, B8SS
case ContractionInputs_F8B8_S_S::TypeId():
{
return GetTyped<ContractionInputs_F8B8_S_S>(args, problemFactory, maxWorkspaceSize);
}
case ContractionInputs_B8F8_S_S::TypeId():
{
return GetTyped<ContractionInputs_B8F8_S_S>(args, problemFactory, maxWorkspaceSize);
}
// Hybrid cases with To = B8
case ContractionInputs_F8B8_B8_S::TypeId():
{
return GetTyped<ContractionInputs_F8B8_B8_S>(
args, problemFactory, maxWorkspaceSize);
}
case ContractionInputs_B8F8_B8_S::TypeId():
{
return GetTyped<ContractionInputs_B8F8_B8_S>(
args, problemFactory, maxWorkspaceSize);
}
// cases with To = half
case ContractionInputs_F8_H_S::TypeId():
{
return GetTyped<ContractionInputs_F8_H_S>(args, problemFactory, maxWorkspaceSize);
}
case ContractionInputs_B8_H_S::TypeId():
{
return GetTyped<ContractionInputs_B8_H_S>(args, problemFactory, maxWorkspaceSize);
}
case ContractionInputs_F8B8_H_S::TypeId():
{
return GetTyped<ContractionInputs_F8B8_H_S>(args, problemFactory, maxWorkspaceSize);
}
case ContractionInputs_B8F8_H_S::TypeId():
{
return GetTyped<ContractionInputs_B8F8_H_S>(args, problemFactory, maxWorkspaceSize);
}
#endif // TENSILE_USE_FP8_BF8
default:;
}
throw std::runtime_error(concatenate("Invalid combination of data types: ",
"a: ",
aType,
", b: ",
bType,
", c: ",
cType,
", d: ",
dType,
", alpha: ",
alphaType,
", beta: ",
betaType));
}
DataInitialization::DataInitialization(po::variables_map const& args,
ClientProblemFactory const& problemFactory,
size_t maxWorkspaceSize)
: m_aInit(args["init-a"].as<InitMode>())
, m_bInit(args["init-b"].as<InitMode>())
, m_cInit(args["init-c"].as<InitMode>())
, m_dInit(args["init-d"].as<InitMode>())
, m_alphaInit(args["init-alpha"].as<InitMode>())
, m_betaInit(args["init-beta"].as<InitMode>())
, m_aMaxElements(0)
, m_bMaxElements(0)
, m_cMaxElements(0)
, m_dMaxElements(0)
, m_maxBatch(0)
, m_stridedBatched(args["strided-batched"].as<bool>())
, m_cEqualsD(args["c-equal-d"].as<bool>())
, m_elementsToValidate(args["num-elements-to-validate"].as<int>())
, m_keepPristineCopyOnGPU(args["pristine-on-gpu"].as<bool>())
, m_workspaceSize(maxWorkspaceSize)
{
m_boundsCheck = args["bounds-check"].as<BoundsCheckMode>();
m_curBoundsCheck = m_boundsCheck;
if(m_boundsCheck == BoundsCheckMode::GuardPageAll)
{
//GuardPageAll needs 2 runs per solution.
//First run perform front side guard page checking.
m_curBoundsCheck = BoundsCheckMode::GuardPageFront;
m_numRunsPerSolution = 2;
}
if(args.count("convolution-vs-contraction"))
m_convolutionVsContraction = args["convolution-vs-contraction"].as<bool>();
for(auto const& problem : problemFactory.problems())
{
m_aMaxElements = std::max(m_aMaxElements, problem.a().totalAllocatedElements());
m_bMaxElements = std::max(m_bMaxElements, problem.b().totalAllocatedElements());
m_cMaxElements = std::max(m_cMaxElements, problem.c().totalAllocatedElements());
m_dMaxElements = std::max(m_dMaxElements, problem.d().totalAllocatedElements());
size_t numOfBatch = 1;
for(size_t i = 0; i < problem.batchIndices().size(); i++)
numOfBatch *= problem.batchSize(i);
m_maxBatch = std::max(m_maxBatch, numOfBatch);
}
if(m_curBoundsCheck == BoundsCheckMode::NaN)
{
m_aMaxElements += 1024;
m_bMaxElements += 1024;
m_cMaxElements += 1024;
m_dMaxElements += 1024;
}
else if(m_curBoundsCheck == BoundsCheckMode::GuardPageFront
|| m_curBoundsCheck == BoundsCheckMode::GuardPageBack)
{
unsigned int aRoundUpSize
= pageSize / DataTypeInfo::Get(args["a-type"].as<DataType>()).elementSize;
unsigned int bRoundUpSize
= pageSize / DataTypeInfo::Get(args["b-type"].as<DataType>()).elementSize;
unsigned int cRoundUpSize
= pageSize / DataTypeInfo::Get(args["c-type"].as<DataType>()).elementSize;
unsigned int dRoundUpSize
= pageSize / DataTypeInfo::Get(args["d-type"].as<DataType>()).elementSize;
m_aMaxElements = RoundUpToMultiple<unsigned int>(m_aMaxElements, aRoundUpSize);
m_bMaxElements = RoundUpToMultiple<unsigned int>(m_bMaxElements, bRoundUpSize);
m_cMaxElements = RoundUpToMultiple<unsigned int>(m_cMaxElements, cRoundUpSize);
m_dMaxElements = RoundUpToMultiple<unsigned int>(m_dMaxElements, dRoundUpSize);
}
m_problemDependentData = IsProblemDependent(m_aInit) || IsProblemDependent(m_bInit)
|| IsProblemDependent(m_cInit) || IsProblemDependent(m_dInit);
}
DataInitialization::~DataInitialization() {}
} // namespace Client
} // namespace Tensile