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

212 lines
7.6 KiB
C++

// Copyright Advanced Micro Devices, Inc., or its affiliates.
// SPDX-License-Identifier: MIT
#pragma once
#include <numeric>
#include <rocRoller/CommandSolution.hpp>
#include <rocRoller/DataTypes/DataTypes.hpp>
#include <rocRoller/Operations/CommandArguments.hpp>
#include <rocRoller/Utilities/Utils.hpp>
namespace rocRoller
{
/**
* [sizeBegin,sizeEnd): A range of values representing sizes of dimensions.
* Returns the number of coordinates within that space,
* i.e. the product of those values.
*/
template <typename SizeIter>
size_t CoordCount(SizeIter sizeBegin, SizeIter sizeEnd);
/**
* [sizeBegin,sizeEnd): A range of values representing sizes of dimensions.
* Writes into [coordBegin:coordEnd) the coordinates numbered `num` within
* a linearization of all coordinates with earlier values being
* faster-moving.
*/
template <typename CoordIter, typename SizeIter>
void CoordNumbered(
size_t num, CoordIter coordBegin, CoordIter coordEnd, SizeIter sizeBegin, SizeIter sizeEnd);
/**
* If [coordBegin, coordEnd) represents coordinate x within the
* linearization, updates it to represent coordinate x+1.
*
* If [coordBegin, coordEnd) represents the last coordinate within the
* linearization, it will be reset to all 0s and false will be returned.
*/
template <typename CoordIter, typename SizeIter>
bool IncrementCoord(CoordIter coordBegin,
CoordIter coordEnd,
SizeIter sizeBegin,
SizeIter sizeEnd);
/*
* Describes a tensor including dimensions, memory layout, and data type.
* Decoupled from any particular pointer value or memory location.
*/
class TensorDescriptor
{
public:
TensorDescriptor();
template <typename IterA, typename IterB>
TensorDescriptor(DataType t,
IterA sizesBegin,
IterA sizesEnd,
IterB stridesBegin,
IterB stridesEnd,
size_t offset = 0);
template <typename Iter>
TensorDescriptor(DataType t, Iter sizesBegin, Iter sizesEnd, size_t offset = 0);
/**
* Allow directly specifying total number of elements instead of sizes
*/
TensorDescriptor(DataType t, std::initializer_list<size_t> sizes, size_t offset = 0);
TensorDescriptor(DataType t, std::vector<size_t> sizes, size_t offset = 0);
TensorDescriptor(DataType t,
std::initializer_list<size_t> sizes,
std::initializer_list<size_t> strides,
size_t offset = 0);
TensorDescriptor(DataType t,
std::vector<size_t> sizes,
std::vector<size_t> strides,
size_t offset = 0);
/**
* Specialized constructor for 2-D tensor (i.e., matrix)
*/
TensorDescriptor(DataType t,
std::array<size_t, 2> sizes,
std::string const& transpose,
size_t offset = 0);
static TensorDescriptor
ShuffledNoPadding(DataType t, std::vector<size_t> sizes, std::vector<size_t> dimOrder);
static TensorDescriptor ShuffledNoPadding(DataType t,
std::initializer_list<size_t> sizes,
std::vector<size_t> dimOrder);
static TensorDescriptor ShuffledNoPadding(DataType t,
std::vector<size_t> sizes,
std::initializer_list<size_t> dimOrder);
static TensorDescriptor ShuffledNoPadding(DataType t,
std::initializer_list<size_t> sizes,
std::initializer_list<size_t> dimOrder);
inline void calculate();
const size_t size(size_t index) const;
const std::vector<size_t>& sizes() const;
const size_t stride(size_t index) const;
const std::vector<size_t>& strides() const;
size_t offset() const;
size_t dimensions() const;
size_t totalLogicalElements() const;
size_t totalAllocatedElements() const;
size_t totalAllocatedBytes() const;
size_t elementBytes() const;
/**
* Returns the number of elements of padding in the given dimension (0 if
* unpadded). May be negative if stride is less than size
*/
int64_t dimensionPadding(size_t dim) const;
/**
* Collapses dimensions in the interval [begin, end).
*
* preconditions:
* - end >= begin
* - begin < dimensions()
* - end <= dimensions()
* - dimensions in the interval [begin, end-1) are not padded.
*
* postconditions:
* - dimensions() is diminished by end-begin
* - total elements (allocated and logical) remain the same
* - dimension 'begin' is the product of all the dimensions in the interval
* [begin, end).
*/
void collapseDims(size_t begin, size_t end);
DataType dataType() const;
bool operator==(const TensorDescriptor& rhs) const;
bool operator!=(const TensorDescriptor& rhs) const;
std::string toString() const;
template <typename Container>
inline size_t index(Container const& indices) const;
template <typename T>
inline size_t index(std::initializer_list<T> indices) const;
template <std::integral... Ts>
inline size_t index(Ts... is) const;
inline bool incrementCoord(std::vector<size_t>& coord, size_t firstDimension = 0) const;
TensorDescriptor withNormalizedDimensions() const;
friend std::ostream& operator<<(std::ostream& stream, const TensorDescriptor& t);
static inline const size_t UseDefaultStride = -1;
private:
std::vector<size_t> m_sizes;
std::vector<size_t> m_strides;
size_t m_offset = 0;
size_t m_totalLogicalElements = 0;
size_t m_totalAllocatedElements = 0;
DataType m_dataType = DataType::Float;
};
template <CCommandArgumentValue T>
inline void setCommandTensorArg(rocRoller::CommandArguments& commandArgs,
rocRoller::Operations::OperationTag const& tag,
TensorDescriptor& desc,
T value);
template <typename T>
std::string writeTensor(std::vector<T> const& data, TensorDescriptor desc);
/**
* `dst` and `src` must be two TensorDescriptors with the same data type
* and dimension sizes (i.e. dst.sizes() == src.sizes()). They should have
* different strides (or this function is a no-op).
*
* `input` must contain data arranged according to `src`.
*
* Returns `input` rearranged according to the strides in `dst`.
*/
template <typename T>
inline std::vector<T> shuffleDims(std::vector<T> const& input,
TensorDescriptor const& dst,
TensorDescriptor const& src);
}
#include "TensorDescriptor_impl.hpp"