From 04929fae0701b37ce5c66c20f9ed0d48461c18b5 Mon Sep 17 00:00:00 2001 From: Evgeny Mankov Date: Wed, 12 Apr 2023 21:02:47 +0200 Subject: [PATCH] [HIPIFY][#584][DNN][MIOpen] cuDNN -> MIOpen - Part 15 + Continued supporting hipification to MIOpen based on `miopen.h` + Updated the synthetic test `cudnn2miopen.cu` accordingly --- src/CUDA2HIP_DNN_API_functions.cpp | 2 +- src/CUDA2HIP_DNN_API_types.cpp | 30 ++++++------- .../synthetic/libraries/cudnn2miopen.cu | 45 +++++++++++++++++++ 3 files changed, 61 insertions(+), 16 deletions(-) diff --git a/src/CUDA2HIP_DNN_API_functions.cpp b/src/CUDA2HIP_DNN_API_functions.cpp index 0a718e6f..b3e0a6e3 100644 --- a/src/CUDA2HIP_DNN_API_functions.cpp +++ b/src/CUDA2HIP_DNN_API_functions.cpp @@ -116,7 +116,7 @@ const std::map CUDA_DNN_FUNCTION_MAP { {"cudnnGetConvolutionForwardAlgorithm_v7", {"hipdnnGetConvolutionForwardAlgorithm_v7", "", CONV_LIB_FUNC, API_DNN, 2, HIP_UNSUPPORTED}}, {"cudnnGetConvolutionForwardWorkspaceSize", {"hipdnnGetConvolutionForwardWorkspaceSize", "miopenConvolutionForwardGetWorkSpaceSize", CONV_LIB_FUNC, API_DNN, 2}}, {"cudnnConvolutionForward", {"hipdnnConvolutionForward", "miopenConvolutionForward", CONV_LIB_FUNC, API_DNN, 2}}, - {"cudnnConvolutionBiasActivationForward", {"hipdnnConvolutionBiasActivationForward", "", CONV_LIB_FUNC, API_DNN, 2, HIP_UNSUPPORTED}}, + {"cudnnConvolutionBiasActivationForward", {"hipdnnConvolutionBiasActivationForward", "miopenConvolutionBiasActivationForward", CONV_LIB_FUNC, API_DNN, 2, HIP_UNSUPPORTED}}, {"cudnnConvolutionBackwardBias", {"hipdnnConvolutionBackwardBias", "miopenConvolutionBackwardBias", CONV_LIB_FUNC, API_DNN, 2}}, {"cudnnGetConvolutionBackwardFilterAlgorithmMaxCount", {"hipdnnGetConvolutionBackwardFilterAlgorithmMaxCount", "", CONV_LIB_FUNC, API_DNN, 2, HIP_UNSUPPORTED}}, {"cudnnFindConvolutionBackwardFilterAlgorithm", {"hipdnnFindConvolutionBackwardFilterAlgorithm", "", CONV_LIB_FUNC, API_DNN, 2}}, diff --git a/src/CUDA2HIP_DNN_API_types.cpp b/src/CUDA2HIP_DNN_API_types.cpp index c8469e7a..367fd445 100644 --- a/src/CUDA2HIP_DNN_API_types.cpp +++ b/src/CUDA2HIP_DNN_API_types.cpp @@ -135,9 +135,9 @@ const std::map CUDA_DNN_TYPE_NAME_MAP { {"CUDNN_CTC_LOSS_ALGO_NON_DETERMINISTIC", {"HIPDNN_CTC_LOSS_ALGO_NON_DETERMINISTIC", "", CONV_NUMERIC_LITERAL, API_DNN, 1, HIP_UNSUPPORTED}}, // 1 {"cudnnLRNMode_t", {"hipdnnLRNMode_t", "miopenLRNMode_t", CONV_TYPE, API_DNN, 1}}, {"CUDNN_LRN_CROSS_CHANNEL_DIM1", {"HIPDNN_LRN_CROSS_CHANNEL", "miopenLRNCrossChannel", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 0 vs 1 - {"cudnnRNNInputMode_t", {"hipdnnRNNInputMode_t", "", CONV_TYPE, API_DNN, 1}}, - {"CUDNN_LINEAR_INPUT", {"HIPDNN_LINEAR_INPUT", "", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 0 - {"CUDNN_SKIP_INPUT", {"HIPDNN_SKIP_INPUT", "", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 1 + {"cudnnRNNInputMode_t", {"hipdnnRNNInputMode_t", "miopenRNNInputMode_t", CONV_TYPE, API_DNN, 1}}, + {"CUDNN_LINEAR_INPUT", {"HIPDNN_LINEAR_INPUT", "miopenRNNlinear", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 0 + {"CUDNN_SKIP_INPUT", {"HIPDNN_SKIP_INPUT", "miopenRNNskip", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 1 {"cudnnDirectionMode_t", {"hipdnnDirectionMode_t", "", CONV_TYPE, API_DNN, 1}}, {"CUDNN_UNIDIRECTIONAL", {"HIPDNN_UNIDIRECTIONAL", "", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 0 {"CUDNN_BIDIRECTIONAL", {"HIPDNN_BIDIRECTIONAL", "", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 1 @@ -170,22 +170,22 @@ const std::map CUDA_DNN_TYPE_NAME_MAP { {"CUDNN_CONVOLUTION_BWD_FILTER_NO_WORKSPACE", {"HIPDNN_CONVOLUTION_BWD_FILTER_NO_WORKSPACE", "", CONV_NUMERIC_LITERAL, API_DNN, 1, CUDA_DEPRECATED | CUDA_REMOVED}}, // 0 {"CUDNN_CONVOLUTION_BWD_FILTER_PREFER_FASTEST", {"HIPDNN_CONVOLUTION_BWD_FILTER_PREFER_FASTEST", "", CONV_NUMERIC_LITERAL, API_DNN, 1, CUDA_DEPRECATED | CUDA_REMOVED}}, // 1 {"CUDNN_CONVOLUTION_BWD_FILTER_SPECIFY_WORKSPACE_LIMIT", {"HIPDNN_CONVOLUTION_BWD_FILTER_SPECIFY_WORKSPACE_LIMIT", "", CONV_NUMERIC_LITERAL, API_DNN, 1, CUDA_DEPRECATED | CUDA_REMOVED}}, // 2 - {"cudnnRNNAlgo_t", {"hipdnnRNNAlgo_t", "", CONV_TYPE, API_DNN, 1}}, - {"CUDNN_RNN_ALGO_STANDARD", {"HIPDNN_RNN_ALGO_STANDARD", "", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 0 + {"cudnnRNNAlgo_t", {"hipdnnRNNAlgo_t", "miopenRNNAlgo_t", CONV_TYPE, API_DNN, 1}}, + {"CUDNN_RNN_ALGO_STANDARD", {"HIPDNN_RNN_ALGO_STANDARD", "miopenRNNdefault", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 0 {"CUDNN_RNN_ALGO_PERSIST_STATIC", {"HIPDNN_RNN_ALGO_PERSIST_STATIC", "", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 1 {"CUDNN_RNN_ALGO_PERSIST_DYNAMIC", {"HIPDNN_RNN_ALGO_PERSIST_DYNAMIC", "", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 2 {"CUDNN_RNN_ALGO_PERSIST_STATIC_SMALL_H", {"HIPDNN_RNN_ALGO_PERSIST_STATIC_SMALL_H", "", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 3 {"CUDNN_RNN_ALGO_COUNT", {"HIPDNN_RNN_ALGO_COUNT", "", CONV_NUMERIC_LITERAL, API_DNN, 1, HIP_UNSUPPORTED}}, // 3 - {"cudnnRNNMode_t", {"hipdnnRNNMode_t", "", CONV_TYPE, API_DNN, 1}}, - {"CUDNN_RNN_RELU", {"HIPDNN_RNN_RELU", "", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 0 - {"CUDNN_RNN_TANH", {"HIPDNN_RNN_TANH", "", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 1 - {"CUDNN_LSTM", {"HIPDNN_LSTM", "", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 2 - {"CUDNN_GRU", {"HIPDNN_GRU", "", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 3 - {"cudnnRNNBiasMode_t", {"hipdnnRNNBiasMode_t", "", CONV_TYPE, API_DNN, 1}}, - {"CUDNN_RNN_NO_BIAS", {"HIPDNN_RNN_NO_BIAS", "", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 0 - {"CUDNN_RNN_SINGLE_INP_BIAS", {"HIPDNN_RNN_WITH_BIAS", "", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 1 - {"CUDNN_RNN_DOUBLE_BIAS", {"HIPDNN_RNN_WITH_BIAS", "", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 1 - {"CUDNN_RNN_SINGLE_REC_BIAS", {"HIPDNN_RNN_WITH_BIAS", "", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 1 + {"cudnnRNNMode_t", {"hipdnnRNNMode_t", "miopenRNNMode_t", CONV_TYPE, API_DNN, 1}}, + {"CUDNN_RNN_RELU", {"HIPDNN_RNN_RELU", "miopenRNNRELU", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 0 + {"CUDNN_RNN_TANH", {"HIPDNN_RNN_TANH", "miopenRNNTANH", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 1 + {"CUDNN_LSTM", {"HIPDNN_LSTM", "miopenLSTM", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 2 + {"CUDNN_GRU", {"HIPDNN_GRU", "miopenGRU", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 3 + {"cudnnRNNBiasMode_t", {"hipdnnRNNBiasMode_t", "miopenRNNBiasMode_t", CONV_TYPE, API_DNN, 1}}, + {"CUDNN_RNN_NO_BIAS", {"HIPDNN_RNN_NO_BIAS", "miopenRNNNoBias", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 0 + {"CUDNN_RNN_SINGLE_INP_BIAS", {"HIPDNN_RNN_WITH_BIAS", "miopenRNNwithBias", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 1 + {"CUDNN_RNN_DOUBLE_BIAS", {"HIPDNN_RNN_WITH_BIAS", "miopenRNNwithBias", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 1 + {"CUDNN_RNN_SINGLE_REC_BIAS", {"HIPDNN_RNN_WITH_BIAS", "miopenRNNwithBias", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 1 {"cudnnOpTensorOp_t", {"hipdnnOpTensorOp_t", "miopenTensorOp_t", CONV_TYPE, API_DNN, 1}}, {"CUDNN_OP_TENSOR_ADD", {"HIPDNN_OP_TENSOR_ADD", "miopenTensorOpAdd", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 0 {"CUDNN_OP_TENSOR_MUL", {"HIPDNN_OP_TENSOR_MUL", "miopenTensorOpMul", CONV_NUMERIC_LITERAL, API_DNN, 1}}, // 1 diff --git a/tests/unit_tests/synthetic/libraries/cudnn2miopen.cu b/tests/unit_tests/synthetic/libraries/cudnn2miopen.cu index fbcd3cb1..4e4f3d43 100644 --- a/tests/unit_tests/synthetic/libraries/cudnn2miopen.cu +++ b/tests/unit_tests/synthetic/libraries/cudnn2miopen.cu @@ -108,6 +108,17 @@ int main() { cudnnDataType_t DATA_INT8x4 = CUDNN_DATA_INT8x4; cudnnDataType_t DATA_BFLOAT16 = CUDNN_DATA_BFLOAT16; + // CHECK: miopenRNNMode_t RNNMode; + // CHECK-NEXT: miopenRNNMode_t RNN_RELU = miopenRNNRELU; + // CHECK-NEXT: miopenRNNMode_t RNN_TANH = miopenRNNTANH; + // CHECK-NEXT: miopenRNNMode_t LSTM = miopenLSTM; + // CHECK-NEXT: miopenRNNMode_t GRU = miopenGRU; + cudnnRNNMode_t RNNMode; + cudnnRNNMode_t RNN_RELU = CUDNN_RNN_RELU; + cudnnRNNMode_t RNN_TANH = CUDNN_RNN_TANH; + cudnnRNNMode_t LSTM = CUDNN_LSTM; + cudnnRNNMode_t GRU = CUDNN_GRU; + // CHECK: miopenTensorOp_t tensorOp; // CHECK-NEXT: miopenTensorOp_t OP_TENSOR_ADD = miopenTensorOpAdd; // CHECK-NEXT: miopenTensorOp_t OP_TENSOR_MUL = miopenTensorOpMul; @@ -127,6 +138,29 @@ int main() { cudnnPoolingMode_t poolingMode; cudnnPoolingMode_t POOLING_MAX = CUDNN_POOLING_MAX; + // CHECK: miopenRNNInputMode_t RNNInputMode; + // CHECK-NEXT: miopenRNNInputMode_t LINEAR_INPUT = miopenRNNlinear; + // CHECK-NEXT: miopenRNNInputMode_t SKIP_INPUT = miopenRNNskip; + cudnnRNNInputMode_t RNNInputMode; + cudnnRNNInputMode_t LINEAR_INPUT = CUDNN_LINEAR_INPUT; + cudnnRNNInputMode_t SKIP_INPUT = CUDNN_SKIP_INPUT; + + // CHECK: miopenRNNAlgo_t RNNAlgo; + // CHECK-NEXT: miopenRNNAlgo_t RNN_ALGO_STANDARD = miopenRNNdefault; + cudnnRNNAlgo_t RNNAlgo; + cudnnRNNAlgo_t RNN_ALGO_STANDARD = CUDNN_RNN_ALGO_STANDARD; + + // CHECK: miopenRNNBiasMode_t RNNBiasMode; + // CHECK-NEXT: miopenRNNBiasMode_t RNN_NO_BIAS = miopenRNNNoBias; + // CHECK-NEXT: miopenRNNBiasMode_t RNN_SINGLE_INP_BIAS = miopenRNNwithBias; + // CHECK-NEXT: miopenRNNBiasMode_t RNN_DOUBLE_BIAS = miopenRNNwithBias; + // CHECK-NEXT: miopenRNNBiasMode_t RNN_SINGLE_REC_BIAS = miopenRNNwithBias; + cudnnRNNBiasMode_t RNNBiasMode; + cudnnRNNBiasMode_t RNN_NO_BIAS = CUDNN_RNN_NO_BIAS; + cudnnRNNBiasMode_t RNN_SINGLE_INP_BIAS = CUDNN_RNN_SINGLE_INP_BIAS; + cudnnRNNBiasMode_t RNN_DOUBLE_BIAS = CUDNN_RNN_DOUBLE_BIAS; + cudnnRNNBiasMode_t RNN_SINGLE_REC_BIAS = CUDNN_RNN_SINGLE_REC_BIAS; + // CHECK: miopenLRNMode_t LRNMode; // CHECK-NEXT: miopenLRNMode_t LRN_CROSS_CHANNEL_DIM1 = miopenLRNCrossChannel; cudnnLRNMode_t LRNMode; @@ -285,20 +319,24 @@ int main() { // CHECK-NEXT: miopenTensorDescriptor_t xD; // CHECK-NEXT: miopenTensorDescriptor_t yD; // CHECK-NEXT: miopenTensorDescriptor_t wD; + // CHECK-NEXT: miopenTensorDescriptor_t zD; // CHECK-NEXT: miopenTensorDescriptor_t inputD; // CHECK-NEXT: miopenTensorDescriptor_t dbD; // CHECK-NEXT: miopenTensorDescriptor_t dxD; // CHECK-NEXT: miopenTensorDescriptor_t dyD; + // CHECK-NEXT: miopenTensorDescriptor_t biasD; cudnnTensorDescriptor_t aD; cudnnTensorDescriptor_t bD; cudnnTensorDescriptor_t cD; cudnnTensorDescriptor_t xD; cudnnTensorDescriptor_t yD; cudnnTensorDescriptor_t wD; + cudnnTensorDescriptor_t zD; cudnnTensorDescriptor_t inputD; cudnnTensorDescriptor_t dbD; cudnnTensorDescriptor_t dxD; cudnnTensorDescriptor_t dyD; + cudnnTensorDescriptor_t biasD; void* A = nullptr; void* B = nullptr; void* C = nullptr; @@ -309,9 +347,11 @@ int main() { void* x = nullptr; void* dx = nullptr; void* y = nullptr; + void* z = nullptr; void* dy = nullptr; void* W = nullptr; void* db = nullptr; + void* bias = nullptr; int groupCount = 0; int requestedAlgoCount = 0; int returnedAlgoCount = 0; @@ -549,5 +589,10 @@ int main() { // CHECK: status = miopenSoftmaxBackward_V2(handle, softmaxAlgorithm, softmaxMode, alpha, yD, y, dyD, dy, beta, dxD, dx); status = cudnnSoftmaxBackward(handle, softmaxAlgorithm, softmaxMode, alpha, yD, y, dyD, dy, beta, dxD, dx); + // CUDA: cudnnStatus_t CUDNNWINAPI cudnnConvolutionBiasActivationForward(cudnnHandle_t handle, const void* alpha1, const cudnnTensorDescriptor_t xDesc, const void* x, const cudnnFilterDescriptor_t wDesc, const void* w, const cudnnConvolutionDescriptor_t convDesc, cudnnConvolutionFwdAlgo_t algo, void* workSpace, size_t workSpaceSizeInBytes, const void* alpha2, const cudnnTensorDescriptor_t zDesc, const void* z, const cudnnTensorDescriptor_t biasDesc, const void* bias, const cudnnActivationDescriptor_t activationDesc, const cudnnTensorDescriptor_t yDesc, void* y); + // MIOPEN: MIOPEN_EXPORT miopenStatus_t miopenConvolutionBiasActivationForward(miopenHandle_t handle, const void* alpha1, const miopenTensorDescriptor_t xDesc, const void* x, const miopenTensorDescriptor_t wDesc, const void* w, const miopenConvolutionDescriptor_t convDesc, miopenConvFwdAlgorithm_t algo, void* workspace, size_t workspaceSizeInBytes, const void* alpha2, const miopenTensorDescriptor_t zDesc, const void* z, const miopenTensorDescriptor_t biasDesc, const void* bias, const miopenActivationDescriptor_t activationDesc, const miopenTensorDescriptor_t yDesc, void* y); + // CHECK: status = miopenConvolutionBiasActivationForward(handle, alpha1, xD, x, filterDescriptor, W, convolutionDescriptor, convolutionFwdAlgo, workSpace, workSpaceSizeInBytes, alpha2, zD, z, biasD, bias, activationDescriptor, yD, y); + status = cudnnConvolutionBiasActivationForward(handle, alpha1, xD, x, filterDescriptor, W, convolutionDescriptor, convolutionFwdAlgo, workSpace, workSpaceSizeInBytes, alpha2, zD, z, biasD, bias, activationDescriptor, yD, y); + return 0; }