From 30b9d2ba13019471a56412970468a4d4822d3ada Mon Sep 17 00:00:00 2001 From: Vladimir Paramuzov Date: Thu, 6 May 2021 11:33:14 +0300 Subject: [PATCH] [IE CLDNN] Disabled vectorized ocl path for modes with bool output (#5521) --- .../eltwise/eltwise_kernel_b_fs_yx_fsv16.cpp | 3 ++ .../eltwise/eltwise_kernel_base.cpp | 28 +++++++++++++++++++ .../eltwise/eltwise_kernel_base.h | 2 ++ .../eltwise/eltwise_kernel_fs_b_yx_fsv32.cpp | 3 ++ .../eltwise/eltwise_kernel_vload8.cpp | 3 ++ .../tests/test_cases/eltwise_gpu_test.cpp | 4 +++ 6 files changed, 43 insertions(+) diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/eltwise/eltwise_kernel_b_fs_yx_fsv16.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/eltwise/eltwise_kernel_b_fs_yx_fsv16.cpp index 5ed8df0fcd2..afaa202ffe0 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/eltwise/eltwise_kernel_b_fs_yx_fsv16.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/eltwise/eltwise_kernel_b_fs_yx_fsv16.cpp @@ -246,6 +246,9 @@ bool EltwiseKernel_b_fs_yx_fsv16::Validate(const Params& p, const optional_param if (count % 8 != 0) return false; + if (IsUnsupportedModeForVecCode(params)) + return false; + for (size_t i = 0; i < params.inputs.size(); i++) { if ((params.inputs[i].GetLayout() != DataLayout::b_fs_yx_fsv16) && (params.inputs[i].GetLayout() != DataLayout::b_fs_zyx_fsv16) && diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/eltwise/eltwise_kernel_base.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/eltwise/eltwise_kernel_base.cpp index abf22356be8..6a40df57a68 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/eltwise/eltwise_kernel_base.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/eltwise/eltwise_kernel_base.cpp @@ -108,6 +108,34 @@ bool EltwiseKernelBase::Validate(const Params& p, const optional_params& o) cons return true; } +bool EltwiseKernelBase::IsUnsupportedModeForVecCode(const eltwise_params& params) const { + // These modes are supposed to produce BOOL output type + // but this kernel uses vector data types, and these operation will produce 0xFFFF / 0x0000 instead of 0 / 1 values + // The value might be then converted to fp16/fp32 and used for some arithmetic, which will lead to invalid results, thus reject these modes + // to fallback on ref kernel with scalar types. + // TODO: Consider updating optimized kernels to produce 0/1 output for vector code if such operation is a bottleneck in some model + const std::vector unsupported_modes = { + EltwiseMode::EQ, + EltwiseMode::NE, + EltwiseMode::LT, + EltwiseMode::LE, + EltwiseMode::GT, + EltwiseMode::GE, + EltwiseMode::LOGIC_AND, + EltwiseMode::LOGIC_OR, + EltwiseMode::LOGIC_XOR, + EltwiseMode::FLOOR_MOD, + }; + + for (size_t op_num = 0; op_num < params.operations.size(); op_num++) { + const auto& ew = params.operations[op_num]; + if (std::find(unsupported_modes.begin(), unsupported_modes.end(), ew.mode) != unsupported_modes.end()) + return true; + } + + return false; +} + JitConstants EltwiseKernelBase::GetOperationsJitConstants(const eltwise_params& params, bool useVload8, size_t blockSize) const { JitConstants jit = {}; for (size_t op_num = 0; op_num < params.operations.size(); op_num++) { diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/eltwise/eltwise_kernel_base.h b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/eltwise/eltwise_kernel_base.h index 4a340048f25..ee24f5c3bca 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/eltwise/eltwise_kernel_base.h +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/eltwise/eltwise_kernel_base.h @@ -119,5 +119,7 @@ protected: virtual DispatchData SetDefault(const eltwise_params& params) const; KernelsData GetCommonKernelsData(const Params& params, const optional_params& options) const; Datatype GetAccumulatorType(const eltwise_params ¶ms) const; + + bool IsUnsupportedModeForVecCode(const eltwise_params& params) const; }; } // namespace kernel_selector diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/eltwise/eltwise_kernel_fs_b_yx_fsv32.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/eltwise/eltwise_kernel_fs_b_yx_fsv32.cpp index 4e8657a06a1..f8b43ea01a9 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/eltwise/eltwise_kernel_fs_b_yx_fsv32.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/eltwise/eltwise_kernel_fs_b_yx_fsv32.cpp @@ -58,6 +58,9 @@ bool EltwiseKernel_fs_b_yx_fsv32::Validate(const Params& params, const optional_ } } + if (IsUnsupportedModeForVecCode(ewParams)) + return false; + if (!bCheckSizes || !bSupportedCount || !bCheckUpdateInput || !bCheckUseOutput) { return false; } diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/eltwise/eltwise_kernel_vload8.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/eltwise/eltwise_kernel_vload8.cpp index 8b9925bbf19..8ee06f60a54 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/eltwise/eltwise_kernel_vload8.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/eltwise/eltwise_kernel_vload8.cpp @@ -73,6 +73,9 @@ bool EltwiseKernel_vload8::Validate(const Params& params, const optional_params& } } + if (IsUnsupportedModeForVecCode(ewParams)) + return false; + if (!bCheckSizes || !bSupportedCount || !bCheckUpdateInput || !bCheckUseOutput) { return false; } diff --git a/inference-engine/thirdparty/clDNN/tests/test_cases/eltwise_gpu_test.cpp b/inference-engine/thirdparty/clDNN/tests/test_cases/eltwise_gpu_test.cpp index eb70de8ef5f..436d2a2a359 100644 --- a/inference-engine/thirdparty/clDNN/tests/test_cases/eltwise_gpu_test.cpp +++ b/inference-engine/thirdparty/clDNN/tests/test_cases/eltwise_gpu_test.cpp @@ -41,6 +41,8 @@ T eltwise_execute(cldnn::eltwise_mode mode, T x, T y) { return std::pow((float)x, (float)y); case eltwise_mode::mod: return std::fmod((float)x, (float)y); + case eltwise_mode::eq: + return (float)((float)x == (float)y); default: return (T)0; } @@ -3540,6 +3542,7 @@ struct eltwise_layout_test_params { #define CASE_ELTWISE_TEST6 eltwise_mode::sum, {4, 1, 4, 4}, {1, 5, 1, 1}, format::bfyx, format::b_fs_yx_fsv16, "generic_eltwise_ref" #define CASE_ELTWISE_TEST7 eltwise_mode::sum, {4, 5, 4, 1}, {4, 1, 4, 1}, format::bfyx, format::b_fs_yx_fsv16, "generic_eltwise_ref" #define CASE_ELTWISE_TEST8 eltwise_mode::sum, {4, 2, 4, 4}, {1, 1, 1, 1}, format::bfyx, format::b_fs_yx_fsv16, "generic_eltwise_ref" +#define CASE_ELTWISE_TEST9 eltwise_mode::eq, {4, 2, 4, 4}, {1, 1, 1, 1}, format::b_fs_yx_fsv16, format::bfyx, "generic_eltwise_ref" class eltwise_layout_test : public BaseEltwiseTest { }; @@ -3619,4 +3622,5 @@ INSTANTIATE_TEST_CASE_P(eltwise, eltwise_test_mixed_layout, eltwise_layout_test_params{CASE_ELTWISE_TEST6}, eltwise_layout_test_params{CASE_ELTWISE_TEST7}, eltwise_layout_test_params{CASE_ELTWISE_TEST8}, + eltwise_layout_test_params{CASE_ELTWISE_TEST9}, }), );