10 namespace faiss {
namespace gpu {
12 template <
typename T,
int Dim,
bool InnerContig,
13 typename IndexT,
template <
typename U>
class PtrTraits>
16 Tensor<T, Dim, InnerContig, IndexT, PtrTraits>(),
17 state_(AllocState::NotOwner) {
20 template <
typename T,
int Dim,
bool InnerContig,
21 typename IndexT,
template <
typename U>
class PtrTraits>
24 if (state_ == AllocState::Owner) {
25 FAISS_ASSERT(this->data_ !=
nullptr);
27 this->data_ =
nullptr;
31 template <
typename T,
int Dim,
bool InnerContig,
32 typename IndexT,
template <
typename U>
class PtrTraits>
35 const IndexT sizes[Dim]) :
36 Tensor<T, Dim, InnerContig, IndexT, PtrTraits>(nullptr, sizes),
37 state_(AllocState::Owner) {
40 FAISS_ASSERT(this->
data_ !=
nullptr);
43 template <
typename T,
int Dim,
bool InnerContig,
44 typename IndexT,
template <
typename U>
class PtrTraits>
47 std::initializer_list<IndexT> sizes) :
48 Tensor<T, Dim, InnerContig, IndexT, PtrTraits>(nullptr, sizes),
49 state_(AllocState::Owner) {
51 FAISS_ASSERT(this->
data_ !=
nullptr);
54 template <
typename T,
int Dim,
bool InnerContig,
55 typename IndexT,
template <
typename U>
class PtrTraits>
59 const IndexT sizes[Dim]) :
60 Tensor<T, Dim, InnerContig, IndexT, PtrTraits>(data, sizes),
61 state_(AllocState::NotOwner) {
64 template <
typename T,
int Dim,
bool InnerContig,
65 typename IndexT,
template <
typename U>
class PtrTraits>
69 std::initializer_list<IndexT> sizes) :
70 Tensor<T, Dim, InnerContig, IndexT, PtrTraits>(data, sizes),
71 state_(AllocState::NotOwner) {
74 template <
typename T,
int Dim,
bool InnerContig,
75 typename IndexT,
template <
typename U>
class PtrTraits>
79 const IndexT sizes[Dim],
80 const IndexT strides[Dim]) :
81 Tensor<T, Dim, InnerContig, IndexT, PtrTraits>(data, sizes, strides),
82 state_(AllocState::NotOwner) {
85 template <
typename T,
int Dim,
bool InnerContig,
86 typename IndexT,
template <
typename U>
class PtrTraits>
90 cudaStream_t stream) :
91 Tensor<T, Dim, InnerContig, IndexT, PtrTraits>(nullptr, t.sizes(), t.strides()),
92 state_(AllocState::Owner) {
101 template <
typename T,
int Dim,
bool InnerContig,
102 typename IndexT,
template <
typename U>
class PtrTraits>
106 FAISS_ASSERT(this->isContiguous());
108 if (this->data_ !=
nullptr) {
109 memset(this->data_, 0, this->getSizeInBytes());
115 template <
typename T,
int Dim,
bool InnerContig,
116 typename IndexT,
template <
typename U>
class PtrTraits>
120 auto size = this->numElements();
123 FAISS_ASSERT(size > 0);
126 auto a = this->data();
129 T maxDiff = a[0] - b[0];
131 maxDiff = maxDiff < 0 ? maxDiff * (T) -1 : maxDiff;
133 for (IndexT i = 1; i < size; ++i) {
134 auto diff = a[i] - b[i];
136 diff = diff < 0 ? diff * (T) -1 : diff;
137 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.