Speclib  0.1.2
The library for writing better CUDA libraries
sp::BroadcastingTensor< T, R, Options, BroadcastOptions > Class Template Reference

A Tensor that implements "broadcasting". More...

#include <BroadcastingTensor.hpp>

Inheritance diagram for sp::BroadcastingTensor< T, R, Options, BroadcastOptions >:
[legend]

Public Types

using PtrType = typename Base::PtrType
 
using ValueType = std::remove_const_t< T >
 
using Opts = Options
 
template<typename NewT >
using InValueType = BroadcastingTensor< NewT, R, Options, BroadcastOptions >
 
- Public Types inherited from sp::MemTensorLike< BroadcastingTensor< T, R, sp::DefaultTensorOptions, DefaultBroadcastTensorOptions >, T, R, sp::DefaultTensorOptions >
using ThisType = MemTensorLike< BroadcastingTensor< T, R, sp::DefaultTensorOptions, DefaultBroadcastTensorOptions >, T, TensorRank, sp::DefaultTensorOptions >
 
using ValueType = sp::remove_cvref_t< sp::remove_addrspace_t< T > >
 
using Type = T
 
using Opts = sp::DefaultTensorOptions
 
using Base = TensorLike< BroadcastingTensor< T, R, sp::DefaultTensorOptions, DefaultBroadcastTensorOptions >, TensorRank >
 
using InValueType = MemTensorLike< BroadcastingTensor< T, R, sp::DefaultTensorOptions, DefaultBroadcastTensorOptions >, NewT, TensorRank, sp::DefaultTensorOptions >
 
using PtrType = T *
 The type of the data pointer. More...
 

Public Member Functions

void overwriteStrides (sp::Vec< int, Rank > allocatedSize)
 Overwrite strides with with zero if they are broadcasting. More...
 
template<int L, CacheMode Mode = CacheMode::DEFAULT>
constexpr sp::Vec< T, L > vectorReadImpl (const Vec< int, Rank > &pos) const
 
 BroadcastingTensor (PtrType data, const Vec< int, Rank > &logicalSize, const Vec< int, Rank > &allocatedSize)
 Construct from a data pointer and sizes. More...
 
 BroadcastingTensor (PtrType data, const Vec< int, Rank > &logicalSize, const Vec< int, Rank > &allocatedSize, const Vec< int, Rank > &strides)
 Construct from a data pointer, sizes, and strides. More...
 
- Public Member Functions inherited from sp::MemTensorLike< BroadcastingTensor< T, R, sp::DefaultTensorOptions, DefaultBroadcastTensorOptions >, T, R, sp::DefaultTensorOptions >
auto getSizes () const
 
void setSizes (sp::Vec< int, Rank > sz)
 
auto & getSize (int n)
 
const auto & getSize (int n) const
 
auto getStrides () const
 
void setStrides (sp::Vec< int, getNumStrides()> sz)
 
auto & getStride (int n)
 
const auto & getStride (int n) const
 
auto & getTotalSize ()
 
const auto & getTotalSize () const
 
auto & sizeQuantisation ()
 
const auto & sizeQuantisation () const
 
void setDefaultSizeQuantisation ()
 
sp::Vec< int, Rank > getDimsWithPadding ()
 
void validateFields ()
 
void computeStrides ()
 Compute strides in the default way. More...
 
int totalSizeImpl () const
 Get the total memory occupied by the Tensor, in terms of elements. More...
 
sp::Vec< int, Rank > stridesImpl () const
 Default implementation of the stride-getter. More...
 
sp::Vec< int, Rank > strides () const
 
int stride (int i) const
 
 MemTensorLike (PtrType ptr, const Vec< int, Rank > &sizes)
 Create a Tensor. More...
 
 MemTensorLike (PtrType ptr, const Vec< int, Rank > &sizes, const Vec< int, Rank > &strides)
 Create a Tensor with specified strides. More...
 
int computeOffsetImpl (const Vec< int, Rank > &pos) const
 Calculate the offset from the start of the buffer that a particular element can be found at. More...
 
int computeOffset (const Vec< int, Rank > &pos) const
 
const PtrType ptr (const Vec< int, Rank > &pos) const
 Get a pointer to a particular element. More...
 
PtrType ptr (const Vec< int, Rank > &pos)
 
const PtrType ptr () const
 Get a pointer to the start of the underlying buffer. More...
 
PtrType ptr ()
 
auto begin () const
 
auto end () const
 
auto getViewImpl (const sp::Vec< int, Rank > &start, const sp::Vec< int, Rank > &size)
 Create a view into this Tensor using identical striding. More...
 
auto & operator[] (int idx)
 Handy 1D subscript operator. More...
 
const auto & operator[] (int idx) const
 
void setSizeQuantisation (int x)
 Set the size quantisation for the bounds checks. More...
 
- Public Member Functions inherited from sp::TensorLike< Subclass, TensorRank >
auto dims () const
 
bool boundsCheck (const Vec< int, Rank > &pos) const
 
template<int L, CacheMode Mode = CacheMode::DEFAULT>
auto vectorRead (const Vec< int, Rank > &pos) const
 
template<int L, CacheMode Mode = CacheMode::DEFAULT>
auto vectorOffsetRead (const Vec< int, Rank > &base, const Vec< int, Rank > &offset) const
 
template<int L, CacheMode Mode = CacheMode::DEFAULT>
auto maskedVectorRead (const Vec< int, Rank > &pos) const
 
template<int L, CacheMode Mode = CacheMode::DEFAULT, typename T >
void vectorWrite (const Vec< int, Rank > &pos, const Vec< T, L > &values)
 
template<int L, CacheMode Mode = CacheMode::DEFAULT, typename T >
void maskedVectorWrite (const Vec< int, Rank > &pos, const Vec< T, L > &values)
 
int sizeQuantisation () const
 
int totalSize () const
 Get the total memory occupied by the Tensor, in terms of elements. More...
 
auto getView (const sp::Vec< int, Rank > &start, const sp::Vec< int, Rank > &size)
 Get an object that represents (and aliases) a portion of this object. More...
 
int dim (int d) const
 Behaviour common to all TensorLikes ///. More...
 
template<CacheMode Mode = CacheMode::DEFAULT>
auto read (const Vec< int, Rank > &pos) const
 Get the element at a given position. More...
 
template<CacheMode Mode = CacheMode::DEFAULT, typename T >
void write (const Vec< int, Rank > &pos, const T &value)
 Set a single element. More...
 
template<int Dummy = 0>
int size () const
 
template<int L>
void boundsCheckAccess (Vec< int, Rank > pos) const
 Bounds-check an L-element vector read at pos. More...
 

Static Public Attributes

static constexpr int Rank = R
 
static constexpr int NumStrides = std::max(Rank - 1, Base::calculateNumStrides())
 
- Static Public Attributes inherited from sp::MemTensorLike< BroadcastingTensor< T, R, sp::DefaultTensorOptions, DefaultBroadcastTensorOptions >, T, R, sp::DefaultTensorOptions >
static constexpr int Rank
 
static constexpr bool AllowVectorMemoryOps
 An overrideable flag to indicate if a concrete MemTensorLike subclass supports vector memory operations. More...
 
static constexpr int NumStrides
 The number of strides to explicitly store. More...
 
static constexpr int ImplicitStrides
 The number of strides that are not stored. More...
 
constexpr static bool HasTotalSize
 
- Static Public Attributes inherited from sp::TensorLike< Subclass, TensorRank >
constexpr static int Rank = TensorRank
 

Protected Member Functions

sp::Vec< int, Rank > stridesImpl () const
 Get the strides. More...
 
bool boundsCheckImpl (const Vec< int, Rank > &pos) const
 
- Protected Member Functions inherited from sp::MemTensorLike< BroadcastingTensor< T, R, sp::DefaultTensorOptions, DefaultBroadcastTensorOptions >, T, R, sp::DefaultTensorOptions >
sp::Vec< int, Rank > dimsImpl () const
 
int sizeQuantisationImpl () const
 
Vec< ValueType, L > vectorReadImpl (const Vec< int, Rank > &pos) const
 This will yield a vector load instruction if the alignment permits. More...
 
void vectorWriteImpl (const Vec< int, Rank > &pos, const Vec< ValueType, L > &values)
 
- Protected Member Functions inherited from sp::TensorLike< Subclass, TensorRank >
template<typename Dummy = void*>
auto dimsImpl () const
 Get an sp::Vec<int, X> representing the dimensions of the object. More...
 
bool boundsCheckImpl (const sp::Vec< int, Rank > &) const
 Return true iff the given coordinates are inside the object (Default implementation below) More...
 
int sizeQuantisationImpl () const
 The last dimension is rounded up to the next multiple of this value for the purposes of bounds checks. More...
 
template<int L, CacheMode Mode = CacheMode::DEFAULT>
auto vectorReadImpl (const Vec< int, Rank > &) const
 Read L elements, adjacent in the last dimension, starting at the given position. More...
 
