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
329 lines
9.8 KiB
C++
329 lines
9.8 KiB
C++
// Copyright Advanced Micro Devices, Inc., or its affiliates.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
#pragma once
|
|
|
|
#include <rocRoller/Operations/CommandArgument.hpp>
|
|
#include <rocRoller/Utilities/Error.hpp>
|
|
#include <rocRoller/Utilities/Utils.hpp>
|
|
|
|
#include <cstring>
|
|
|
|
namespace rocRoller
|
|
{
|
|
inline CommandArgument::CommandArgument(CommandPtr com,
|
|
VariableType variableType,
|
|
size_t offset,
|
|
DataDirection direction,
|
|
std::string name)
|
|
: m_command(std::move(com))
|
|
, m_size(variableType.getElementSize())
|
|
, m_variableType(variableType)
|
|
, m_offset(offset)
|
|
, m_direction(direction)
|
|
, m_name(std::move(name))
|
|
{
|
|
}
|
|
|
|
template <typename T>
|
|
requires(!std::is_pointer_v<T>)
|
|
CommandArgumentValue CommandArgument::getValue(RuntimeArguments const& args)
|
|
const
|
|
{
|
|
if(m_variableType.pointerType == PointerType::Value)
|
|
{
|
|
AssertFatal(m_size == sizeof(T), ShowValue(m_size), ShowValue(sizeof(T)));
|
|
AssertFatal((m_offset + m_size) <= args.size(),
|
|
ShowValue(m_offset),
|
|
ShowValue(m_size),
|
|
ShowValue(args.size()));
|
|
|
|
T rv;
|
|
std::memcpy(&rv, &args[m_offset], sizeof(T));
|
|
return rv;
|
|
}
|
|
|
|
if(m_variableType.pointerType == PointerType::PointerGlobal)
|
|
{
|
|
if constexpr(CCommandArgumentValue<T*>)
|
|
{
|
|
AssertFatal(m_size == sizeof(T*), ShowValue(m_size), ShowValue(sizeof(T*)));
|
|
AssertFatal((m_offset + m_size) <= args.size(),
|
|
ShowValue(m_offset),
|
|
ShowValue(m_size),
|
|
ShowValue(args.size()));
|
|
|
|
T* rv;
|
|
std::memcpy(&rv, &args[m_offset], sizeof(T*));
|
|
return rv;
|
|
}
|
|
}
|
|
|
|
throw std::runtime_error(
|
|
concatenate("Invalid variable type for command argument:", m_variableType));
|
|
}
|
|
|
|
inline std::string CommandArgument::toString() const
|
|
{
|
|
return concatenate(m_name,
|
|
": ",
|
|
m_variableType,
|
|
"(offset: ",
|
|
m_offset,
|
|
", size: ",
|
|
m_size,
|
|
", ",
|
|
m_direction,
|
|
")");
|
|
}
|
|
|
|
inline CommandArgumentValue CommandArgument::getValue(RuntimeArguments const& args) const
|
|
{
|
|
if(args.data() == nullptr)
|
|
throw std::runtime_error("Can't get runtime argument value.");
|
|
|
|
switch(m_variableType.dataType)
|
|
{
|
|
case DataType::Float:
|
|
return getValue<float>(args);
|
|
case DataType::Double:
|
|
return getValue<double>(args);
|
|
// case DataType::ComplexFloat:
|
|
// return getValue<std::complex<float>>(args);
|
|
// case DataType::ComplexDouble:
|
|
// return getValue<std::complex<double>>(args);
|
|
case DataType::Half:
|
|
return getValue<Half>(args);
|
|
// case DataType::Int8x4:
|
|
// return getValue<Int8x4>(args);
|
|
case DataType::FP8:
|
|
return getValue<FP8>(args);
|
|
case DataType::BF8:
|
|
return getValue<BF8>(args);
|
|
case DataType::FP6:
|
|
return getValue<FP6>(args);
|
|
case DataType::BF6:
|
|
return getValue<BF6>(args);
|
|
case DataType::FP4:
|
|
return getValue<FP4>(args);
|
|
case DataType::Int32:
|
|
return getValue<int32_t>(args);
|
|
case DataType::Int64:
|
|
return getValue<int64_t>(args);
|
|
case DataType::BFloat16:
|
|
return getValue<BFloat16>(args);
|
|
case DataType::UInt8:
|
|
return getValue<uint8_t>(args);
|
|
case DataType::Int8:
|
|
return getValue<int8_t>(args);
|
|
case DataType::Raw32:
|
|
return getValue<uint32_t>(args);
|
|
case DataType::UInt32:
|
|
return getValue<uint32_t>(args);
|
|
case DataType::UInt64:
|
|
return getValue<uint64_t>(args);
|
|
case DataType::Bool:
|
|
return getValue<bool>(args);
|
|
case DataType::E8M0:
|
|
return getValue<E8M0>(args);
|
|
case DataType::E5M3:
|
|
return getValue<E5M3>(args);
|
|
case DataType::E4M3:
|
|
return getValue<E4M3>(args);
|
|
case DataType::Count:
|
|
default:
|
|
Throw<FatalError>("Unsupported argument type ", ShowValue(m_variableType));
|
|
}
|
|
}
|
|
|
|
inline bool CommandArgument::operator==(const CommandArgument& rhs) const
|
|
{
|
|
return m_size == rhs.m_size && m_offset == rhs.m_offset
|
|
&& m_variableType == rhs.m_variableType && m_direction == rhs.m_direction
|
|
&& m_name == rhs.m_name;
|
|
}
|
|
|
|
inline unsigned int getUnsignedInt(CommandArgumentValue val)
|
|
{
|
|
return visit(
|
|
[](auto value) -> unsigned int {
|
|
using T = std::decay_t<decltype(value)>;
|
|
|
|
if constexpr(std::integral<T>)
|
|
{
|
|
return static_cast<unsigned int>(value);
|
|
}
|
|
else
|
|
{
|
|
throw std::runtime_error("Not integer type");
|
|
}
|
|
},
|
|
val);
|
|
}
|
|
|
|
inline uint64_t getUInt64(CommandArgumentValue val)
|
|
{
|
|
return visit(
|
|
[](auto value) -> uint64_t {
|
|
using T = std::decay_t<decltype(value)>;
|
|
|
|
if constexpr(std::integral<T>)
|
|
{
|
|
return static_cast<uint64_t>(value);
|
|
}
|
|
else
|
|
{
|
|
throw std::runtime_error("Not integer type");
|
|
}
|
|
},
|
|
val);
|
|
}
|
|
|
|
inline bool isInteger(CommandArgumentValue val)
|
|
{
|
|
return visit(
|
|
[](auto value) -> bool {
|
|
using T = std::decay_t<decltype(value)>;
|
|
|
|
return (std::integral<T>) ? true : false;
|
|
},
|
|
val);
|
|
}
|
|
|
|
inline int CommandArgument::offset() const
|
|
{
|
|
return m_offset;
|
|
}
|
|
|
|
inline int CommandArgument::size() const
|
|
{
|
|
return m_size;
|
|
}
|
|
|
|
inline VariableType CommandArgument::variableType() const
|
|
{
|
|
return m_variableType;
|
|
}
|
|
|
|
inline DataDirection CommandArgument::direction() const
|
|
{
|
|
return m_direction;
|
|
}
|
|
|
|
inline std::string CommandArgument::name() const
|
|
{
|
|
return m_name;
|
|
}
|
|
|
|
struct CommandArgumentValueVariableTypeVisitor
|
|
{
|
|
template <CCommandArgumentValue Value>
|
|
requires(!std::is_pointer<Value>::value) VariableType value()
|
|
const
|
|
{
|
|
return TypeInfo<Value>::Var;
|
|
}
|
|
|
|
template <CCommandArgumentValue Value>
|
|
requires(std::is_pointer<Value>::value) VariableType value()
|
|
const
|
|
{
|
|
using Pointed = typename std::remove_pointer<Value>::type;
|
|
// no pointers-to-pointer (yet)
|
|
static_assert(!std::is_pointer<Pointed>::value);
|
|
|
|
auto pointedType = TypeInfo<Pointed>::Var.dataType;
|
|
return VariableType(pointedType, PointerType::PointerGlobal);
|
|
}
|
|
|
|
template <CCommandArgumentValue Value>
|
|
VariableType operator()(Value const&) const
|
|
{
|
|
return value<Value>();
|
|
}
|
|
|
|
VariableType call(CommandArgumentValue const& val) const
|
|
{
|
|
return std::visit(*this, val);
|
|
}
|
|
};
|
|
|
|
inline VariableType variableType(CommandArgumentValue const& val)
|
|
{
|
|
CommandArgumentValueVariableTypeVisitor visitor;
|
|
return visitor.call(val);
|
|
}
|
|
|
|
struct CommandArgumentValueNameVisitor
|
|
{
|
|
template <CCommandArgumentValue Value>
|
|
requires(!std::is_pointer<Value>::value) std::string value()
|
|
const
|
|
{
|
|
return TypeInfo<Value>::Name();
|
|
}
|
|
|
|
template <CCommandArgumentValue Value>
|
|
requires(std::is_pointer<Value>::value) std::string value()
|
|
const
|
|
{
|
|
using Pointed = typename std::remove_pointer<Value>::type;
|
|
static_assert(!std::is_same<Value, Pointed>::value);
|
|
|
|
return value<Pointed>() + " *";
|
|
}
|
|
|
|
template <CCommandArgumentValue Value>
|
|
std::string operator()(Value const&) const
|
|
{
|
|
return value<Value>();
|
|
}
|
|
|
|
std::string call(CommandArgumentValue const& val) const
|
|
{
|
|
return std::visit(*this, val);
|
|
}
|
|
};
|
|
|
|
inline std::string name(CommandArgumentValue const& val)
|
|
{
|
|
CommandArgumentValueNameVisitor v;
|
|
return v.call(val);
|
|
}
|
|
|
|
inline std::string toString(CommandArgumentValue const& val)
|
|
{
|
|
return std::visit(
|
|
rocRoller::overloaded{
|
|
[](CPointer auto const& value) { return concatenate(static_cast<void*>(value)); },
|
|
[](auto const& value) { return concatenate(value); }},
|
|
val);
|
|
}
|
|
|
|
inline std::ostream& operator<<(std::ostream& stream, CommandArgumentValue const& val)
|
|
{
|
|
return stream << toString(val);
|
|
}
|
|
|
|
inline std::ostream& operator<<(std::ostream& stream, CommandArgument const& arg)
|
|
{
|
|
return stream << arg.toString();
|
|
}
|
|
|
|
inline std::ostream& operator<<(std::ostream& stream, CommandArgumentPtr const& arg)
|
|
{
|
|
if(arg)
|
|
return stream << *arg;
|
|
else
|
|
return stream << "nullptr";
|
|
}
|
|
|
|
inline std::ostream& operator<<(std::ostream& stream,
|
|
std::vector<CommandArgumentPtr> const& arg)
|
|
{
|
|
stream << "[\n";
|
|
streamJoin(stream, arg, ", \n");
|
|
return stream << "\n]";
|
|
}
|
|
}
|