33 #include <cudnn_backend.h> 62 ss <<
"CUDNN_BACKEND_OPERATION :" 63 <<
" OpMode: " << std::to_string(
op_mode);
64 ss << std::hex <<
" X " <<
xdesc;
65 ss << std::hex <<
" Y " <<
ydesc;
66 ss << std::hex <<
" W " <<
wdesc;
67 ss << std::hex <<
" B " <<
bdesc;
68 ss << std::hex <<
" C " <<
cdesc;
69 ss << std::hex <<
" P " <<
pwdesc;
112 cudnnBackendDescriptorType_t
op_mode = CUDNN_BACKEND_OPERATION_CONVOLUTION_FORWARD_DESCRIPTOR;
136 bool is_convolution_op =
false;
145 m_operation.
xdesc = raw_tensor;
151 m_operation.
xdesc = tensor.get_desc();
156 if (is_convolution_op ==
true) {
159 CUDNN_STATUS_BAD_PARAM,
160 "CUDNN_BACKEND_OPERATION_*_DESCRIPTOR: Convolution operation does not need bTensor");
162 m_operation.
bdesc = tensor.get_desc();
167 m_operation.
ydesc = tensor.get_desc();
172 if (is_convolution_op ==
false) {
175 CUDNN_STATUS_BAD_PARAM,
176 "CUDNN_BACKEND_OPERATION_*_DESCRIPTOR: Non Convolution operation does not need wTensor");
178 m_operation.
wdesc = tensor.get_desc();
183 if (is_convolution_op ==
false) {
186 CUDNN_STATUS_BAD_PARAM,
187 "CUDNN_BACKEND_OPERATION_*_DESCRIPTOR: Non Convolution operation does not need Convolution DESCRIPTOR");
189 m_operation.
cdesc = conv.get_desc();
194 if (is_convolution_op ==
true) {
197 CUDNN_STATUS_BAD_PARAM,
198 "CUDNN_BACKEND_OPERATION_*_DESCRIPTOR: Convolution operation does not need POINTWISE DESCRIPTOR");
200 m_operation.
pwdesc = pointWiseDesc.get_desc();
208 m_operation.
alpha_d =
static_cast<double>(alpha);
215 m_operation.
alpha_s =
static_cast<float>(alpha);
222 m_operation.
alpha2_d =
static_cast<double>(alpha);
229 m_operation.
alpha2_s =
static_cast<float>(alpha);
236 m_operation.
beta_d =
static_cast<double>(beta);
237 m_operation.
beta_s = beta;
243 m_operation.
beta_s =
static_cast<float>(beta);
244 m_operation.
beta_d = beta;
250 is_convolution_op = ((m_operation.
op_mode == CUDNN_BACKEND_OPERATION_CONVOLUTION_FORWARD_DESCRIPTOR) ||
251 (m_operation.
op_mode == CUDNN_BACKEND_OPERATION_CONVOLUTION_BACKWARD_FILTER_DESCRIPTOR) ||
252 (m_operation.
op_mode == CUDNN_BACKEND_OPERATION_CONVOLUTION_BACKWARD_DATA_DESCRIPTOR));
260 if (m_operation.
status != CUDNN_STATUS_SUCCESS) {
262 &m_operation, m_operation.
status,
"CUDNN_BACKEND_OPERATION: Operation not initialized properly");
263 return std::move(m_operation);
265 if (m_operation.
xdesc ==
nullptr) {
268 CUDNN_STATUS_BAD_PARAM,
269 "CUDNN_BACKEND_OPERATION: Check and Set the CUDNN_ATTR_OPERATION_CONVOLUTION_*_X");
270 return std::move(m_operation);
272 if (m_operation.
wdesc ==
nullptr && is_convolution_op) {
275 CUDNN_STATUS_BAD_PARAM,
276 "CUDNN_BACKEND_OPERATION: Check and Set the CUDNN_ATTR_OPERATION_CONVOLUTION_*_W");
277 return std::move(m_operation);
279 if (m_operation.
ydesc ==
nullptr && is_convolution_op) {
282 CUDNN_STATUS_BAD_PARAM,
283 "CUDNN_BACKEND_OPERATION: Check and Set the CUDNN_ATTR_OPERATION_CONVOLUTION_*_Y");
284 return std::move(m_operation);
286 if (m_operation.
cdesc ==
nullptr && is_convolution_op) {
289 CUDNN_STATUS_BAD_PARAM,
290 "CUDNN_BACKEND_OPERATION: Check and Set the CUDNN_ATTR_OPERATION_CONVOLUTION_*_CONV_DESC");
291 return std::move(m_operation);
296 if (
status != CUDNN_STATUS_SUCCESS) {
298 return std::move(m_operation);
300 if (m_operation.
op_mode == CUDNN_BACKEND_OPERATION_CONVOLUTION_FORWARD_DESCRIPTOR) {
303 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
304 CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_X,
305 CUDNN_TYPE_BACKEND_DESCRIPTOR,
307 &(m_operation.
xdesc->get_backend_descriptor()));
308 if (
status != CUDNN_STATUS_SUCCESS) {
312 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_X Failed");
313 return std::move(m_operation);
315 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
316 CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_W,
317 CUDNN_TYPE_BACKEND_DESCRIPTOR,
319 &(m_operation.
wdesc->get_backend_descriptor()));
320 if (
status != CUDNN_STATUS_SUCCESS) {
324 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_W Failed");
325 return std::move(m_operation);
327 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
328 CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_Y,
329 CUDNN_TYPE_BACKEND_DESCRIPTOR,
331 &(m_operation.
ydesc->get_backend_descriptor()));
332 if (
status != CUDNN_STATUS_SUCCESS) {
336 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_Y Failed");
337 return std::move(m_operation);
339 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
340 CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_CONV_DESC,
341 CUDNN_TYPE_BACKEND_DESCRIPTOR,
343 &(m_operation.
cdesc->get_backend_descriptor()));
344 if (
status != CUDNN_STATUS_SUCCESS) {
348 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_CONV_DESC Failed");
349 return std::move(m_operation);
351 void *alpha = (m_operation.
alphabetaType == CUDNN_TYPE_FLOAT ?
static_cast<void *
>(&m_operation.
alpha_s)
352 : static_cast<void *>(&m_operation.
alpha_d));
353 void *beta = (m_operation.
alphabetaType == CUDNN_TYPE_FLOAT ?
static_cast<void *
>(&m_operation.
beta_s)
354 : static_cast<void *>(&m_operation.
beta_d));
355 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
356 CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_ALPHA,
360 if (
status != CUDNN_STATUS_SUCCESS) {
364 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_ALPHA Failed");
365 return std::move(m_operation);
367 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
368 CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_BETA,
372 if (
status != CUDNN_STATUS_SUCCESS) {
376 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_BETA Failed");
377 return std::move(m_operation);
379 }
else if (m_operation.
op_mode == CUDNN_BACKEND_OPERATION_CONVOLUTION_BACKWARD_FILTER_DESCRIPTOR) {
382 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
383 CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_X,
384 CUDNN_TYPE_BACKEND_DESCRIPTOR,
386 &(m_operation.
xdesc->get_backend_descriptor()));
387 if (
status != CUDNN_STATUS_SUCCESS) {
391 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_X Failed");
392 return std::move(m_operation);
394 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
395 CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_DW,
396 CUDNN_TYPE_BACKEND_DESCRIPTOR,
398 &(m_operation.
wdesc->get_backend_descriptor()));
399 if (
status != CUDNN_STATUS_SUCCESS) {
403 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_DW Failed");
404 return std::move(m_operation);
406 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
407 CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_DY,
408 CUDNN_TYPE_BACKEND_DESCRIPTOR,
410 &(m_operation.
ydesc->get_backend_descriptor()));
411 if (
status != CUDNN_STATUS_SUCCESS) {
415 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_DY Failed");
416 return std::move(m_operation);
418 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
419 CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_CONV_DESC,
420 CUDNN_TYPE_BACKEND_DESCRIPTOR,
422 &(m_operation.
cdesc->get_backend_descriptor()));
423 if (
status != CUDNN_STATUS_SUCCESS) {
426 "CUDNN_BACKEND_OPERATION: SetAttribute " 427 "CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_CONV_DESC Failed");
428 return std::move(m_operation);
430 void *alpha = (m_operation.
alphabetaType == CUDNN_TYPE_FLOAT ?
static_cast<void *
>(&m_operation.
alpha_s)
431 : static_cast<void *>(&m_operation.
alpha_d));
432 void *beta = (m_operation.
alphabetaType == CUDNN_TYPE_FLOAT ?
static_cast<void *
>(&m_operation.
beta_s)
433 : static_cast<void *>(&m_operation.
beta_d));
434 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
435 CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_ALPHA,
439 if (
status != CUDNN_STATUS_SUCCESS) {
443 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_ALPHA Failed");
444 return std::move(m_operation);
446 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
447 CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_BETA,
451 if (
status != CUDNN_STATUS_SUCCESS) {
455 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_BETA Failed");
456 return std::move(m_operation);
458 }
else if (m_operation.
op_mode == CUDNN_BACKEND_OPERATION_CONVOLUTION_BACKWARD_DATA_DESCRIPTOR) {
461 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
462 CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_DX,
463 CUDNN_TYPE_BACKEND_DESCRIPTOR,
465 &(m_operation.
xdesc->get_backend_descriptor()));
466 if (
status != CUDNN_STATUS_SUCCESS) {
470 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_DX Failed");
471 return std::move(m_operation);
473 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
474 CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_W,
475 CUDNN_TYPE_BACKEND_DESCRIPTOR,
477 &(m_operation.
wdesc->get_backend_descriptor()));
478 if (
status != CUDNN_STATUS_SUCCESS) {
482 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_W Failed");
483 return std::move(m_operation);
485 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
486 CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_DY,
487 CUDNN_TYPE_BACKEND_DESCRIPTOR,
489 &(m_operation.
ydesc->get_backend_descriptor()));
490 if (
status != CUDNN_STATUS_SUCCESS) {
494 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_DY Failed");
495 return std::move(m_operation);
497 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
498 CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_CONV_DESC,
499 CUDNN_TYPE_BACKEND_DESCRIPTOR,
501 &(m_operation.
cdesc->get_backend_descriptor()));
502 if (
status != CUDNN_STATUS_SUCCESS) {
506 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_CONV_DESC Failed");
507 return std::move(m_operation);
509 void *alpha = (m_operation.
alphabetaType == CUDNN_TYPE_FLOAT ?
static_cast<void *
>(&m_operation.
alpha_s)
510 : static_cast<void *>(&m_operation.
alpha_d));
511 void *beta = (m_operation.
alphabetaType == CUDNN_TYPE_FLOAT ?
static_cast<void *
>(&m_operation.
beta_s)
512 : static_cast<void *>(&m_operation.
beta_d));
513 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
514 CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_ALPHA,
518 if (
status != CUDNN_STATUS_SUCCESS) {
522 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_ALPHA Failed");
523 return std::move(m_operation);
525 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
526 CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_BETA,
530 if (
status != CUDNN_STATUS_SUCCESS) {
534 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_BETA Failed");
535 return std::move(m_operation);
537 }
else if (m_operation.
op_mode == CUDNN_BACKEND_OPERATION_POINTWISE_DESCRIPTOR) {
539 case CUDNN_POINTWISE_ADD:
542 case CUDNN_POINTWISE_MUL:
545 case CUDNN_POINTWISE_MIN:
548 case CUDNN_POINTWISE_MAX:
551 case CUDNN_POINTWISE_SQRT:
554 case CUDNN_POINTWISE_RELU_FWD:
557 case CUDNN_POINTWISE_TANH_FWD:
560 case CUDNN_POINTWISE_SIGMOID_FWD:
563 case CUDNN_POINTWISE_ELU_FWD:
568 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
569 CUDNN_ATTR_OPERATION_POINTWISE_XDESC,
570 CUDNN_TYPE_BACKEND_DESCRIPTOR,
572 &(m_operation.
xdesc->get_backend_descriptor()));
573 if (
status != CUDNN_STATUS_SUCCESS) {
577 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_POINTWISE_XDESC Failed");
578 return std::move(m_operation);
580 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
581 CUDNN_ATTR_OPERATION_POINTWISE_PW_DESCRIPTOR,
582 CUDNN_TYPE_BACKEND_DESCRIPTOR,
584 &(m_operation.
pwdesc->get_backend_descriptor()));
585 if (
status != CUDNN_STATUS_SUCCESS) {
589 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_POINTWISE_PW_DESCRIPTOR Failed");
590 return std::move(m_operation);
592 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
593 CUDNN_ATTR_OPERATION_POINTWISE_YDESC,
594 CUDNN_TYPE_BACKEND_DESCRIPTOR,
596 &(m_operation.
ydesc->get_backend_descriptor()));
597 if (
status != CUDNN_STATUS_SUCCESS) {
601 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_POINTWISE_YDESC Failed");
602 return std::move(m_operation);
604 void *alpha = (m_operation.
alphabetaType == CUDNN_TYPE_FLOAT ?
static_cast<void *
>(&m_operation.
alpha_s)
605 : static_cast<void *>(&m_operation.
alpha_d));
606 void *alpha2 = (m_operation.
alphabetaType == CUDNN_TYPE_FLOAT ?
static_cast<void *
>(&m_operation.
alpha2_s)
607 : static_cast<void *>(&m_operation.
alpha2_d));
608 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
609 CUDNN_ATTR_OPERATION_POINTWISE_ALPHA1,
613 if (
status != CUDNN_STATUS_SUCCESS) {
617 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_POINTWISE_ALPHA1 Failed");
618 return std::move(m_operation);
620 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
621 CUDNN_ATTR_OPERATION_POINTWISE_ALPHA2,
625 if (
status != CUDNN_STATUS_SUCCESS) {
629 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_POINTWISE_ALPHA2 Failed");
630 return std::move(m_operation);
633 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
634 CUDNN_ATTR_OPERATION_POINTWISE_BDESC,
635 CUDNN_TYPE_BACKEND_DESCRIPTOR,
637 &(m_operation.
bdesc->get_backend_descriptor()));
638 if (
status != CUDNN_STATUS_SUCCESS) {
642 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_POINTWISE_BDESC Failed");
643 return std::move(m_operation);
647 status = cudnnBackendFinalize(m_operation.
pointer->get_backend_descriptor());
648 if (
status != CUDNN_STATUS_SUCCESS) {
650 return std::move(m_operation);
652 return std::move(m_operation);
auto setcDesc(ConvDesc_v8 const &conv) -> OperationBuilder_v8 &
cudnnStatus_t initialize_managed_backend_pointer(cudnnBackendDescriptorType_t type)
Initializes the underlying managed descriptor.
static void set_error_and_throw_exception(BackendDescriptor const *desc, cudnnStatus_t status, const char *message)
auto setAlpha(float alpha) -> OperationBuilder_v8 &
auto setwDesc(Tensor_v8 const &tensor) -> OperationBuilder_v8 &
Operation_v8 & operator=(Operation_v8 const &)=delete
auto setbDesc(Tensor_v8 const &tensor) -> OperationBuilder_v8 &
ManagedOpaqueDescriptor wdesc
cudnnBackendDescriptorType_t op_mode
auto setBeta(float beta) -> OperationBuilder_v8 &
auto setpwDesc(PointWiseDesc_v8 const &pointWiseDesc) -> OperationBuilder_v8 &
auto setAlpha2(float alpha) -> OperationBuilder_v8 &
int64_t pointwise_port_count
cudnnPointwiseMode_t pointwise_mode
cudnnStatus_t get_status() const
Current status of the descriptor.
auto setBeta(double beta) -> OperationBuilder_v8 &
Operation_v8(Operation_v8 &&from)
std::shared_ptr< OpaqueBackendPointer > ManagedOpaqueDescriptor
std::string describe() const override
Return a string describing the backend Descriptor.
const char * get_error() const
Diagonistic error message if any.
ManagedOpaqueDescriptor bdesc
cudnnBackendAttributeType_t alphabetaType
ManagedOpaqueDescriptor xdesc
ManagedOpaqueDescriptor pwdesc
auto setxDesc(ManagedOpaqueDescriptor const &raw_tensor) -> OperationBuilder_v8 &
auto setyDesc(Tensor_v8 const &tensor) -> OperationBuilder_v8 &
auto setxDesc(Tensor_v8 const &tensor) -> OperationBuilder_v8 &
ManagedOpaqueDescriptor cdesc
ManagedOpaqueDescriptor getOutputTensor()
auto setAlpha2(double alpha) -> OperationBuilder_v8 &
OperationBuilder_v8(cudnnBackendDescriptorType_t mode)
ManagedOpaqueDescriptor ydesc
std::string const & getTag() const
auto setAlpha(double alpha) -> OperationBuilder_v8 &
cudnnStatus_t status
Shared pointer of the OpaqueBackendPointer.
ManagedOpaqueDescriptor pointer