【问题标题】:OpenMP impact on performanceOpenMP 对性能的影响
【发布时间】:2021-03-09 15:56:12
【问题描述】:

我正在尝试使用 openMP 并行化脚本,但是当我测量它的执行时间(使用 omp_get_thread_num)时,结果很奇怪,

  • 如果我将线程数设置为 2,它的测量值为 4935 us
  • 将其设置为 1 大约需要 1083 我们
  • 并删除每个 openmp 指令将其变为仅 9 us

这是我正在谈论的脚本的一部分(这个循环嵌套在另一个循环中)

for(j=(i-1); j>=0;j--){
   a=0;
   #pragma omp parallel
   {    
       #pragma omp single
       {
           if(arreglo[j]>y){
              arreglo[j+2]=arreglo[j];
            }
             else if(arreglo[j]>x){
                  if(!flag[1]){
                     arreglo[j+2]=y;
                     flag[1]=1;
                   }
                arreglo[j+1]=arreglo[j];
                }
             }
             #pragma omp single
             {
                if(arreglo[j]<=x){
                   arreglo[j+1]=x;
                   flag[0]=1;
                   a=1;
             }
      }
    #pragma omp barrier
    }
    if (a==1){break;}
}

造成这种差异的原因可能是什么?某种瓶颈,还是只是同步的额外成本?

【问题讨论】:

    标签: c multithreading performance parallel-processing openmp


    【解决方案1】:
    1. 我们谈论执行时间非常短,它很容易受到用于基准测试的环境的影响;

    2. 显然使用的输入大小不能证明并行性的开销是合理的。;

    3. 您当前的设计只允许2 线程;没有扩展空间;

    4. 除了使用single 构造函数,您还不如根据线程ID 静态划分这两个代码分支,您将节省 single 构造函数的开销;

    5. 最后一个屏障是多余的,因为 #pragma omp parallel 已经有一个隐式屏障。

    此外,您的代码看起来本质上是顺序的,而在当前设计下,代码显然不适合并行。

    如果我将线程数设置为 2,它的测量值为 4935 我们将其设置为 1 大约需要 1083 us 并且删除每个 openmp 指令会导致 只需 9 我们

    使用2 线程,您需要支付所有同步开销,使用1 线程,您需要支付openMP价格。最后,在没有并行化的情况下,您只需消除所有开销,因此执行时间更短。

    顺便说一句,您不需要删除 OpenMP 指令,只需编译不带 -fopenmp 标志的代码,指令将被忽略。

    【讨论】:

      猜你喜欢
      • 2019-11-11
      • 2013-08-30
      • 2011-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      • 2011-09-12
      • 2020-03-06
      相关资源
      最近更新 更多