59 ss <<
"CUDNN_BACKEND_TENSOR_DESCRIPTOR :" 63 for (
auto i = 0; i <
nDims; i++) {
68 for (
auto i = 0; i <
nDims; i++) {
74 #if (CUDNN_VERSION >= 8300) 75 ss <<
" reorder_type: " << reorder_type;
83 for (
auto i = 0; i <
nDims; i++) {
132 #if (CUDNN_VERSION >= 8300) 133 cudnnBackendTensorReordering_t reorder_type = CUDNN_TENSOR_REORDERING_NONE;
149 m_tensor.data_type = data_type_;
155 std::copy((dim), dim + ndim, m_tensor.btensor_dimA);
156 m_tensor.nDims = ndim;
162 std::copy(strides, strides + ndim, m_tensor.btensor_strA);
174 m_tensor.alignment = alignment_;
180 m_tensor.isVirtual = virtual_;
185 m_tensor.isByValue = isByValue_;
190 m_tensor.vectorCount = vectorCount_;
191 m_tensor.vectorDimension = vectorDimension_;
195 #if (CUDNN_VERSION >= 8300) 197 setReorderType(cudnnBackendTensorReordering_t type_) ->
TensorBuilder_v8 & {
198 m_tensor.reorder_type = type_;
209 if (m_tensor.alignment <= 0) {
212 CUDNN_STATUS_BAD_PARAM,
213 "CUDNN_BACKEND_TENSOR_DESCRIPTOR: Check and Set the CUDNN_ATTR_TENSOR_BYTE_ALIGNMENT field");
214 return std::move(m_tensor);
216 if (m_tensor.id <= 0) {
219 CUDNN_STATUS_BAD_PARAM,
220 "CUDNN_BACKEND_TENSOR_DESCRIPTOR: Check and Set the CUDNN_ATTR_TENSOR_UNIQUE_ID as a valid value");
221 return std::move(m_tensor);
223 if (m_tensor.btensor_strA[0] <= 0) {
226 CUDNN_STATUS_BAD_PARAM,
227 "CUDNN_BACKEND_TENSOR_DESCRIPTOR: Check and Set the CUDNN_ATTR_TENSOR_STRIDES Correctly");
228 return std::move(m_tensor);
230 if (m_tensor.btensor_dimA[0] <= 0) {
233 CUDNN_STATUS_BAD_PARAM,
234 "CUDNN_BACKEND_TENSOR_DESCRIPTOR: Check and Set the CUDNN_ATTR_TENSOR_DIMENSIONS Correctly");
235 return std::move(m_tensor);
237 if (m_tensor.pointer !=
nullptr) {
239 CUDNN_STATUS_BAD_PARAM,
240 "CUDNN_BACKEND_TENSOR_DESCRIPTOR: Bad tensor created. The tensor already " 241 "seems to be pointing to something");
242 return std::move(m_tensor);
246 auto status = m_tensor.initialize_managed_backend_pointer(CUDNN_BACKEND_TENSOR_DESCRIPTOR);
247 if (
status != CUDNN_STATUS_SUCCESS) {
249 &m_tensor,
status,
"CUDNN_BACKEND_TENSOR_DESCRIPTOR: cudnnCreate Descriptor Failed");
250 return std::move(m_tensor);
254 status = cudnnBackendSetAttribute(m_tensor.pointer->get_backend_descriptor(),
255 CUDNN_ATTR_TENSOR_DATA_TYPE,
256 CUDNN_TYPE_DATA_TYPE,
258 &m_tensor.data_type);
259 if (
status != CUDNN_STATUS_SUCCESS) {
261 &m_tensor,
status,
"CUDNN_BACKEND_TENSOR_DESCRIPTOR: SetAttribute CUDNN_ATTR_TENSOR_DATA_TYPE Failed");
262 return std::move(m_tensor);
264 status = cudnnBackendSetAttribute(m_tensor.pointer->get_backend_descriptor(),
265 CUDNN_ATTR_TENSOR_DIMENSIONS,
268 m_tensor.btensor_dimA);
269 if (
status != CUDNN_STATUS_SUCCESS) {
271 &m_tensor,
status,
"CUDNN_BACKEND_TENSOR_DESCRIPTOR: SetAttribute CUDNN_ATTR_TENSOR_DIMENSIONS Failed");
272 return std::move(m_tensor);
274 status = cudnnBackendSetAttribute(m_tensor.pointer->get_backend_descriptor(),
275 CUDNN_ATTR_TENSOR_STRIDES,
278 m_tensor.btensor_strA);
279 if (
status != CUDNN_STATUS_SUCCESS) {
281 &m_tensor,
status,
"CUDNN_BACKEND_TENSOR_DESCRIPTOR: SetAttribute CUDNN_ATTR_TENSOR_STRIDES Failed");
282 return std::move(m_tensor);
284 status = cudnnBackendSetAttribute(
285 m_tensor.pointer->get_backend_descriptor(), CUDNN_ATTR_TENSOR_UNIQUE_ID, CUDNN_TYPE_INT64, 1, &m_tensor.id);
286 if (
status != CUDNN_STATUS_SUCCESS) {
288 &m_tensor,
status,
"CUDNN_BACKEND_TENSOR_DESCRIPTOR: SetAttribute CUDNN_ATTR_TENSOR_UNIQUE_ID Failed");
289 return std::move(m_tensor);
291 cudnnBackendSetAttribute(m_tensor.pointer->get_backend_descriptor(),
292 CUDNN_ATTR_TENSOR_BYTE_ALIGNMENT,
295 &m_tensor.alignment);
296 if (
status != CUDNN_STATUS_SUCCESS) {
300 "CUDNN_BACKEND_TENSOR_DESCRIPTOR: SetAttribute CUDNN_ATTR_TENSOR_BYTE_ALIGNMENT Failed");
301 return std::move(m_tensor);
303 if (m_tensor.isVirtual) {
304 cudnnBackendSetAttribute(m_tensor.pointer->get_backend_descriptor(),
305 CUDNN_ATTR_TENSOR_IS_VIRTUAL,
308 &m_tensor.isVirtual);
309 if (
status != CUDNN_STATUS_SUCCESS) {
313 "CUDNN_BACKEND_TENSOR_DESCRIPTOR: SetAttribute CUDNN_ATTR_TENSOR_BYTE_ALIGNMENT Failed");
314 return std::move(m_tensor);
317 if (m_tensor.isByValue) {
318 cudnnBackendSetAttribute(m_tensor.pointer->get_backend_descriptor(),
319 CUDNN_ATTR_TENSOR_IS_BY_VALUE,
322 &m_tensor.isByValue);
323 if (
status != CUDNN_STATUS_SUCCESS) {
327 "CUDNN_BACKEND_TENSOR_DESCRIPTOR: SetAttribute CUDNN_ATTR_TENSOR_IS_BY_VALUE Failed");
328 return std::move(m_tensor);
332 if (m_tensor.vectorCount > 1) {
333 cudnnBackendSetAttribute(m_tensor.pointer->get_backend_descriptor(),
334 CUDNN_ATTR_TENSOR_VECTOR_COUNT,
337 &m_tensor.vectorCount);
338 if (
status != CUDNN_STATUS_SUCCESS) {
342 "CUDNN_BACKEND_TENSOR_DESCRIPTOR: SetAttribute CUDNN_ATTR_TENSOR_VECTOR_COUNT Failed");
343 return std::move(m_tensor);
346 if (m_tensor.vectorDimension >= 0) {
347 cudnnBackendSetAttribute(m_tensor.pointer->get_backend_descriptor(),
348 CUDNN_ATTR_TENSOR_VECTORIZED_DIMENSION,
351 &m_tensor.vectorDimension);
352 if (
status != CUDNN_STATUS_SUCCESS) {
356 "CUDNN_BACKEND_TENSOR_DESCRIPTOR: SetAttribute CUDNN_ATTR_TENSOR_VECTORIZED_DIMENSION Failed");
357 return std::move(m_tensor);
362 #if (CUDNN_VERSION >= 8300) 363 if (m_tensor.reorder_type != CUDNN_TENSOR_REORDERING_NONE) {
364 cudnnBackendSetAttribute(m_tensor.pointer->get_backend_descriptor(),
365 CUDNN_ATTR_TENSOR_REORDERING_MODE,
366 CUDNN_TYPE_TENSOR_REORDERING_MODE,
368 &m_tensor.reorder_type);
369 if (
status != CUDNN_STATUS_SUCCESS) {
373 "CUDNN_BACKEND_TENSOR_DESCRIPTOR: SetAttribute CUDNN_ATTR_TENSOR_REORDERING_MODE Failed");
374 return std::move(m_tensor);
379 status = cudnnBackendFinalize(m_tensor.pointer->get_backend_descriptor());
380 if (
status != CUDNN_STATUS_SUCCESS) {
382 return std::move(m_tensor);
384 getLogger() <<
"[cudnn_frontend] " << m_tensor << std::endl;
385 return std::move(m_tensor);
bool isByValue
Whether it is an intermediate tensor of an op graph.
auto setVirtual(bool virtual_=true) -> TensorBuilder_v8 &
Set Alignment of the tensor.
int64_t getDataType() const
ConditionalStreamer & getLogger()
static void set_error_and_throw_exception(BackendDescriptor const *desc, cudnnStatus_t status, const char *message)
NLOHMANN_BASIC_JSON_TPL_DECLARATION std::string to_string(const NLOHMANN_BASIC_JSON_TPL &j)
user-defined to_string function for JSON values
int64_t btensor_strA[CUDNN_DIM_MAX+1]
n, g, c, d, h, w
Tensor_v8 & operator=(Tensor_v8 &&)=default
auto setByValue(bool isByValue_=true) -> TensorBuilder_v8 &
int64_t getDimensionCount() const
int64_t alignment
Unique id of the tensor.
friend class TensorBuilder_v8
bool isVirtual
What is the vectorization count (4 or 32)
auto setAlignment(int64_t alignment_) -> TensorBuilder_v8 &
Set Alignment of the tensor.
int64_t const * getDimArray() const
int64_t vectorCount
Which dimension of the tensor is vectorized (Generally the c dim)
int64_t const * getStrideArray() const
int64_t nDims
Certain engine config expect minimum alignment of 16B.
int64_t btensor_dimA[CUDNN_DIM_MAX+1]
Datatype of the elements.
std::string describe() const override
Return a string describing the backend Descriptor.
auto setVectorCountAndDimension(int64_t vectorCount_, int64_t vectorDimension_) -> TensorBuilder_v8 &
auto setStrides(int64_t ndim, int64_t const *strides) -> TensorBuilder_v8 &
Set Strides of the tensor.
static std::string to_string(cudnnDataType_t type)
int64_t vectorDimension
Number of Dimensions of the tensor.
int64_t getPackedElementCount() const
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.
cudnnDataType_t data_type
auto setDataType(cudnnDataType_t data_type_) -> TensorBuilder_v8 &
Set Datatype for the Tensor_v8.
cudnnStatus_t status
Shared pointer of the OpaqueBackendPointer.