C++ OpenMp中的应用程序速度低于串行代码c++;

C++ OpenMp中的应用程序速度低于串行代码c++;,c++,performance,openmp,C++,Performance,Openmp,我正在努力完成OpenMp任务 unsigned long index; for (unsigned int par1 = 0; par1 < limit; par1++) { for (unsigned int par2 = 0; par2 < par1; par2++) { index = getDistance(par1, par2) / param; if (index < size) { hist[i

我正在努力完成OpenMp任务

unsigned long index;
for (unsigned int par1 = 0; par1 < limit; par1++) {
    for (unsigned int par2 = 0; par2 < par1; par2++) {
        index = getDistance(par1, par2) / param;
        if (index < size) {
            hist[index]++;
        }
    }
}
我必须优化一些方法的计算-其中包括直方图

我花了3天时间,尝试了大约50种不同的方法,但仍然 我的代码比串行执行慢

有人能告诉我我做错了什么吗? 你有什么线索可以解决这个问题吗?

以下是需要优化的代码: (par1通常小于10000,下面发布的代码放在某个方法中,在测试过程中调用大约100次)

无符号长索引;
for(无符号整数par1=0;par1

问题是每次迭代需要进行的计算量是可变的 -迭代计数器增长时,运算量急剧增长

我知道减价可能是最好的办法,但我不知道怎么做 将其应用于此数组

这是我的一次尝试,但它比串行执行慢(我将两个循环合并为一个):

signed long max=elements*elements;
int par1=0;
int par2=0;
无符号长索引;
#pragma omp并行用于firstprivate(par1、par2、索引、最大值、大小)共享(直方图)
用于(无符号长x=0;xpar2)
{
索引=getDistance(par1,par2)/param;
如果(索引<大小)
{
#布拉格omp原子
直方图[指数]+;
}
}
}

欢迎使用StackOverflow可能重复。请阅读。不幸的是,由于种种原因,这是一个糟糕的问题。要找到我指出的那个复制品真的很容易。你应该提供一个更具体的标题。如果关注的是特定的性能问题,请提供一个、您的特定性能观察/异常和详细的系统规范。
直方图[index]++
是序列化的,所有线程都将努力读取和写入该位置。这将您的收益限制在
索引>=size
的频率上,这很可能被并行化开销消耗掉。复制(通过@Zulan链接)有一个可行的解决方案。

  signed long max = elements * elements;
  int par1 = 0;
  int par2 = 0;
  unsigned long index;

  #pragma omp parallel for firstprivate(par1, par2, index, max, size) shared(histogram)
  for (unsigned long x = 0; x < max; x++) 
  {
        par1 = x / elements;
        par2 = x % elements;
        if(par1 > par2)
        {
          index = getDistance(par1, par2) / param;
          if (index < size) 
          {
              #pragma omp atomic
              histogram[index]++;   
          }
        }
  }