C OpenMP对性能的影响

C OpenMP对性能的影响,c,multithreading,performance,parallel-processing,openmp,C,Multithreading,Performance,Parallel Processing,Openmp,我试图使用openMP并行化一个脚本,但当我测量它的执行时间(使用omp\u get\u thread\u num)时,结果非常奇怪 如果我将线程数设置为2,它将测量4935 us 将其设置为1大约需要1083美元 删除每个openmp指令只会使其变成9个us 这是我所说的脚本的一部分(这个循环嵌套在另一个循环中) (j=(i-1);j>=0;j--)的{ a=0; #pragma-omp并行 { #布拉格omp单曲 { if(arreglo[j]>y){ arreglo[j+2]=

我试图使用openMP并行化一个脚本,但当我测量它的执行时间(使用
omp\u get\u thread\u num
)时,结果非常奇怪

  • 如果我将线程数设置为2,它将测量4935 us
  • 将其设置为1大约需要1083美元
  • 删除每个openmp指令只会使其变成9个us
这是我所说的脚本的一部分(这个循环嵌套在另一个循环中)

(j=(i-1);j>=0;j--)的
{
a=0;
#pragma-omp并行
{    
#布拉格omp单曲
{
if(arreglo[j]>y){
arreglo[j+2]=arreglo[j];
}
else if(arreglo[j]>x){
如果(!标志[1]){
arreglo[j+2]=y;
标志[1]=1;
}
arreglo[j+1]=arreglo[j];
}
}
#布拉格omp单曲
{
if(arreglo[j]
  • 我们谈论的是一个非常短的执行时间,它很容易受到用于基准测试的环境的影响

  • 很明显,您使用的输入大小不足以证明并行性的开销

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

  • 与其使用
    single
    构造函数,不如根据线程
    ID
    静态划分这两个代码分支,这样可以节省
    single
    构造函数的开销

  • 最后一个屏障是多余的,因为
    #pragma omp parallel
    在其底部已经有一个隐式屏障

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

    如果我将线程数设置为2,那么将其设置为4935 us 1大约需要1083 us,删除每个openmp指令将使 我们只有9个人

    使用
    2
    线程,您将支付所有同步开销;使用
    1
    线程,您将支付使用
    openMP
    的代价。最后,在没有并行化的情况下,您只需删除所有开销,从而降低执行时间

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

    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;}
    }