diff --git a/onnxruntime/core/providers/dml/DmlExecutionProvider/src/Operators/DmlOperatorFusedMatMul.cpp b/onnxruntime/core/providers/dml/DmlExecutionProvider/src/Operators/DmlOperatorFusedMatMul.cpp index a0c9289a87..77c559d283 100644 --- a/onnxruntime/core/providers/dml/DmlExecutionProvider/src/Operators/DmlOperatorFusedMatMul.cpp +++ b/onnxruntime/core/providers/dml/DmlExecutionProvider/src/Operators/DmlOperatorFusedMatMul.cpp @@ -36,9 +36,9 @@ public: "Two inputs should have same rank and rank >= 3 if transBatchA or transBatchB is true"); } - auto [sizesA, stridesA] = OperatorHelper::GetFusedMatMulSizesAndStrides(inputShape0, transBatchA, transA); + auto [sizesA, stridesA] = OperatorHelper::GetFusedMatMulSizesAndStrides(inputShape0, transBatchA); - auto [sizesB, stridesB] = OperatorHelper::GetFusedMatMulSizesAndStrides(inputShape1, transBatchB, transB); + auto [sizesB, stridesB] = OperatorHelper::GetFusedMatMulSizesAndStrides(inputShape1, transBatchB); OperatorHelper::FusedMatMulShapeMapping(sizesA, stridesA, sizesB, stridesB, outputShape); @@ -67,8 +67,8 @@ public: gemmDesc.BTensor = &inputDescs[1]; gemmDesc.CTensor = nullptr; gemmDesc.OutputTensor = &outputDescs[0]; - gemmDesc.TransA = DML_MATRIX_TRANSFORM_NONE; - gemmDesc.TransB = DML_MATRIX_TRANSFORM_NONE; + gemmDesc.TransA = (transA && inputShape0.size() != 1 ? DML_MATRIX_TRANSFORM_TRANSPOSE : DML_MATRIX_TRANSFORM_NONE); + gemmDesc.TransB = (transB && inputShape1.size() != 1 ? DML_MATRIX_TRANSFORM_TRANSPOSE : DML_MATRIX_TRANSFORM_NONE); gemmDesc.Alpha = alpha; gemmDesc.Beta = 0.0f; gemmDesc.FusedActivation = fusedActivation ? &fusedActivationDmlDesc : nullptr; diff --git a/onnxruntime/core/providers/dml/OperatorAuthorHelper/OperatorHelper.cpp b/onnxruntime/core/providers/dml/OperatorAuthorHelper/OperatorHelper.cpp index 5e5d5f9f27..a54d37a83b 100644 --- a/onnxruntime/core/providers/dml/OperatorAuthorHelper/OperatorHelper.cpp +++ b/onnxruntime/core/providers/dml/OperatorAuthorHelper/OperatorHelper.cpp @@ -606,8 +606,7 @@ namespace OperatorHelper std::pair, std::vector> GetFusedMatMulSizesAndStrides( gsl::span sizes, - int32_t transBatch, - int32_t transpose) + int32_t transBatch) { const uint32_t dimensionCount = gsl::narrow_cast(sizes.size()); std::vector newStrides(dimensionCount); @@ -633,11 +632,6 @@ namespace OperatorHelper std::rotate(newStrides.begin(), newStrides.begin() + 1, newStrides.end() - 1); } - if (transpose && dimensionCount > 1) - { - std::swap(newStrides[dimensionCount - 2], newStrides[dimensionCount - 1]); - std::swap(newSizes[dimensionCount - 2], newSizes[dimensionCount - 1]); - } return std::make_pair(newSizes, newStrides); } diff --git a/onnxruntime/core/providers/dml/OperatorAuthorHelper/OperatorHelper.h b/onnxruntime/core/providers/dml/OperatorAuthorHelper/OperatorHelper.h index aa61ee1dab..323fcc779d 100644 --- a/onnxruntime/core/providers/dml/OperatorAuthorHelper/OperatorHelper.h +++ b/onnxruntime/core/providers/dml/OperatorAuthorHelper/OperatorHelper.h @@ -285,8 +285,7 @@ void FusedMatMulShapeMapping( std::pair, std::vector> GetFusedMatMulSizesAndStrides( gsl::span sizes, - int32_t transBatch = 0, - int32_t transpose = 0); + int32_t transBatch = 0); class GetOutputShapeAsInputShapeHelper {