58 ss <<
"CUDNN_BACKEND_TENSOR_DESCRIPTOR :" 59 <<
" Datatype: " << std::to_string(
data_type) <<
" Id: " << std::to_string(
id)
60 <<
" Alignment: " << std::to_string(
alignment) <<
" nDims " <<
nDims;
82 std::copy(std::begin(from.btensor_dimA), std::end(from.btensor_dimA),
btensor_dimA);
83 std::copy(std::begin(from.btensor_strA), std::end(from.btensor_strA),
btensor_strA);
116 m_tensor.data_type = data_type_;
122 std::copy((dim), dim + ndim, m_tensor.btensor_dimA);
123 m_tensor.nDims = ndim;
129 std::copy(strides, strides + ndim, m_tensor.btensor_strA);
141 m_tensor.alignment = alignment_;
147 m_tensor.isVirtual = virtual_;
157 if (m_tensor.alignment <= 0) {
160 CUDNN_STATUS_BAD_PARAM,
161 "CUDNN_BACKEND_TENSOR_DESCRIPTOR: Check and Set the CUDNN_ATTR_TENSOR_BYTE_ALIGNMENT field");
162 return std::move(m_tensor);
164 if (m_tensor.id <= 0) {
167 CUDNN_STATUS_BAD_PARAM,
168 "CUDNN_BACKEND_TENSOR_DESCRIPTOR: Check and Set the CUDNN_ATTR_TENSOR_UNIQUE_ID as a valid value");
169 return std::move(m_tensor);
171 if (m_tensor.btensor_strA[0] <= 0) {
174 CUDNN_STATUS_BAD_PARAM,
175 "CUDNN_BACKEND_TENSOR_DESCRIPTOR: Check and Set the CUDNN_ATTR_TENSOR_STRIDES Correctly");
176 return std::move(m_tensor);
178 if (m_tensor.btensor_dimA[0] <= 0) {
181 CUDNN_STATUS_BAD_PARAM,
182 "CUDNN_BACKEND_TENSOR_DESCRIPTOR: Check and Set the CUDNN_ATTR_TENSOR_DIMENSIONS Correctly");
183 return std::move(m_tensor);
185 if (m_tensor.pointer !=
nullptr) {
187 CUDNN_STATUS_BAD_PARAM,
188 "CUDNN_BACKEND_TENSOR_DESCRIPTOR: Bad tensor created. The tensor already " 189 "seems to be pointing to something");
190 return std::move(m_tensor);
194 auto status = m_tensor.initialize_managed_backend_pointer(CUDNN_BACKEND_TENSOR_DESCRIPTOR);
195 if (
status != CUDNN_STATUS_SUCCESS) {
197 &m_tensor,
status,
"CUDNN_BACKEND_TENSOR_DESCRIPTOR: cudnnCreate Descriptor Failed");
198 return std::move(m_tensor);
202 status = cudnnBackendSetAttribute(m_tensor.pointer->get_backend_descriptor(),
203 CUDNN_ATTR_TENSOR_DATA_TYPE,
204 CUDNN_TYPE_DATA_TYPE,
206 &m_tensor.data_type);
207 if (
status != CUDNN_STATUS_SUCCESS) {
209 &m_tensor,
status,
"CUDNN_BACKEND_TENSOR_DESCRIPTOR: SetAttribute CUDNN_ATTR_TENSOR_DATA_TYPE Failed");
210 return std::move(m_tensor);
212 status = cudnnBackendSetAttribute(m_tensor.pointer->get_backend_descriptor(),
213 CUDNN_ATTR_TENSOR_DIMENSIONS,
216 m_tensor.btensor_dimA);
217 if (
status != CUDNN_STATUS_SUCCESS) {
219 &m_tensor,
status,
"CUDNN_BACKEND_TENSOR_DESCRIPTOR: SetAttribute CUDNN_ATTR_TENSOR_DIMENSIONS Failed");
220 return std::move(m_tensor);
222 status = cudnnBackendSetAttribute(m_tensor.pointer->get_backend_descriptor(),
223 CUDNN_ATTR_TENSOR_STRIDES,
226 m_tensor.btensor_strA);
227 if (
status != CUDNN_STATUS_SUCCESS) {
229 &m_tensor,
status,
"CUDNN_BACKEND_TENSOR_DESCRIPTOR: SetAttribute CUDNN_ATTR_TENSOR_STRIDES Failed");
230 return std::move(m_tensor);
232 status = cudnnBackendSetAttribute(
233 m_tensor.pointer->get_backend_descriptor(), CUDNN_ATTR_TENSOR_UNIQUE_ID, CUDNN_TYPE_INT64, 1, &m_tensor.id);
234 if (
status != CUDNN_STATUS_SUCCESS) {
236 &m_tensor,
status,
"CUDNN_BACKEND_TENSOR_DESCRIPTOR: SetAttribute CUDNN_ATTR_TENSOR_UNIQUE_ID Failed");
237 return std::move(m_tensor);
239 cudnnBackendSetAttribute(m_tensor.pointer->get_backend_descriptor(),
240 CUDNN_ATTR_TENSOR_BYTE_ALIGNMENT,
243 &m_tensor.alignment);
244 if (
status != CUDNN_STATUS_SUCCESS) {
248 "CUDNN_BACKEND_TENSOR_DESCRIPTOR: SetAttribute CUDNN_ATTR_TENSOR_BYTE_ALIGNMENT Failed");
249 return std::move(m_tensor);
251 if (m_tensor.isVirtual) {
252 cudnnBackendSetAttribute(m_tensor.pointer->get_backend_descriptor(),
253 CUDNN_ATTR_TENSOR_IS_VIRTUAL,
256 &m_tensor.isVirtual);
257 if (
status != CUDNN_STATUS_SUCCESS) {
261 "CUDNN_BACKEND_TENSOR_DESCRIPTOR: SetAttribute CUDNN_ATTR_TENSOR_BYTE_ALIGNMENT Failed");
262 return std::move(m_tensor);
267 status = cudnnBackendFinalize(m_tensor.pointer->get_backend_descriptor());
268 if (
status != CUDNN_STATUS_SUCCESS) {
270 return std::move(m_tensor);
272 return std::move(m_tensor);
auto setVirtual(bool virtual_=true) -> TensorBuilder_v8 &
Set Alignment of the tensor.
static void set_error_and_throw_exception(BackendDescriptor const *desc, cudnnStatus_t status, const char *message)
int64_t btensor_strA[CUDNN_DIM_MAX+1]
n, g, c, d, h, w
int64_t alignment
Unique id of the tensor.
friend class TensorBuilder_v8
bool isVirtual
Number of Dimensions of the tensor.
auto setAlignment(int64_t alignment_) -> TensorBuilder_v8 &
Set Alignment of the tensor.
ManagedOpaqueDescriptor get_desc() const
Returns a copy of underlying managed descriptor.
int64_t nDims
Certain engine config expect minimum alignment of 16B.
int64_t btensor_dimA[CUDNN_DIM_MAX+1]
Datatype of the elements.
cudnnStatus_t get_status() const
Current status of the descriptor.
Tensor_v8(Tensor_v8 &&from)
std::string describe() const override
Return a string describing the backend Descriptor.
auto setStrides(int64_t ndim, int64_t const *strides) -> TensorBuilder_v8 &
Set Strides of the tensor.
const char * get_error() const
Diagonistic error message if any.
auto setId(int64_t id_) -> TensorBuilder_v8 &
Set Unique Id of the tensor.
auto setDim(int64_t ndim, int64_t const *dim) -> TensorBuilder_v8 &
Set Dimensions of the tensor.
Tensor_v8 & operator=(Tensor_v8 const &)=delete
cudnnDataType_t data_type
int64_t id
n, g, c, d, h, w
auto setDataType(cudnnDataType_t data_type_) -> TensorBuilder_v8 &
Set Datatype for the Tensor_v8.
cudnnStatus_t status
Shared pointer of the OpaqueBackendPointer.