tensor_view.h
Go to the documentation of this file.
/***************************************************************************************************
* Copyright (c) 2017-2018, NVIDIA CORPORATION. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice, this list of
* conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
* * Neither the name of the NVIDIA CORPORATION nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NVIDIA CORPORATION BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TOR (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
**************************************************************************************************/
#pragma once
#include <cmath>
#include <cutlass/cutlass.h>
#include <cutlass/tensor_ref.h>
namespace cutlass {
template <typename T>
class TensorView : public TensorRef<T, 4> {
public:
typedef TensorRef<T, 4> Base;
typedef Base TensorRef_t;
typedef TensorRef<T const, 4> ConstTensorRef_t;
static int const Rank = TensorRef_t::Rank;
typedef int Offset_t;
typedef Coord<Rank> Coord_t;
private:
//
// Data members
//
TensorRef_t ref_;
Coord_t size_;
public:
//
// Device and Host Methods
//
CUTLASS_HOST_DEVICE
TensorView() {}
CUTLASS_HOST_DEVICE
TensorView(TensorRef_t const& _ref, Coord_t const& _size) : Base(_ref), size_(_size) {}
CUTLASS_HOST_DEVICE
bool good() const { return ref().good(); }
CUTLASS_HOST_DEVICE
T* data() const { return ref().data(); }
CUTLASS_HOST_DEVICE
void reset(TensorRef_t const& _ref = TensorRef_t(0), Coord_t const& _size = Coord_t()) {
Base::operator=(_ref);
size_ = _size;
}
CUTLASS_HOST_DEVICE
TensorRef_t& ref() { return *this; }
CUTLASS_HOST_DEVICE
ConstTensorRef_t const_ref() { return ConstTensorRef_t(data(), stride()); }
CUTLASS_HOST_DEVICE
TensorRef_t const& ref() const { return *this; }
CUTLASS_HOST_DEVICE
Coord_t const& size() const { return size_; }
CUTLASS_HOST_DEVICE
int size(int dim) const { return size_.at(dim); }
CUTLASS_HOST_DEVICE
Coord_t const& stride() const { return ref().stride(); }
CUTLASS_HOST_DEVICE
int const& stride(int dim) const { return ref().stride(dim); }
CUTLASS_HOST_DEVICE
TensorView& operator=(TensorView const& _tensor) {
Base::operator=(_tensor._ref);
size_ = _tensor.size_;
return *this;
}
CUTLASS_HOST_DEVICE
Offset_t offset(Coord_t const& coord) const { return ref().offset(coord); }
CUTLASS_HOST_DEVICE
bool contains(Coord_t const& coord) const {
for (int dim = 0; dim < Rank; ++dim) {
if (coord.at(dim) >= size_.at(dim)) {
return false;
}
}
return true;
}
CUTLASS_HOST_DEVICE
T& at(Coord_t const& coord) const { return ref().at(coord); }
T& operator[](Coord<Rank> const& coord) const { return at(coord); }
CUTLASS_HOST_DEVICE
T& at(Offset_t idx) const { return ref().at(idx); }
CUTLASS_HOST_DEVICE
TensorView<T> subview(Coord_t const& location, Coord_t size) const {
return TensorView<T>(ref() + location, size.clamp(size_ - location));
}
};
} // namespace cutlass
cutlass::TensorView::ref
CUTLASS_HOST_DEVICE TensorRef_t const & ref() const
Accesses the tensor reference pointing to data.
Definition: tensor_view.h:111
cutlass
Definition: convert.h:33
tensor_ref.h
Defines a structure containing strides, bounds, and a pointer to tensor data.
cutlass::TensorRef::at
CUTLASS_HOST_DEVICE Storage & at(Coord< Rank > const &coord) const
Returns a reference to the element at a given Coord.
Definition: tensor_ref.h:121
cutlass::TensorView::Offset_t
int Offset_t
Type used to compute the offset of an element to the base of a tensor.
Definition: tensor_view.h:57
cutlass::TensorRef< T, 4 >::Rank
static int const Rank
Rank of tensor.
Definition: tensor_ref.h:48
cutlass::TensorView::TensorView
CUTLASS_HOST_DEVICE TensorView()
Default constructor.
Definition: tensor_view.h:80
cutlass::TensorView::size
CUTLASS_HOST_DEVICE int size(int dim) const
Accesses the size.
Definition: tensor_view.h:119
cutlass::Coord::clamp
CUTLASS_HOST_DEVICE Coord & clamp(Coord< N > const &max, Coord< N > const &min=Coord< N >())
Clamps a coordinate to a range specified by maximum and minimum values.
Definition: coord.h:219
cutlass::TensorView::Coord_t
Coord< Rank > Coord_t
Coordinate into tensor.
Definition: tensor_view.h:60
cutlass::TensorView::reset
CUTLASS_HOST_DEVICE void reset(TensorRef_t const &_ref=TensorRef_t(0), Coord_t const &_size=Coord_t())
Updates the reference and size of a Tensor_view object.
Definition: tensor_view.h:96
cutlass::TensorView::contains
CUTLASS_HOST_DEVICE bool contains(Coord_t const &coord) const
Determines whether a location is within a tensor.
Definition: tensor_view.h:143
cutlass::TensorView::stride
CUTLASS_HOST_DEVICE int const & stride(int dim) const
Accesses the stride.
Definition: tensor_view.h:127
cutlass::TensorView::Rank
static int const Rank
Rank of tensor.
Definition: tensor_view.h:54
cutlass::TensorView::at
CUTLASS_HOST_DEVICE T & at(Offset_t idx) const
Element-wise accessor.
Definition: tensor_view.h:161
cutlass::TensorView::const_ref
CUTLASS_HOST_DEVICE ConstTensorRef_t const_ref()
Definition: tensor_view.h:107
cutlass::TensorRef::data
CUTLASS_HOST_DEVICE Storage * data() const
Returns the pointer to referenced data.
Definition: tensor_ref.h:99
cutlass::TensorView
Host-side reference implementation of tensor operations.
Definition: tensor_view.h:42
cutlass::TensorRef::offset
CUTLASS_HOST_DEVICE long long offset(Coord< Rank > const &coord) const
Computes the offset of an index from the origin of the tensor.
Definition: tensor_ref.h:115
cutlass::TensorRef
Structure modeling a pointer and stride into a tensor.
Definition: tensor_ref.h:42
cutlass::TensorView::Base
TensorRef< T, 4 > Base
Reference and stride.
Definition: tensor_view.h:45
CUTLASS_HOST_DEVICE
#define CUTLASS_HOST_DEVICE
Definition: cutlass.h:46
cutlass::TensorView::good
CUTLASS_HOST_DEVICE bool good() const
Returns true if the Tensor_view is bound to some memory.
Definition: tensor_view.h:88
cutlass::TensorRef::good
CUTLASS_HOST_DEVICE bool good() const
Returns true if the TensorRef may be safely accessed.
Definition: tensor_ref.h:95
cutlass::TensorView::offset
CUTLASS_HOST_DEVICE Offset_t offset(Coord_t const &coord) const
Returns the index of an element.
Definition: tensor_view.h:139
cutlass::TensorView::data
CUTLASS_HOST_DEVICE T * data() const
Returns a pointer to data.
Definition: tensor_view.h:92
cutlass::Coord< Rank >
cutlass::TensorView::operator[]
T & operator[](Coord< Rank > const &coord) const
Element-wise accessor.
Definition: tensor_view.h:157
cutlass::TensorView::TensorRef_t
Base TensorRef_t
Reference and stride.
Definition: tensor_view.h:48
cutlass::Coord::at
CUTLASS_HOST_DEVICE int & at()
Gets the index of a given Coord element.
Definition: coord.h:185
cutlass::TensorView::at
CUTLASS_HOST_DEVICE T & at(Coord_t const &coord) const
Element-wise accessor.
Definition: tensor_view.h:154
cutlass::TensorView::size
CUTLASS_HOST_DEVICE Coord_t const & size() const
Accesses the size.
Definition: tensor_view.h:115
cutlass::TensorView::stride
CUTLASS_HOST_DEVICE Coord_t const & stride() const
Accesses the stride.
Definition: tensor_view.h:123
cutlass::TensorView::ref
CUTLASS_HOST_DEVICE TensorRef_t & ref()
Accesses the tensor reference pointing to data.
Definition: tensor_view.h:103
cutlass::TensorRef::stride
CUTLASS_HOST_DEVICE Coord< Rank > const & stride() const
Returns the stride of the tensor.
Definition: tensor_ref.h:103
cutlass::TensorView::operator=
CUTLASS_HOST_DEVICE TensorView & operator=(TensorView const &_tensor)
Assigns the Tensor_view.
Definition: tensor_view.h:131
cutlass.h
Basic include for CUTLASS macros.
cutlass::TensorView::TensorView
CUTLASS_HOST_DEVICE TensorView(TensorRef_t const &_ref, Coord_t const &_size)
Constructs a Tensor_view from a TensorRef and size.
Definition: tensor_view.h:84
cutlass::TensorView::ConstTensorRef_t
TensorRef< T const, 4 > ConstTensorRef_t
Reference to constant type.
Definition: tensor_view.h:51
cutlass::TensorView::subview
CUTLASS_HOST_DEVICE TensorView< T > subview(Coord_t const &location, Coord_t size) const
Returns a Tensor_view given location and size quantities.
Definition: tensor_view.h:165