c++ - 如何使用 openMP 并行化内部循环?

标签 c++ openmp xeon-phi

也许我的问题的解决方案非常明显。我想使用 openMP 加速以下代码(进入英特尔至强融核),但我做不到。

int c=0, d=0, e=0, i;
#pragma opm parallel for private(c, d, e)
for(i=0; i < columns; i++)
{
  if((left_side[rule*columns + i] > 0) || (right_side[rule*columns + i] > 0))
  {
    for(c=0; c < rows; c++)
    {
      if(left_side[i + c * columns] > 0)
      {
        if(flag[c] == 0)
        {
          r_prob[c] = c_vect[c];
          flag[c] = 1;
          for(d=0; d < columns; d++)
          {
            switch(left_side[c * columns + d])
            {
              case 0:
                break;
              case 1:
                r_prob[c] *= M_in[d] * 1.0;
                break;
              case 2:
                r_prob[c] *= (M_in[d] * (M_in[d] - 1)) * .5;
                break;
              default:
                for(e=1; e <= left_side[c * columns + d]; e++)
                  r_prob[c] *= M_in[d] * 1.0 / (e * 1.0);
                break;
            }
          }
        }
      }
    }
  }
}
//where r_prob, M_in, left_side, right_side, c_vect and flag are array that are in input.

这段代码没有正确运行,r_prob 中的值是错误的。 我如何并行化此代码?

最佳答案

你的代码有一个错误,因为第一个FOR创建了多个线程,并将这些同时写入数组r_prob,flag。解决方案可能是:

int c=0, d=0, e=0, i;
#pragma opm parallel for private(c, d, e)
 for(i=0; i < columns; i++)
 {

 if((left_side[rule*columns + i] > 0) || (right_side[rule*columns + i] > 0))
 {
  for(c=0; c < rows; c++)
  {
  if(left_side[i + c * columns] > 0)
  {
    if(flag[c] == 0)
    {
       #pragma omp critical //Only one thread at a time can enter 
      { 
      r_prob[c] = c_vect[c];
      flag[c] = 1;
      }

      for(d=0; d < columns; d++)
      {
        switch(left_side[c * columns + d])
        {
          case 0:
            break;
          case 1:
             #pragma omp critical //Only one thread at a time can enter 
             { 
            r_prob[c] *= M_in[d] * 1.0;
              }
            break;
          case 2:
             #pragma omp critical //Only one thread at a time can enter 
             { 
            r_prob[c] *= (M_in[d] * (M_in[d] - 1)) * .5;
             }
            break;
          default:
            for(e=1; e <= left_side[c * columns + d]; e++)
               #pragma omp critical //Only one thread at a time can enter 
               {
              r_prob[c] *= M_in[d] * 1.0 / (e * 1.0);
              }
            break;
           }
          }
       }
     }
   }
 }
}//where r_prob, M_in, left_side, right_side, c_vect and flag are array that are in input.

关于c++ - 如何使用 openMP 并行化内部循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35434121/

相关文章:

c++ - 什么时候可以将结构安全地散列为字节数组?

opencl - 适用于 Xeon Phi 的最新 OpenCL 驱动程序

c - 至强融核 : slower performance with padding

c - 使用 OpenMP SECTIONS 指令时私有(private)变量打印为垃圾值

python - 使用 Intel Python 2019 和 Xeon Phi (KNC) 自动卸载

c++ - JsonCpp 不能防止 uint64 溢出并且有奇怪的行为

c++ - STL 堆栈和 priority_queue 的插入器

c++ - 我可以将 2.3 版中的 NetOpt 内容与预先训练的模型一起使用吗?

c++ - OpenMP 动态与引导式调度

c++ - openmp 被 visual studio c++ 优化破坏