如何将 OpenMP 用于我的代码

how can i use openMP for my code?

本文关键字:我的 代码 用于 OpenMP      更新时间:2023-10-16

我从openMP开始,我想并行化这部分代码

int A[n][m+1];
int B[k][m];
for (h=0;h<100;h++){
    for (i=0;i<n;i++){p=0;
        for (j=0;j<k;j++){s=0;
            for (l=0;l<m;l++){
                 s+=(A[i][l]-B[j][l]);
             }
          s=sqrt(s);    
          if (j==0) min =s;
           else
            if (min > s){min =s;p=j;}              
       }
    A[i][m]=p;
    }
}

这是我使用 openMP 并行化的尝试

#pragma omp parallel for private(s)
 for (h=0;h<100;h++){
    for (i=0;i<n;i++){p=0;
        for (j=0;j<k;j++){s=0;
            for (l=0;l<m;l++){
                 s+=(A[i][l]-B[j][l]);
             }
          s=sqrt(s);    
          if (j==0) min =s;
           else
            if (min > s){min =s;p=j;}              
       }
    A[i][m]=p;
    }
}

我怎样才能正确地做到这一点?我需要你的帮助。

您现在缺少几个方面:

私有变量与

共享变量:不得让多个线程使用与循环计数器或任何其他类型的辅助变量相同的变量。如果一个线程修改了另一个线程的循环计数器,那么混乱就会随之而来。解决方案:指定哪些变量是共享的,哪些是私有的:

#pragma omp parallel for private(s, min, h, i, j, l) shared(n, k, m)
归约

:您正在对变量"min"执行归约操作。从 OpenMP 3.1 和 gcc 4.7 开始,您可以让 OpenMP 为您处理此缩减 (*):

#pragma omp parallel for reduction(min : min) private(s, h, i, j, l) shared(n, k, m)
// here the rest of your code

操作min(最小值)和min变量的名称都掩盖了此特定语法段。现在我不确定你是否真的需要更改变量的名称——我假设你不需要——但这仍然是一个好主意。此外,正如您在评论中已经被告知的那样,尽量避免使用字母"l"作为变量名称,因为它看起来像数字 1。

(*) 在早期版本的 OpenMP 中,在 C 语言中,您没有最小/最大缩减,因此您必须在每个线程的私有变量中存储一个临时值min,然后在循环后、关键部分内或使用原子操作查找全局最小值。

相关文章: