A Tensor
that's backed by a texture object.
More...
#include <TexTensor.hpp>
Public Types | |
using | Base = MemTensorLike< TexTensor< T, R, Options >, T, R, Options > |
using | PtrType = typename Base::PtrType |
using | ValueType = sp::remove_cvref_t< sp::remove_addrspace_t< T > > |
using | Type = T |
using | RealType = sp::real_type_t< ValueType > |
using | Opts = Options |
template<typename NewT > | |
using | InValueType = TexTensor< NewT, R, Options > |
Public Types inherited from sp::MemTensorLike< TexTensor< T, R, sp::DefaultTexTensorOptions >, T, R, sp::DefaultTexTensorOptions > | |
using | ThisType = MemTensorLike< TexTensor< T, R, sp::DefaultTexTensorOptions >, T, TensorRank, sp::DefaultTexTensorOptions > |
using | ValueType = sp::remove_cvref_t< sp::remove_addrspace_t< T > > |
using | Type = T |
using | Opts = sp::DefaultTexTensorOptions |
using | Base = TensorLike< TexTensor< T, R, sp::DefaultTexTensorOptions >, TensorRank > |
using | InValueType = MemTensorLike< TexTensor< T, R, sp::DefaultTexTensorOptions >, NewT, TensorRank, sp::DefaultTexTensorOptions > |
using | PtrType = T * |
The type of the data pointer. More... | |
Public Member Functions | |
__host__ | TexTensor (PtrType data, const Vec< int, Rank > &sizes, const Vec< int, Rank > &strides, sp::Vec< cudaTextureAddressMode, Rank > addrMode, ValueType borderColour) |
__host__ | TexTensor (PtrType data, const Vec< int, Rank > &sizes, const Vec< int, Rank > &strides, cudaTextureAddressMode addrMode, ValueType borderColour=ValueType{0}) |
__host__ | TexTensor (PtrType data, const Vec< int, Rank > &sizes, const Vec< int, Rank > &strides, sp::Vec< cudaTextureAddressMode, Rank > addrMode) |
template<int L, int DimRank> | |
Vec< ValueType, L > | handleReadTexel (Vec< ValueType, MaxVectorSize > texel, const Vec< int, DimRank > &pos) const |
template<int DimRank> | |
bool | boundsCheckImpl (const Vec< int, DimRank > &) const |
template<int L, CacheMode Mode, int DimRank> | |
Vec< ValueType, L > | vectorOffsetReadImpl (const Vec< int, DimRank > &pos, const Vec< int, DimRank > &offset) const |
template<int L, CacheMode Mode, int DimRank> | |
Vec< ValueType, L > | vectorReadImpl (const Vec< int, DimRank > &pos) const |
Public Member Functions inherited from sp::MemTensorLike< TexTensor< T, R, sp::DefaultTexTensorOptions >, T, R, sp::DefaultTexTensorOptions > | |
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 | |
constexpr static int | Rank = R |
constexpr static int | MaxVectorSize = sp::getMaxGMemVectorSize<ValueType>() |
constexpr static int | ElementsPerTexel = 16 / sizeof(ValueType) |
constexpr static int | ChannelsPerElement = 4 / ElementsPerTexel |
Static Public Attributes inherited from sp::MemTensorLike< TexTensor< T, R, sp::DefaultTexTensorOptions >, T, R, sp::DefaultTexTensorOptions > | |
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 |
Additional Inherited Members | |
Static Public Member Functions inherited from sp::MemTensorLike< TexTensor< T, R, sp::DefaultTexTensorOptions >, T, R, sp::DefaultTexTensorOptions > | |
static constexpr int | calculateNumStrides () |
Compute the default value for NumStrides . More... | |
Public Attributes inherited from sp::MemTensorLike< TexTensor< T, R, sp::DefaultTexTensorOptions >, T, R, sp::DefaultTexTensorOptions > | |
friend | Base |
PtrType | dataPtr |
sp::Vec< int, Rank+getNumStrides()+HasTotalSize+AssertionsEnabled > | variousIntegers |
Protected Member Functions inherited from sp::MemTensorLike< TexTensor< T, R, sp::DefaultTexTensorOptions >, T, R, sp::DefaultTexTensorOptions > | |
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... | |
A Tensor
that's backed by a texture object.
Usually useful to combine with TexTensorSpecialiser, which will swap input tensors for TexTensor
s when the (many) necessary constraints are met.
TexTensor
s are writeable, but subject to the documented limitations of writes to texture-backed buffers:
The texture and surface memory is cached (see Device Memory Accesses) and within the same kernel call, the cache is not kept coherent with respect to global memory writes and surface memory writes, so any texture fetch or surface read to an address that has been written to via a global write or a surface write in the same kernel call returns undefined data. In other words, a thread can safely read some texture or surface memory location only if this memory location has been updated by a previous kernel call or memory copy, but not if it has been previously updated by the same thread or another thread from the same kernel call.
So: writing is allowed, but it is up to the user to never read an address that has previously been written while in the same kernel. There is nothing to catch this error condition: you'll just get undefined behaviour.