9 namespace faiss {
namespace gpu {
11 template <
typename T,
int Dim,
bool InnerContig,
12 typename IndexT,
template <
typename U>
class PtrTraits>
15 Tensor<T, Dim, InnerContig, IndexT, PtrTraits>(),
16 state_(AllocState::NotOwner) {
19 template <
typename T,
int Dim,
bool InnerContig,
20 typename IndexT,
template <
typename U>
class PtrTraits>
23 if (state_ == AllocState::Owner) {
24 FAISS_ASSERT(this->data_ !=
nullptr);
26 this->data_ =
nullptr;
30 template <
typename T,
int Dim,
bool InnerContig,
31 typename IndexT,
template <
typename U>
class PtrTraits>
34 const IndexT sizes[Dim]) :
35 Tensor<T, Dim, InnerContig, IndexT, PtrTraits>(nullptr, sizes),
36 state_(AllocState::Owner) {
39 FAISS_ASSERT(this->
data_ !=
nullptr);
42 template <
typename T,
int Dim,
bool InnerContig,
43 typename IndexT,
template <
typename U>
class PtrTraits>
46 std::initializer_list<IndexT> sizes) :
47 Tensor<T, Dim, InnerContig, IndexT, PtrTraits>(nullptr, sizes),
48 state_(AllocState::Owner) {
50 FAISS_ASSERT(this->
data_ !=
nullptr);
53 template <
typename T,
int Dim,
bool InnerContig,
54 typename IndexT,
template <
typename U>
class PtrTraits>
58 const IndexT sizes[Dim]) :
59 Tensor<T, Dim, InnerContig, IndexT, PtrTraits>(data, sizes),
60 state_(AllocState::NotOwner) {
63 template <
typename T,
int Dim,
bool InnerContig,
64 typename IndexT,
template <
typename U>
class PtrTraits>
68 std::initializer_list<IndexT> sizes) :
69 Tensor<T, Dim, InnerContig, IndexT, PtrTraits>(data, sizes),
70 state_(AllocState::NotOwner) {
73 template <
typename T,
int Dim,
bool InnerContig,
74 typename IndexT,
template <
typename U>
class PtrTraits>
78 const IndexT sizes[Dim],
79 const IndexT strides[Dim]) :
80 Tensor<T, Dim, InnerContig, IndexT, PtrTraits>(data, sizes, strides),
81 state_(AllocState::NotOwner) {
84 template <
typename T,
int Dim,
bool InnerContig,
85 typename IndexT,
template <
typename U>
class PtrTraits>
89 cudaStream_t stream) :
90 Tensor<T, Dim, InnerContig, IndexT, PtrTraits>(nullptr, t.sizes(), t.strides()),
91 state_(AllocState::Owner) {
100 template <
typename T,
int Dim,
bool InnerContig,
101 typename IndexT,
template <
typename U>
class PtrTraits>
105 FAISS_ASSERT(this->isContiguous());
107 if (this->data_ !=
nullptr) {
108 memset(this->data_, 0, this->getSizeInBytes());
114 template <
typename T,
int Dim,
bool InnerContig,
115 typename IndexT,
template <
typename U>
class PtrTraits>
119 auto size = this->numElements();
122 FAISS_ASSERT(size > 0);
125 auto a = this->data();
128 T maxDiff = a[0] - b[0];
130 maxDiff = maxDiff < 0 ? maxDiff * (T) -1 : maxDiff;
132 for (IndexT i = 1; i < size; ++i) {
133 auto diff = a[i] - b[i];
135 diff = diff < 0 ? diff * (T) -1 : diff;
136 if (diff > maxDiff) {
__host__ __device__ size_t numElements() const
__host__ ~HostTensor()
Destructor.
__host__ HostTensor< T, Dim, InnerContig, IndexT, PtrTraits > & zero()
Call to zero out memory.
DataPtrType data_
Raw pointer to where the tensor data begins.
__host__ __device__ bool isContiguous() const
__host__ void copyFrom(Tensor< T, Dim, InnerContig, IndexT, PtrTraits > &t, cudaStream_t stream)
Copies a tensor into ourselves; sizes must match.
__host__ HostTensor()
Default constructor.
__host__ __device__ DataPtrType data()
Returns a raw pointer to the start of our data.
__host__ T maxDiff(const HostTensor< T, Dim, InnerContig, IndexT, PtrTraits > &t) const
Returns the maximum difference seen between two tensors.