如何使用openMP将顺序程序转换为并行?

2 c c++ parallel-processing multithreading openmp

我在openMP中开始,我希望并行化这部分代码:

for (i=0 ;i<n ;i++) 
  for (j=1 ;j<n ;j++)  
    A[i][j]+=A[i][j-1];
Run Code Online (Sandbox Code Playgroud)

我该怎么做这个for并行?

jep*_*pio 5

我建议您先查看以下链接:http://bisqwit.iki.fi/story/howto/openmp/.它简要概述了使用OpenMP可以实现的目标.

对于您的代码片段,并行化可以像编写一个pragma一样简单:

#pragma omp parallel for private(i, j) shared(A, n)
for (i = 0; i < n; ++i) 
  for (j = 1; j < n; ++j)  
    A[i][j] += A[i][j-1];
Run Code Online (Sandbox Code Playgroud)

这就是OMP背后的想法:您使用消息注释您的程序,允许代码编译并与OMP链接然后并行运行,或编译忽略编译指示,在这种情况下程序应保持有效的顺序程序.

在这种情况下,pragma决定运行到运行时的线程数.运行时通常根据计算机中的核心数量做出决策.外部循环将被并行化,并且每次i迭代将在概念上由不同的线程执行.这很重要,因为您在各种j迭代之间存在数据依赖关系,并行通信/同步很棘手.将内循环保持在线程中可以解决此问题.shared可以省略该部分,因为默认情况下共享内容.但是出于这个原因,你不应该把它排除在外:明确你想要分享的内容以及你想要私密的东西.这是避免编写并行代码时发生的许多错误的好方法.