From acb555c4c7ba5a9314d6a4d562d3dfdb16f3816a Mon Sep 17 00:00:00 2001 From: Maxiwell Date: Tue, 19 Apr 2022 19:13:55 -0300 Subject: [PATCH] ppc64le: Optimizing the MlasMaximumPool() to use VSX instructions (#11216) It runs on Power8, Power9, and Power10 --- onnxruntime/core/mlas/lib/pooling.cpp | 36 +++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/onnxruntime/core/mlas/lib/pooling.cpp b/onnxruntime/core/mlas/lib/pooling.cpp index 5655435581..d9ce10481e 100644 --- a/onnxruntime/core/mlas/lib/pooling.cpp +++ b/onnxruntime/core/mlas/lib/pooling.cpp @@ -1538,6 +1538,42 @@ Return Value: c -= 8; } +#elif defined(MLAS_TARGET_POWER) + + while (c >= 32) { + auto MaximumVector0 = vec_splats(std::numeric_limits::lowest()); + auto MaximumVector1 = vec_splats(std::numeric_limits::lowest()); + + for (size_t k = 0; k < KernelSize; k++) { + auto InputVector0 = vec_xl(0, &Input[k][ChannelOffset]); + auto InputVector1 = vec_xl(16, &Input[k][ChannelOffset]); + + MaximumVector0 = vec_max(MaximumVector0, InputVector0); + MaximumVector1 = vec_max(MaximumVector1, InputVector1); + } + + vec_xst(MaximumVector0, 0, (T8Bits *) Output); + vec_xst(MaximumVector1, 16, (T8Bits *) Output); + + Output += 32; + ChannelOffset += 32; + c -= 32; + } + + while (c >= 16) { + auto MaximumVector = vec_splats(std::numeric_limits::lowest()); + + for (size_t k = 0; k < KernelSize; k++) { + auto InputVector = vec_xl(0, &Input[k][ChannelOffset]); + MaximumVector = vec_max(MaximumVector, InputVector); + } + vec_xst(MaximumVector, 0, (T8Bits *) Output); + + Output += 16; + ChannelOffset += 16; + c -= 16; + } + #endif while (c > 0) {