template<int L, CacheMode Mode = CacheMode::DEFAULT>
auto vectorOffsetReadImpl (const Vec< int, Rank > &base, const Vec< int, Rank > &offset) const
 Read L elements, adjacent in the last dimension, from position base + offset. More...
 
template<int L, CacheMode Mode = CacheMode::DEFAULT>
auto maskedVectorReadImpl (const Vec< int, Rank > &pos) const
 Do a vectorRead that copes with the possibility of part of the vector being out of bounds. More...
 
template<int L, CacheMode Mode = CacheMode::DEFAULT, typename T >
void maskedVectorWriteImpl (const Vec< int, Rank > &pos, const Vec< T, L > &values)
 Do a vectorWrite that copes with the possibility of part of the vector being out of bounds. More...
 
template<int L, CacheMode Mode, typename T >
void vectorWriteImpl (const Vec< int, Rank > &pos, const Vec< T, L > &values)
 Write L elements, adjacent in the last dimension, starting at the given position. More...
 
auto getViewImpl (const sp::Vec< int, Rank > &start, const sp::Vec< int, Rank > &size)
 The default implementation just makes a TensorView. Not hugely fast, but always works. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from sp::MemTensorLike< BroadcastingTensor< T, R, sp::DefaultTensorOptions, DefaultBroadcastTensorOptions >, T, R, sp::DefaultTensorOptions >
static constexpr int calculateNumStrides ()
 Compute the default value for NumStrides. More...
 
- Public Attributes inherited from sp::MemTensorLike< BroadcastingTensor< T, R, sp::DefaultTensorOptions, DefaultBroadcastTensorOptions >, T, R, sp::DefaultTensorOptions >
friend Base
 
PtrType dataPtr
 
sp::Vec< int, Rank+getNumStrides()+HasTotalSize+AssertionsEnabled > variousIntegers
 

Detailed Description

template<typename T, int R, typename Options = sp::DefaultTensorOptions, typename BroadcastOptions = DefaultBroadcastTensorOptions>
class sp::BroadcastingTensor< T, R, Options, BroadcastOptions >

A Tensor that implements "broadcasting".

Such a tensor has a "logical" size and an "actual" size. Actual size is the real size of the underlying Tensor in memory, and logical size is the size it pretends to be.

When actualSize[i] == 0, the tensor behaves as if actualSize[i] == logicalSize[i], where the extra elements are created by copying the tensor repeatedly across the i'th dimension.

Template Parameters
BroadcastOptionsOptimiser flags unique to BroadcastingTensors.

Constructor & Destructor Documentation

◆ BroadcastingTensor() [1/2]

template<typename T , int R, typename Options = sp::DefaultTensorOptions, typename BroadcastOptions = DefaultBroadcastTensorOptions>
sp::BroadcastingTensor< T, R, Options, BroadcastOptions >::BroadcastingTensor ( PtrType  data,
const Vec< int, Rank > &  logicalSize,
const Vec< int, Rank > &  allocatedSize 
)

Construct from a data pointer and sizes.

◆ BroadcastingTensor() [2/2]

template<typename T , int R, typename Options = sp::DefaultTensorOptions, typename BroadcastOptions = DefaultBroadcastTensorOptions>
sp::BroadcastingTensor< T, R, Options, BroadcastOptions >::BroadcastingTensor ( PtrType  data,
const Vec< int, Rank > &  logicalSize,
const Vec< int, Rank > &  allocatedSize,
const Vec< int, Rank > &  strides 
)

Construct from a data pointer, sizes, and strides.

Member Function Documentation

◆ overwriteStrides()

template<typename T , int R, typename Options = sp::DefaultTensorOptions, typename BroadcastOptions = DefaultBroadcastTensorOptions>
void sp::BroadcastingTensor< T, R, Options, BroadcastOptions >::overwriteStrides ( sp::Vec< int, Rank >  allocatedSize)

Overwrite strides with with zero if they are broadcasting.

◆ stridesImpl()

template<typename T , int R, typename Options = sp::DefaultTensorOptions, typename BroadcastOptions = DefaultBroadcastTensorOptions>
sp::Vec< int, Rank > sp::BroadcastingTensor< T, R, Options, BroadcastOptions >::stridesImpl ( ) const
protected

Get the strides.

This is just a hook for us to apply the constexpr zero to the last stride when appropriate. Otherwise, we're effectively just delegating to the base class.