33 #include <cudnn_backend.h> 73 ss <<
"CUDNN_BACKEND_OPERATION :" 75 ss << std::hex <<
" X " <<
xdesc;
76 ss << std::hex <<
" Y " <<
ydesc;
77 ss << std::hex <<
" W " <<
wdesc;
78 ss << std::hex <<
" B " <<
bdesc;
79 ss << std::hex <<
" DW " <<
dwdesc;
80 ss << std::hex <<
" DY " <<
dydesc;
81 ss << std::hex <<
" DX " <<
dxdesc;
82 ss << std::hex <<
" C " <<
cdesc;
83 ss << std::hex <<
" A Mtrix " <<
amatdesc;
84 ss << std::hex <<
" B Mtrix " <<
bmatdesc;
85 ss << std::hex <<
" C Mtrix " <<
cmatdesc;
86 ss << std::hex <<
" P " <<
pwdesc;
123 cudnnBackendDescriptorType_t
op_mode = CUDNN_BACKEND_OPERATION_CONVOLUTION_FORWARD_DESCRIPTOR;
159 bool is_convolution_op =
false;
160 bool is_pointwise_op =
false;
161 bool is_matmul_op =
false;
162 bool is_reduction_op =
false;
166 int64_t xTensor_dimA[CUDNN_DIM_MAX + 1];
167 int64_t xTensor_strA[CUDNN_DIM_MAX + 1];
168 int64_t wTensor_dimA[CUDNN_DIM_MAX + 1];
169 int64_t wTensor_strA[CUDNN_DIM_MAX + 1];
170 int64_t yTensor_dimA[CUDNN_DIM_MAX + 1];
171 int64_t yTensor_strA[CUDNN_DIM_MAX + 1];
175 int64_t conv_padding [CUDNN_DIM_MAX];
176 int64_t conv_dilation[CUDNN_DIM_MAX];
177 int64_t conv_stride [CUDNN_DIM_MAX];
179 int64_t xType,
yType, wType, cType ;
181 int64_t tensor_dims = 0;
186 auto status = CUDNN_STATUS_SUCCESS;
187 if ((cudnnGetVersion() / 100) == 81) {
188 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
189 CUDNN_ATTR_REDUCTION_OPERATOR,
190 CUDNN_TYPE_BACKEND_DESCRIPTOR,
194 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
195 CUDNN_ATTR_OPERATION_REDUCTION_DESC,
196 CUDNN_TYPE_BACKEND_DESCRIPTOR,
200 if (
status != CUDNN_STATUS_SUCCESS) {
204 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_REDUCTION_DESC Failed");
205 return std::move(m_operation);
207 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
208 CUDNN_ATTR_OPERATION_REDUCTION_XDESC,
209 CUDNN_TYPE_BACKEND_DESCRIPTOR,
211 &(m_operation.
xdesc->get_backend_descriptor()));
212 if (
status != CUDNN_STATUS_SUCCESS) {
216 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_REDUCTION_XDESC Failed");
217 return std::move(m_operation);
219 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
220 CUDNN_ATTR_OPERATION_REDUCTION_YDESC,
221 CUDNN_TYPE_BACKEND_DESCRIPTOR,
223 &(m_operation.
ydesc->get_backend_descriptor()));
224 if (
status != CUDNN_STATUS_SUCCESS) {
228 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_REDUCTION_YDESC Failed");
229 return std::move(m_operation);
231 status = cudnnBackendFinalize(m_operation.
pointer->get_backend_descriptor());
232 if (
status != CUDNN_STATUS_SUCCESS) {
234 return std::move(m_operation);
236 return std::move(m_operation);
242 auto status = CUDNN_STATUS_SUCCESS;
243 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
244 CUDNN_ATTR_OPERATION_MATMUL_ADESC,
245 CUDNN_TYPE_BACKEND_DESCRIPTOR,
247 &(m_operation.
amatdesc->get_backend_descriptor()));
248 if (
status != CUDNN_STATUS_SUCCESS) {
252 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_MATMUL_ADESC Failed");
253 return std::move(m_operation);
255 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
256 CUDNN_ATTR_OPERATION_MATMUL_BDESC,
257 CUDNN_TYPE_BACKEND_DESCRIPTOR,
259 &(m_operation.
bmatdesc->get_backend_descriptor()));
260 if (
status != CUDNN_STATUS_SUCCESS) {
264 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_MATMUL_BDESC Failed");
265 return std::move(m_operation);
267 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
268 CUDNN_ATTR_OPERATION_MATMUL_CDESC,
269 CUDNN_TYPE_BACKEND_DESCRIPTOR,
271 &(m_operation.
cmatdesc->get_backend_descriptor()));
272 if (
status != CUDNN_STATUS_SUCCESS) {
276 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_MATMUL_CDESC Failed");
277 return std::move(m_operation);
279 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
280 CUDNN_ATTR_OPERATION_MATMUL_DESC,
281 CUDNN_TYPE_BACKEND_DESCRIPTOR,
283 &(m_operation.
matmuldesc->get_backend_descriptor()));
284 if (
status != CUDNN_STATUS_SUCCESS) {
288 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_MATMUL_DESC Failed");
289 return std::move(m_operation);
291 status = cudnnBackendFinalize(m_operation.
pointer->get_backend_descriptor());
292 if (
status != CUDNN_STATUS_SUCCESS) {
294 return std::move(m_operation);
296 return std::move(m_operation);
301 auto status = CUDNN_STATUS_SUCCESS;
304 case CUDNN_POINTWISE_ADD:
307 case CUDNN_POINTWISE_MUL:
310 #if (CUDNN_VERSION >= 8300) 311 case CUDNN_POINTWISE_DIV:
314 case CUDNN_POINTWISE_ADD_SQUARE:
317 case CUDNN_POINTWISE_EXP:
320 case CUDNN_POINTWISE_SUB:
323 case CUDNN_POINTWISE_CMP_EQ:
326 case CUDNN_POINTWISE_CMP_NEQ:
329 case CUDNN_POINTWISE_CMP_GT:
332 case CUDNN_POINTWISE_CMP_GE:
335 case CUDNN_POINTWISE_CMP_LT:
338 case CUDNN_POINTWISE_CMP_LE:
341 case CUDNN_POINTWISE_LOGICAL_OR:
344 case CUDNN_POINTWISE_LOGICAL_AND:
347 case CUDNN_POINTWISE_LOGICAL_NOT:
350 case CUDNN_POINTWISE_LOG:
353 case CUDNN_POINTWISE_NEG:
356 case CUDNN_POINTWISE_MOD:
359 case CUDNN_POINTWISE_POW:
362 case CUDNN_POINTWISE_ABS:
365 case CUDNN_POINTWISE_CEIL:
368 case CUDNN_POINTWISE_FLOOR:
371 case CUDNN_POINTWISE_SIN:
374 case CUDNN_POINTWISE_COS:
377 case CUDNN_POINTWISE_TAN:
380 case CUDNN_POINTWISE_RSQRT:
384 case CUDNN_POINTWISE_MIN:
387 case CUDNN_POINTWISE_MAX:
390 case CUDNN_POINTWISE_SQRT:
393 case CUDNN_POINTWISE_RELU_FWD:
396 case CUDNN_POINTWISE_TANH_FWD:
399 case CUDNN_POINTWISE_SIGMOID_FWD:
402 case CUDNN_POINTWISE_ELU_FWD:
405 case CUDNN_POINTWISE_GELU_FWD:
408 case CUDNN_POINTWISE_SOFTPLUS_FWD:
411 case CUDNN_POINTWISE_SWISH_FWD:
414 case CUDNN_POINTWISE_RELU_BWD:
417 case CUDNN_POINTWISE_TANH_BWD:
420 case CUDNN_POINTWISE_SIGMOID_BWD:
423 case CUDNN_POINTWISE_ELU_BWD:
426 case CUDNN_POINTWISE_GELU_BWD:
429 case CUDNN_POINTWISE_SOFTPLUS_BWD:
432 case CUDNN_POINTWISE_SWISH_BWD:
437 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
438 CUDNN_ATTR_OPERATION_POINTWISE_PW_DESCRIPTOR,
439 CUDNN_TYPE_BACKEND_DESCRIPTOR,
441 &(m_operation.
pwdesc->get_backend_descriptor()));
442 if (
status != CUDNN_STATUS_SUCCESS) {
446 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_POINTWISE_PW_DESCRIPTOR Failed");
447 return std::move(m_operation);
450 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
451 CUDNN_ATTR_OPERATION_POINTWISE_XDESC,
452 CUDNN_TYPE_BACKEND_DESCRIPTOR,
454 &(m_operation.
xdesc->get_backend_descriptor()));
455 if (
status != CUDNN_STATUS_SUCCESS) {
459 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_POINTWISE_XDESC Failed");
460 return std::move(m_operation);
464 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
465 CUDNN_ATTR_OPERATION_POINTWISE_YDESC,
466 CUDNN_TYPE_BACKEND_DESCRIPTOR,
468 &(m_operation.
ydesc->get_backend_descriptor()));
469 if (
status != CUDNN_STATUS_SUCCESS) {
473 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_POINTWISE_YDESC Failed");
474 return std::move(m_operation);
477 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
478 CUDNN_ATTR_OPERATION_POINTWISE_DYDESC,
479 CUDNN_TYPE_BACKEND_DESCRIPTOR,
481 &(m_operation.
dydesc->get_backend_descriptor()));
482 if (
status != CUDNN_STATUS_SUCCESS) {
486 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_POINTWISE_DYDESC Failed");
487 return std::move(m_operation);
490 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
491 CUDNN_ATTR_OPERATION_POINTWISE_DXDESC,
492 CUDNN_TYPE_BACKEND_DESCRIPTOR,
494 &(m_operation.
dxdesc->get_backend_descriptor()));
495 if (
status != CUDNN_STATUS_SUCCESS) {
499 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_POINTWISE_DXDESC Failed");
500 return std::move(m_operation);
504 void *alpha = (m_operation.
alphabetaType == CUDNN_TYPE_FLOAT ?
static_cast<void *
>(&m_operation.
alpha_s)
505 : static_cast<void *>(&m_operation.
alpha_d));
506 void *alpha2 = (m_operation.
alphabetaType == CUDNN_TYPE_FLOAT ?
static_cast<void *
>(&m_operation.
alpha2_s)
507 : static_cast<void *>(&m_operation.
alpha2_d));
508 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
509 CUDNN_ATTR_OPERATION_POINTWISE_ALPHA1,
513 if (
status != CUDNN_STATUS_SUCCESS) {
517 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_POINTWISE_ALPHA1 Failed");
518 return std::move(m_operation);
520 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
521 CUDNN_ATTR_OPERATION_POINTWISE_ALPHA2,
525 if (
status != CUDNN_STATUS_SUCCESS) {
529 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_POINTWISE_ALPHA2 Failed");
530 return std::move(m_operation);
534 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
535 CUDNN_ATTR_OPERATION_POINTWISE_BDESC,
536 CUDNN_TYPE_BACKEND_DESCRIPTOR,
538 &(m_operation.
bdesc->get_backend_descriptor()));
539 if (
status != CUDNN_STATUS_SUCCESS) {
543 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_POINTWISE_BDESC Failed");
544 return std::move(m_operation);
547 status = cudnnBackendFinalize(m_operation.
pointer->get_backend_descriptor());
548 if (
status != CUDNN_STATUS_SUCCESS) {
550 return std::move(m_operation);
552 return std::move(m_operation);
559 auto status = CUDNN_STATUS_SUCCESS;
561 auto dxdesc_ = m_operation.
dxdesc !=
nullptr ? m_operation.
dxdesc : m_operation.
xdesc;
562 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
563 CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_DX,
564 CUDNN_TYPE_BACKEND_DESCRIPTOR,
566 &(dxdesc_->get_backend_descriptor()));
567 if (
status != CUDNN_STATUS_SUCCESS) {
571 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_DX Failed");
572 return std::move(m_operation);
575 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
576 CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_W,
577 CUDNN_TYPE_BACKEND_DESCRIPTOR,
579 &(m_operation.
wdesc->get_backend_descriptor()));
580 if (
status != CUDNN_STATUS_SUCCESS) {
584 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_W Failed");
585 return std::move(m_operation);
588 auto dydesc_ = m_operation.
dydesc !=
nullptr ? m_operation.
dydesc : m_operation.
ydesc;
589 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
590 CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_DY,
591 CUDNN_TYPE_BACKEND_DESCRIPTOR,
593 &(dydesc_->get_backend_descriptor()));
594 if (
status != CUDNN_STATUS_SUCCESS) {
598 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_DY Failed");
599 return std::move(m_operation);
602 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
603 CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_CONV_DESC,
604 CUDNN_TYPE_BACKEND_DESCRIPTOR,
606 &(m_operation.
cdesc->get_backend_descriptor()));
607 if (
status != CUDNN_STATUS_SUCCESS) {
611 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_CONV_DESC Failed");
612 return std::move(m_operation);
615 void *alpha = (m_operation.
alphabetaType == CUDNN_TYPE_FLOAT ?
static_cast<void *
>(&m_operation.
alpha_s)
616 : static_cast<void *>(&m_operation.
alpha_d));
617 void *beta = (m_operation.
alphabetaType == CUDNN_TYPE_FLOAT ?
static_cast<void *
>(&m_operation.
beta_s)
618 : static_cast<void *>(&m_operation.
beta_d));
619 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
620 CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_ALPHA,
624 if (
status != CUDNN_STATUS_SUCCESS) {
628 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_ALPHA Failed");
629 return std::move(m_operation);
631 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
632 CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_BETA,
636 if (
status != CUDNN_STATUS_SUCCESS) {
640 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_BETA Failed");
641 return std::move(m_operation);
644 status = cudnnBackendFinalize(m_operation.
pointer->get_backend_descriptor());
645 if (
status != CUDNN_STATUS_SUCCESS) {
647 return std::move(m_operation);
649 getLogger() <<
"Extracting the feature vector" << std::endl;
650 extract_feature_vector(CUDNN_BACKEND_OPERATION_CONVOLUTION_BACKWARD_DATA_DESCRIPTOR);
651 return std::move(m_operation);
658 auto status = CUDNN_STATUS_SUCCESS;
660 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
661 CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_X,
662 CUDNN_TYPE_BACKEND_DESCRIPTOR,
664 &(m_operation.
xdesc->get_backend_descriptor()));
665 if (
status != CUDNN_STATUS_SUCCESS) {
669 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_X Failed");
670 return std::move(m_operation);
673 auto dwdesc_ = m_operation.
dwdesc !=
nullptr ? m_operation.
dwdesc : m_operation.
wdesc;
674 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
675 CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_DW,
676 CUDNN_TYPE_BACKEND_DESCRIPTOR,
678 &(dwdesc_->get_backend_descriptor()));
679 if (
status != CUDNN_STATUS_SUCCESS) {
683 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_DW Failed");
684 return std::move(m_operation);
687 auto dydesc_ = m_operation.
dydesc !=
nullptr ? m_operation.
dydesc : m_operation.
ydesc;
688 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
689 CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_DY,
690 CUDNN_TYPE_BACKEND_DESCRIPTOR,
692 &(dydesc_->get_backend_descriptor()));
693 if (
status != CUDNN_STATUS_SUCCESS) {
697 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_DY Failed");
698 return std::move(m_operation);
701 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
702 CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_CONV_DESC,
703 CUDNN_TYPE_BACKEND_DESCRIPTOR,
705 &(m_operation.
cdesc->get_backend_descriptor()));
706 if (
status != CUDNN_STATUS_SUCCESS) {
709 "CUDNN_BACKEND_OPERATION: SetAttribute " 710 "CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_CONV_DESC Failed");
711 return std::move(m_operation);
713 void *alpha = (m_operation.
alphabetaType == CUDNN_TYPE_FLOAT ?
static_cast<void *
>(&m_operation.
alpha_s)
714 : static_cast<void *>(&m_operation.
alpha_d));
715 void *beta = (m_operation.
alphabetaType == CUDNN_TYPE_FLOAT ?
static_cast<void *
>(&m_operation.
beta_s)
716 : static_cast<void *>(&m_operation.
beta_d));
717 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
718 CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_ALPHA,
722 if (
status != CUDNN_STATUS_SUCCESS) {
726 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_ALPHA Failed");
727 return std::move(m_operation);
729 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
730 CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_BETA,
734 if (
status != CUDNN_STATUS_SUCCESS) {
738 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_BETA Failed");
739 return std::move(m_operation);
742 status = cudnnBackendFinalize(m_operation.
pointer->get_backend_descriptor());
743 if (
status != CUDNN_STATUS_SUCCESS) {
745 return std::move(m_operation);
747 getLogger() <<
"Extracting the feature vector" << std::endl;
748 extract_feature_vector(CUDNN_BACKEND_OPERATION_CONVOLUTION_BACKWARD_FILTER_DESCRIPTOR);
749 return std::move(m_operation);
756 auto status = CUDNN_STATUS_SUCCESS;
758 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
759 CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_X,
760 CUDNN_TYPE_BACKEND_DESCRIPTOR,
762 &(m_operation.
xdesc->get_backend_descriptor()));
763 if (
status != CUDNN_STATUS_SUCCESS) {
767 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_X Failed");
768 return std::move(m_operation);
770 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
771 CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_W,
772 CUDNN_TYPE_BACKEND_DESCRIPTOR,
774 &(m_operation.
wdesc->get_backend_descriptor()));
775 if (
status != CUDNN_STATUS_SUCCESS) {
779 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_W Failed");
780 return std::move(m_operation);
782 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
783 CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_Y,
784 CUDNN_TYPE_BACKEND_DESCRIPTOR,
786 &(m_operation.
ydesc->get_backend_descriptor()));
787 if (
status != CUDNN_STATUS_SUCCESS) {
791 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_Y Failed");
792 return std::move(m_operation);
794 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
795 CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_CONV_DESC,
796 CUDNN_TYPE_BACKEND_DESCRIPTOR,
798 &(m_operation.
cdesc->get_backend_descriptor()));
799 if (
status != CUDNN_STATUS_SUCCESS) {
803 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_CONV_DESC Failed");
804 return std::move(m_operation);
806 void *alpha = (m_operation.
alphabetaType == CUDNN_TYPE_FLOAT ?
static_cast<void *
>(&m_operation.
alpha_s)
807 : static_cast<void *>(&m_operation.
alpha_d));
808 void *beta = (m_operation.
alphabetaType == CUDNN_TYPE_FLOAT ?
static_cast<void *
>(&m_operation.
beta_s)
809 : static_cast<void *>(&m_operation.
beta_d));
810 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
811 CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_ALPHA,
815 if (
status != CUDNN_STATUS_SUCCESS) {
819 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_ALPHA Failed");
820 return std::move(m_operation);
822 status = cudnnBackendSetAttribute(m_operation.
pointer->get_backend_descriptor(),
823 CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_BETA,
827 if (
status != CUDNN_STATUS_SUCCESS) {
831 "CUDNN_BACKEND_OPERATION: SetAttribute CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_BETA Failed");
832 return std::move(m_operation);
834 status = cudnnBackendFinalize(m_operation.
pointer->get_backend_descriptor());
835 if (
status != CUDNN_STATUS_SUCCESS) {
837 return std::move(m_operation);
840 getLogger() <<
"Extracting the feature vector" << std::endl;
841 extract_feature_vector(CUDNN_BACKEND_OPERATION_CONVOLUTION_FORWARD_DESCRIPTOR);
842 return std::move(m_operation);
850 for (
auto i = 0; i < tensor_dims; i++) {
853 for (
auto i = 0; i < tensor_dims; i++) {
856 for (
auto i = 0; i < tensor_dims; i++) {
859 const int max_spatial_dim = 3;
862 for (
auto i = 0; i < max_spatial_dim; i++) {
863 if (i == 0 && is2D) {
870 for (
auto i = 0; i < max_spatial_dim; i++) {
871 if (i == 0 && is2D) {
878 for (
auto i = 0; i < max_spatial_dim; i++) {
879 if (i == 0 && is2D) {
892 for (
auto i = 0; i < tensor_dims; i++) {
895 for (
auto i = 0; i < tensor_dims; i++) {
898 for (
auto i = 0; i < tensor_dims; i++) {
906 msg =
"CUDNN_BACKEND_OPERATION: Check and Set the CUDNN_ATTR_OPERATION_MATMUL_DESC";
907 return CUDNN_STATUS_BAD_PARAM;
909 if (m_operation.
amatdesc ==
nullptr) {
910 msg =
"CUDNN_BACKEND_OPERATION: Check and Set the CUDNN_ATTR_OPERATION_MATMUL_ADESC";
911 return CUDNN_STATUS_BAD_PARAM;
913 if (m_operation.
bmatdesc ==
nullptr) {
914 msg =
"CUDNN_BACKEND_OPERATION: Check and Set the CUDNN_ATTR_OPERATION_MATMUL_BDESC";
915 return CUDNN_STATUS_BAD_PARAM;
917 if (m_operation.
cmatdesc ==
nullptr) {
918 msg =
"CUDNN_BACKEND_OPERATION: Check and Set the CUDNN_ATTR_OPERATION_MATMUL_CDESC";
919 return CUDNN_STATUS_BAD_PARAM;
921 return CUDNN_STATUS_SUCCESS;
927 msg =
"CUDNN_BACKEND_OPERATION: Check and Set the CUDNN_ATTR_OPERATION_REDUCTION_DESC";
928 return CUDNN_STATUS_BAD_PARAM;
930 if (m_operation.
xdesc ==
nullptr) {
931 msg =
"CUDNN_BACKEND_OPERATION: Check and Set the CUDNN_ATTR_OPERATION_REDUCTION_XDESC";
932 return CUDNN_STATUS_BAD_PARAM;
934 if (m_operation.
ydesc ==
nullptr) {
935 msg =
"CUDNN_BACKEND_OPERATION: Check and Set the CUDNN_ATTR_OPERATION_REDUCTION_YDESC";
936 return CUDNN_STATUS_BAD_PARAM;
938 return CUDNN_STATUS_SUCCESS;
943 if (m_operation.
xdesc ==
nullptr) {
944 msg =
"CUDNN_BACKEND_OPERATION: Check and Set the CUDNN_ATTR_OPERATION_POINTWISE_XDESC";
945 return CUDNN_STATUS_BAD_PARAM;
949 msg =
"CUDNN_BACKEND_OPERATION: Check and Set the CUDNN_ATTR_OPERATION_POINTWISE_BDESC";
950 return CUDNN_STATUS_BAD_PARAM;
952 if (m_operation.
ydesc ==
nullptr) {
953 msg =
"CUDNN_BACKEND_OPERATION: Check and Set the CUDNN_ATTR_OPERATION_POINTWISE_YDESC";
954 return CUDNN_STATUS_BAD_PARAM;
957 if (m_operation.
ydesc ==
nullptr) {
958 msg =
"CUDNN_BACKEND_OPERATION: Check and Set the CUDNN_ATTR_OPERATION_POINTWISE_YDESC";
959 return CUDNN_STATUS_BAD_PARAM;
962 if (m_operation.
dydesc ==
nullptr) {
963 msg =
"CUDNN_BACKEND_OPERATION: Check and Set the CUDNN_ATTR_OPERATION_POINTWISE_DYDESC";
964 return CUDNN_STATUS_BAD_PARAM;
966 if (m_operation.
dxdesc ==
nullptr) {
967 msg =
"CUDNN_BACKEND_OPERATION: Check and Set the CUDNN_ATTR_OPERATION_POINTWISE_DXDESC";
968 return CUDNN_STATUS_BAD_PARAM;
971 msg =
"CUDNN_BACKEND_OPERATION: Unsupported cudnn pointwise mode. Check and set CUDNN_POINTWISE_*";
972 return CUDNN_STATUS_BAD_PARAM;
974 return CUDNN_STATUS_SUCCESS;
979 if (m_operation.
cdesc ==
nullptr) {
980 msg =
"CUDNN_BACKEND_OPERATION: Check and Set the CUDNN_ATTR_OPERATION_CONVOLUTION_*_CONV_DESC";
981 return CUDNN_STATUS_BAD_PARAM;
983 if (m_operation.
op_mode == CUDNN_BACKEND_OPERATION_CONVOLUTION_FORWARD_DESCRIPTOR) {
984 if (m_operation.
xdesc ==
nullptr) {
985 msg =
"CUDNN_BACKEND_OPERATION: Check and Set the CUDNN_ATTR_OPERATION_CONVOLUTION_*_X";
986 return CUDNN_STATUS_BAD_PARAM;
988 if (m_operation.
wdesc ==
nullptr) {
989 msg =
"CUDNN_BACKEND_OPERATION: Check and Set the CUDNN_ATTR_OPERATION_CONVOLUTION_*_W";
990 return CUDNN_STATUS_BAD_PARAM;
992 if (m_operation.
ydesc ==
nullptr) {
993 msg =
"CUDNN_BACKEND_OPERATION: Check and Set the CUDNN_ATTR_OPERATION_CONVOLUTION_*_Y";
994 return CUDNN_STATUS_BAD_PARAM;
997 }
else if (m_operation.
op_mode == CUDNN_BACKEND_OPERATION_CONVOLUTION_BACKWARD_FILTER_DESCRIPTOR) {
998 if (m_operation.
ydesc !=
nullptr && m_operation.
dydesc !=
nullptr) {
999 msg =
"CUDNN_BACKEND_OPERATION: Ambiguous specification. Choose and Set only one of setyDesc() or setdyDesc()";
1000 return CUDNN_STATUS_BAD_PARAM;
1002 if (m_operation.
ydesc ==
nullptr && m_operation.
dydesc ==
nullptr) {
1003 msg =
"CUDNN_BACKEND_OPERATION: Choose and Set one of setyDesc() or setdyDesc()";
1004 return CUDNN_STATUS_BAD_PARAM;
1006 if (m_operation.
xdesc ==
nullptr) {
1007 msg =
"CUDNN_BACKEND_OPERATION: Check and Set the CUDNN_ATTR_OPERATION_CONVOLUTION_*_X";
1008 return CUDNN_STATUS_BAD_PARAM;
1010 if (m_operation.
wdesc !=
nullptr && m_operation.
dwdesc !=
nullptr) {
1011 msg =
"CUDNN_BACKEND_OPERATION: Ambiguous specification. Choose and Set only one of setwDesc() or setdwDesc()";
1012 return CUDNN_STATUS_BAD_PARAM;
1014 if (m_operation.
wdesc ==
nullptr && m_operation.
dwdesc ==
nullptr) {
1015 msg =
"CUDNN_BACKEND_OPERATION: Choose and Set one of setwDesc() or setdwDesc()";
1016 return CUDNN_STATUS_BAD_PARAM;
1018 }
else if (m_operation.
op_mode == CUDNN_BACKEND_OPERATION_CONVOLUTION_BACKWARD_DATA_DESCRIPTOR) {
1019 if (m_operation.
ydesc !=
nullptr && m_operation.
dydesc !=
nullptr) {
1020 msg =
"CUDNN_BACKEND_OPERATION: Ambiguous specification. Choose and Set only one of setyDesc() or setdyDesc()";
1021 return CUDNN_STATUS_BAD_PARAM;
1023 if (m_operation.
ydesc ==
nullptr && m_operation.
dydesc ==
nullptr) {
1024 msg =
"CUDNN_BACKEND_OPERATION: Choose and Set one of setyDesc() or setdyDesc()";
1025 return CUDNN_STATUS_BAD_PARAM;
1027 if (m_operation.
wdesc ==
nullptr) {
1028 msg =
"CUDNN_BACKEND_OPERATION: Check and Set the CUDNN_ATTR_OPERATION_CONVOLUTION_*_W";
1029 return CUDNN_STATUS_BAD_PARAM;
1031 if (m_operation.
xdesc !=
nullptr && m_operation.
dxdesc !=
nullptr) {
1032 msg =
"CUDNN_BACKEND_OPERATION: Ambiguous specification. Choose and Set only one of setxDesc() or setdxDesc()";
1033 return CUDNN_STATUS_BAD_PARAM;
1035 if (m_operation.
xdesc ==
nullptr && m_operation.
dxdesc ==
nullptr) {
1036 msg =
"CUDNN_BACKEND_OPERATION: Choose and Set one of setxDesc() or setdxDesc()";
1037 return CUDNN_STATUS_BAD_PARAM;
1040 msg =
"CUDNN_BACKEND_OPERATION: Unsupported convolution operation. Check and set CUDNN_BACKEND_OPERATION_CONVOLUTION_*_DESCRIPTOR";
1041 return CUDNN_STATUS_BAD_PARAM;
1043 return CUDNN_STATUS_SUCCESS;
1048 for (
auto i = 0; i < CUDNN_DIM_MAX + 1; i++) {
1061 m_operation.
xdesc = raw_tensor;
1067 m_operation.
xdesc = tensor.get_desc();
1068 copy_dims_and_strides(tensor.getDimArray(), xTensor_dimA);
1069 copy_dims_and_strides(tensor.getStrideArray(), xTensor_strA);
1070 tensor_dims = tensor.getDimensionCount();
1071 xType = tensor.getDataType();
1076 if (is_pointwise_op ==
false) {
1079 CUDNN_STATUS_BAD_PARAM,
1080 "CUDNN_BACKEND_OPERATION_*_DESCRIPTOR: Non Pointwise operation does not need bTensor");
1082 m_operation.
bdesc = tensor.get_desc();
1087 m_operation.
ydesc = tensor.get_desc();
1088 copy_dims_and_strides(tensor.getDimArray(), yTensor_dimA);
1089 copy_dims_and_strides(tensor.getStrideArray(), yTensor_strA);
1090 yType = tensor.getDataType();
1095 if (is_convolution_op ==
false) {
1098 CUDNN_STATUS_BAD_PARAM,
1099 "CUDNN_BACKEND_OPERATION_*_DESCRIPTOR: Non Convolution operation does not need wTensor");
1101 m_operation.
wdesc = tensor.get_desc();
1102 copy_dims_and_strides(tensor.getDimArray(), wTensor_dimA);
1103 copy_dims_and_strides(tensor.getStrideArray(), wTensor_strA);
1104 wType = tensor.getDataType();
1111 m_operation.
dydesc = raw_tensor;
1116 m_operation.
dydesc = tensor.get_desc();
1117 copy_dims_and_strides(tensor.getDimArray(), yTensor_dimA);
1118 copy_dims_and_strides(tensor.getStrideArray(), yTensor_strA);
1119 yType = tensor.getDataType();
1124 m_operation.
dxdesc = tensor.get_desc();
1125 copy_dims_and_strides(tensor.getDimArray(), xTensor_dimA);
1126 copy_dims_and_strides(tensor.getStrideArray(), xTensor_strA);
1127 tensor_dims = tensor.getDimensionCount();
1128 xType = tensor.getDataType();
1133 m_operation.
dwdesc = tensor.get_desc();
1134 copy_dims_and_strides(tensor.getDimArray(), wTensor_dimA);
1135 copy_dims_and_strides(tensor.getStrideArray(), wTensor_strA);
1136 wType = tensor.getDataType();
1142 if (is_convolution_op ==
false) {
1145 CUDNN_STATUS_BAD_PARAM,
1146 "CUDNN_BACKEND_OPERATION_*_DESCRIPTOR: Non Convolution operation does not need Convolution DESCRIPTOR");
1148 m_operation.
cdesc = conv.get_desc();
1149 if (conv.getComputePrecision() == CUDNN_DATA_DOUBLE) {
1152 is2D = conv.getDimensionCount() == 2;
1153 copy_dims_and_strides(conv.getPadding(), conv_padding);
1154 copy_dims_and_strides(conv.getDilation(), conv_dilation);
1155 copy_dims_and_strides(conv.getStride(), conv_stride);
1156 cType = conv.getComputePrecision();
1157 mode = conv.getMathMode();
1162 if (is_matmul_op ==
false) {
1165 CUDNN_STATUS_BAD_PARAM,
1166 "CUDNN_BACKEND_OPERATION_*_DESCRIPTOR: Non Matmul operation does not need a Matrix Tensor");
1168 m_operation.
amatdesc = tensor.get_desc();
1173 if (is_matmul_op ==
false) {
1176 CUDNN_STATUS_BAD_PARAM,
1177 "CUDNN_BACKEND_OPERATION_*_DESCRIPTOR: Non Matmul operation does not need b Matrix Tensor");
1179 m_operation.
bmatdesc = tensor.get_desc();
1184 if (is_matmul_op ==
false) {
1187 CUDNN_STATUS_BAD_PARAM,
1188 "CUDNN_BACKEND_OPERATION_*_DESCRIPTOR: Non Matmul operation does not need c Matrix Tensor");
1190 m_operation.
cmatdesc = tensor.get_desc();
1195 if (is_matmul_op ==
false) {
1198 CUDNN_STATUS_BAD_PARAM,
1199 "CUDNN_BACKEND_OPERATION_*_DESCRIPTOR: Non Matmul operation does not need MATMUL DESCRIPTOR");
1201 m_operation.
matmuldesc = matmulDesc.get_desc();
1206 if (is_reduction_op ==
false) {
1209 CUDNN_STATUS_BAD_PARAM,
1210 "CUDNN_BACKEND_OPERATION_*_DESCRIPTOR: Non Reduction operation does not need REDUCTION DESCRIPTOR");
1217 if (is_pointwise_op ==
false) {
1220 CUDNN_STATUS_BAD_PARAM,
1221 "CUDNN_BACKEND_OPERATION_*_DESCRIPTOR: Non Pointwise operation does not need POINTWISE DESCRIPTOR");
1223 m_operation.
pwdesc = pointWiseDesc.get_desc();
1229 #if (CUDNN_VERSION >= 8300) 1264 #if (CUDNN_VERSION >= 8300) 1282 m_operation.
alpha_d =
static_cast<double>(alpha);
1288 m_operation.
alpha_s =
static_cast<float>(alpha);
1294 m_operation.
alpha2_d =
static_cast<double>(alpha);
1300 m_operation.
alpha2_s =
static_cast<float>(alpha);
1306 m_operation.
beta_d =
static_cast<double>(beta);
1307 m_operation.
beta_s = beta;
1312 m_operation.
beta_s =
static_cast<float>(beta);
1313 m_operation.
beta_d = beta;
1319 is_convolution_op = ((m_operation.
op_mode == CUDNN_BACKEND_OPERATION_CONVOLUTION_FORWARD_DESCRIPTOR) ||
1320 (m_operation.
op_mode == CUDNN_BACKEND_OPERATION_CONVOLUTION_BACKWARD_FILTER_DESCRIPTOR) ||
1321 (m_operation.
op_mode == CUDNN_BACKEND_OPERATION_CONVOLUTION_BACKWARD_DATA_DESCRIPTOR));
1323 is_pointwise_op = (m_operation.
op_mode == CUDNN_BACKEND_OPERATION_POINTWISE_DESCRIPTOR);
1324 is_matmul_op = (m_operation.
op_mode == CUDNN_BACKEND_OPERATION_MATMUL_DESCRIPTOR);
1325 is_reduction_op = (m_operation.
op_mode == CUDNN_BACKEND_OPERATION_REDUCTION_DESCRIPTOR);
1333 if (m_operation.
status != CUDNN_STATUS_SUCCESS) {
1335 &m_operation, m_operation.
status,
"CUDNN_BACKEND_OPERATION: Operation not initialized properly");
1336 return std::move(m_operation);
1340 cudnnStatus_t status_ = CUDNN_STATUS_SUCCESS;
1341 if (is_convolution_op) {
1342 status_ = validate_convolution_op(msg);
1343 }
else if (is_pointwise_op) {
1344 status_ = validate_pointwise_op(msg);
1345 }
else if (is_matmul_op) {
1346 status_ = validate_matmul_op(msg);
1347 }
else if (is_reduction_op) {
1348 status_ = validate_reduction_op(msg);
1350 status_ = CUDNN_STATUS_BAD_PARAM;
1351 msg =
"CUDNN_BACKEND_OPERATION_DESCRIPTOR: Unsupported cudnn backend descriptor type. Check and set CUDNN_BACKEND_OPERATION_*_DESCRIPTOR";
1353 if (status_ != CUDNN_STATUS_SUCCESS) {
1355 return std::move(m_operation);
1360 if (
status != CUDNN_STATUS_SUCCESS) {
1362 return std::move(m_operation);
1365 if (m_operation.
op_mode == CUDNN_BACKEND_OPERATION_CONVOLUTION_FORWARD_DESCRIPTOR) {
1366 return build_conv_forward();
1367 }
else if (m_operation.
op_mode == CUDNN_BACKEND_OPERATION_CONVOLUTION_BACKWARD_FILTER_DESCRIPTOR) {
1368 return build_conv_backward_filter();
1369 }
else if (m_operation.
op_mode == CUDNN_BACKEND_OPERATION_CONVOLUTION_BACKWARD_DATA_DESCRIPTOR) {
1370 return build_conv_backward_data();
1371 }
else if (m_operation.
op_mode == CUDNN_BACKEND_OPERATION_POINTWISE_DESCRIPTOR) {
1372 return build_pointwise_op();
1373 }
else if (m_operation.
op_mode == CUDNN_BACKEND_OPERATION_MATMUL_DESCRIPTOR) {
1374 return build_matmul_op();
1375 }
else if (m_operation.
op_mode == CUDNN_BACKEND_OPERATION_REDUCTION_DESCRIPTOR) {
1376 return build_reduction_op();
1378 getLogger() <<
"[cudnn_frontend] " << m_operation << std::endl;
1379 return std::move(m_operation);
Operation_v8 && build_conv_backward_filter()
std::vector< int64_t > feature_vector_t
Detailed feature_vector. Generally the Tensor and Operation properties.
auto setcDesc(ConvDesc_v8 const &conv) -> OperationBuilder_v8 &
ConditionalStreamer & getLogger()
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)
NLOHMANN_BASIC_JSON_TPL_DECLARATION std::string to_string(const NLOHMANN_BASIC_JSON_TPL &j)
user-defined to_string function for JSON values
Operation_v8 && build_conv_forward()
auto setAlpha(float alpha) -> OperationBuilder_v8 &
cudnnStatus_t validate_matmul_op(Message_t &msg)
cudnnStatus_t validate_convolution_op(Message_t &msg)
auto setdxDesc(Tensor_v8 const &tensor) -> OperationBuilder_v8 &
auto setwDesc(Tensor_v8 const &tensor) -> OperationBuilder_v8 &
bool is_pointwise_activation_bwd_op
cudnnStatus_t validate_reduction_op(Message_t &msg)
bool is_pointwise_math_op
auto setbDesc(Tensor_v8 const &tensor) -> OperationBuilder_v8 &
ManagedOpaqueDescriptor wdesc
void copy_dims_and_strides(const int64_t *from, int64_t *to) const
ManagedOpaqueDescriptor dxdesc
auto setaMatDesc(Tensor_v8 const &tensor) -> OperationBuilder_v8 &
Operation_v8 && build_matmul_op()
Operation_v8 && build_reduction_op()
void extract_feature_vector(cudnnBackendDescriptorType_t op_type)
auto setmatmulDesc(MatMulDesc_v8 const &matmulDesc) -> OperationBuilder_v8 &
cudnnBackendDescriptorType_t op_mode
auto setBeta(float beta) -> OperationBuilder_v8 &
auto setpwDesc(PointWiseDesc_v8 const &pointWiseDesc) -> OperationBuilder_v8 &
auto setAlpha2(float alpha) -> OperationBuilder_v8 &
auto setdwDesc(Tensor_v8 const &tensor) -> OperationBuilder_v8 &
auto setreductionDesc(ReductionDesc_v8 const &reductionDesc) -> OperationBuilder_v8 &
int64_t pointwise_port_count
cudnnPointwiseMode_t pointwise_mode
auto setBeta(double beta) -> OperationBuilder_v8 &
Operation_v8 && build_conv_backward_data()
auto setbMatDesc(Tensor_v8 const &tensor) -> OperationBuilder_v8 &
feature_vector_t feature_vector
ManagedOpaqueDescriptor reductiondesc
std::shared_ptr< OpaqueBackendPointer > ManagedOpaqueDescriptor
auto setdyDesc(ManagedOpaqueDescriptor const &raw_tensor) -> OperationBuilder_v8 &
Will be Deprecated Do not use.
std::string describe() const override
Return a string describing the backend Descriptor.
bool is_pointwise_activation_fwd_op
Operation_v8 & operator=(Operation_v8 &&from)=default
ManagedOpaqueDescriptor dwdesc
ManagedOpaqueDescriptor cmatdesc
auto setdyDesc(Tensor_v8 const &tensor) -> OperationBuilder_v8 &
cudnnStatus_t validate_pointwise_op(Message_t &msg)
Operation_v8 && build_pointwise_op()
ManagedOpaqueDescriptor bdesc
cudnnBackendAttributeType_t alphabetaType
ManagedOpaqueDescriptor xdesc
ManagedOpaqueDescriptor pwdesc
ManagedOpaqueDescriptor dydesc
auto setxDesc(ManagedOpaqueDescriptor const &raw_tensor) -> OperationBuilder_v8 &
Will be Deprecated Do not use.
auto setcMatDesc(Tensor_v8 const &tensor) -> OperationBuilder_v8 &
auto setyDesc(Tensor_v8 const &tensor) -> OperationBuilder_v8 &
ManagedOpaqueDescriptor bmatdesc
auto setxDesc(Tensor_v8 const &tensor) -> OperationBuilder_v8 &
ManagedOpaqueDescriptor cdesc
ManagedOpaqueDescriptor getOutputTensor()
auto setAlpha2(double alpha) -> OperationBuilder_v8 &
ManagedOpaqueDescriptor matmuldesc
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
ManagedOpaqueDescriptor amatdesc
feature_vector_t getFeatureVector() const