OpenMP优化不起作用

Inoperative OpenMP optimisation

本文关键字:不起作用 优化 OpenMP      更新时间:2023-10-16

作为一名初学者,我正在尝试使用OpenMP优化贪婪函数。

不幸的是,我尝试了好几次都没有成功。我只是在搜索向量中每对的第一个元素,它作为同一向量中第二个元素出现的索引(唯一)。这是我的代码:

std::vector<int> function(std::vector<std::pair<int, int> >& pair_vector)
{
    unsigned int size = pairVector.size();
    std::vector<int> resVector(size);
    #pragma omp parallel
    {
        #pragma omp for
        for(unsigned int i = 0; i < size; ++i)
        {
            resVector[i] = -pairVector[i].first;
            for (unsigned int j = i; j < size; ++j)
            {
                if(pairVector[i].first == pairVector[j].second)
                {
                    resVector[i] = size - j; 
                    break;                                          
                }
            }                                                   
        }
    }
    return resVector;
}

有人看到这是怎么回事吗??

谢谢。

编辑:

矢量中的对数可以超过1.000.000。两种实现的结果是相同的。即使是这样大的数据,也没有速度(即使是不同的时间表类型)。

您使用的算法看起来是O(N^2),但在O(NlogN)中应该是可能的。即使O(NlogN)解决方案是串行的,它仍然应该提供净加速。

以下是您的问题的O(NlogN)解决方案。可以通过更好地使用STL来收紧代码。

#include <algorithm>
std::vector<int> function(std::vector<std::pair<int, int> >& pair_vector) {
    unsigned int size = pair_vector.size();
    std::vector<int> resVector(size);
    std::vector<std::pair<int, int> > firsts(size);
    std::vector<std::pair<int, int> > seconds(size);
    for (int i=0; i<size; i++) {
        firsts[i] = std::pair<int, int>(pair_vector[i].first, i);
        seconds[i] = std::pair<int, int>(pair_vector[i].second, size-i);
    }
    std::sort(firsts.begin(), firsts.end());
    std::sort(seconds.begin(), seconds.end());
    int j=0;
    for (int i=0; i<size; i++) {
      while ((seconds[j].first < firsts[i].first)&&(j<size))
        j++;
      if (seconds[j].first == firsts[i].first)
        resVector[firsts[i].second] = seconds[j].second;
      else
        resVector[firsts[i].second] = -firsts[i].first;
    }
    return resVector;
}