OpenMP优化无效

时间:2014-10-06 17:13:37

标签: c++ vector parallel-processing openmp

我尝试使用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。两种实现方式的结果相同。即使对于那么大的数据,也没有加速(即使有不同的计划类型)。

1 个答案:

答案 0 :(得分:0)

您使用的算法似乎是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;
}