【发布时间】:2020-01-31 19:50:53
【问题描述】:
基本上,我有一个集合 std::vector<std::pair<std::vector<float>, unsigned int>>,其中包含大小为 512 (2048 bytes) 的模板对 std::vector<float> 及其对应的标识符 unsigned int。
我正在编写一个函数,其中为我提供了一个模板,我需要返回集合中最相似模板的标识符。我正在使用点积来计算相似度。
我的幼稚实现如下所示:
// Should return false if no match is found (ie. similarity is 0 for all templates in collection)
bool identify(const float* data, unsigned int length, unsigned int& label, float& similarity) {
bool found = false;
similarity = 0.f;
for (size_t i = 0; i < collection.size(); ++i) {
const float* candidateTemplate = collection[i].first.data();
float consinSimilarity = getSimilarity(data, candidateTemplate, length); // computes cosin sim between two vectors, implementation depends on architecture.
if (consinSimilarity > similarity) {
found = true;
similarity = consinSimilarity;
label = collection[i].second;
}
}
return found;
}
如何使用并行化来加快速度。我的收藏可能包含数百万个模板。我读到您可以添加#pragma omp parallel for reduction,但我不完全确定如何使用它(如果这甚至是最好的选择)。
另请注意: 对于我的点产品实现,如果基础架构支持 AVX 和 FMA,我将使用 this 实现。 由于只有有限数量的 SIMD 寄存器,这会在我们并行化时影响性能吗?
【问题讨论】:
标签: c++ multithreading optimization openmp nearest-neighbor