From 236e1062b290e2d2345f1d1c319e78f15e0a311d Mon Sep 17 00:00:00 2001 From: zhaohongbo Date: Fri, 7 Jun 2024 15:06:10 +0800 Subject: [PATCH] [CPU] Optimize the unique operator (#24850) ### Details: - *Optimize unique using HashMap when sorted=false* - *...* ### Tickets: - *ticket-id* --- src/plugins/intel_cpu/src/nodes/unique.cpp | 40 ++++++++-------------- 1 file changed, 15 insertions(+), 25 deletions(-) diff --git a/src/plugins/intel_cpu/src/nodes/unique.cpp b/src/plugins/intel_cpu/src/nodes/unique.cpp index ad322756ab2..130213dfcb8 100644 --- a/src/plugins/intel_cpu/src/nodes/unique.cpp +++ b/src/plugins/intel_cpu/src/nodes/unique.cpp @@ -225,41 +225,31 @@ void Unique::flattenTensorExec() { } } } else { - uniDataTmpPtr[0] = srcDataPtr[0]; - if (definedOutputs[FIRST_UNIQUE_IDX]) { - firstTmpPtr[0] = 0; - } - if (definedOutputs[INPUT_TO_UNIQ_IDX]) { - inToOutTmpPtr[0] = 0; - } + std::unordered_map uniq; + uniq.reserve(inputLen); + if (definedOutputs[OCCURRENCES_NUM]) { std::fill(occurTmpPtr, occurTmpPtr + inputLen, 1); } - uniqueLen = 1; - for (size_t i = 1; i < inputLen; i++) { - bool found = false; - size_t j = 0; - for (; j < uniqueLen; j++) { - if (uniDataTmpPtr[j] == srcDataPtr[i]) { - found = true; - break; - } - } - if (!found) { - uniDataTmpPtr[uniqueLen] = srcDataPtr[i]; + for (size_t i = 0, j = 0; i < inputLen; ++i) { + auto it = uniq.emplace(srcDataPtr[i], j); + inToOutTmpPtr[i] = it.first->second; + if (it.second) { if (definedOutputs[FIRST_UNIQUE_IDX]) { - firstTmpPtr[uniqueLen] = i; + firstTmpPtr[j] = i; } - uniqueLen++; + ++j; } else { if (definedOutputs[OCCURRENCES_NUM]) { - occurTmpPtr[j]++; + occurTmpPtr[inToOutTmpPtr[i]]++; } } - if (definedOutputs[INPUT_TO_UNIQ_IDX]) { - inToOutTmpPtr[i] = j; - } + } + + uniqueLen = static_cast(uniq.size()); + for (const auto& it : uniq) { + uniDataTmpPtr[it.second] = it.first; } }