From ebda23be1666a51272e38def10944aa7464d10f5 Mon Sep 17 00:00:00 2001 From: Patrice Vignola Date: Fri, 27 Sep 2024 16:24:37 -0700 Subject: [PATCH] [DML EP] Fix Clip clamping (#22251) ### Description ### Motivation and Context --- .../src/Operators/DmlOperatorElementWise.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/onnxruntime/core/providers/dml/DmlExecutionProvider/src/Operators/DmlOperatorElementWise.cpp b/onnxruntime/core/providers/dml/DmlExecutionProvider/src/Operators/DmlOperatorElementWise.cpp index 412207fd3c..d4d7ee1311 100644 --- a/onnxruntime/core/providers/dml/DmlExecutionProvider/src/Operators/DmlOperatorElementWise.cpp +++ b/onnxruntime/core/providers/dml/DmlExecutionProvider/src/Operators/DmlOperatorElementWise.cpp @@ -451,8 +451,19 @@ public: // logic for some corner test case // Same applies to min and max value. opDesc.MinMaxDataType = this->m_inputTensorDescs[0].GetDmlDataType(); - CastToClampedScalarUnion(opDesc.MinMaxDataType, -DBL_MAX, /*out*/&opDesc.Min); - CastToClampedScalarUnion(opDesc.MinMaxDataType, DBL_MAX, /*out*/&opDesc.Max); + + if (opDesc.MinMaxDataType == DML_TENSOR_DATA_TYPE_FLOAT16 || opDesc.MinMaxDataType == DML_TENSOR_DATA_TYPE_FLOAT32 || opDesc.MinMaxDataType == DML_TENSOR_DATA_TYPE_FLOAT64) + { + CastToClampedScalarUnion(opDesc.MinMaxDataType, -DBL_MAX, /*out*/&opDesc.Min); + CastToClampedScalarUnion(opDesc.MinMaxDataType, DBL_MAX, /*out*/&opDesc.Max); + } + else + { + // It's not safe to use DBL_MAX for non-float datatypes because not all integer can be represented in the range. + // For example, static_cast(static_cast(INT64_MAX)) will yield a negative number. + CastToClampedScalarUnion(opDesc.MinMaxDataType, -INT64_MAX, /*out*/&opDesc.Min); + CastToClampedScalarUnion(opDesc.MinMaxDataType, UINT64_MAX, /*out*/&opDesc.Max); + } if (kernelInfo.IsInputValid(1)) {