C++ OpenMP优化

C++ OpenMP优化,c++,vector,parallel-processing,openmp,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

作为初学者,我正在尝试使用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;
}
std::vector函数(std::vector和pair_vector)
{
unsigned int size=pairVector.size();
std::vector resVector(大小);
#pragma-omp并行
{
#pragma omp for
for(无符号整数i=0;i
有人知道这有什么问题吗

谢谢

编辑:


向量中的对数可以超过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;
}
#包括
std::vector函数(std::vector和pair_vector){
无符号int size=pair_vector.size();
std::vector resVector(大小);
标准::向量第一(大小);
标准:向量秒(大小);

对于(int i=0;i它怎么会失败?你能举一个例子说明串行代码和并行代码产生的是什么吗?它们有什么不同?两个代码同时产生。对于并行实现可能会多一点(这似乎是合乎逻辑的)。你的意思是,它们给出的结果相同,但并行版本的速度却没有提高?“两个代码产生的时间相同。并行实现可能会多一些(这似乎是合乎逻辑的)”。让我猜猜,您使用的是
clock()/CLOCKS\u PER_secs
来测量运行时间?或者您将
OMP\u NUM\u THREADS
设置为
1
。或者您忘记了在编译器中启用OpenMP支持。如您所见,在提供更多信息之前,只能推测。@iwillnotexistidnotexist,在并行区域中声明的变量是私有的,并且ose declare EXTER是共享的。OpenMP将自动使
parallel for
子句的迭代器私有化,即使在并行区域之外声明(无论如何,OPs并不在这种情况下)。OPs代码很好,如图所示。