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

时间:2015-01-13 21:25:45

标签: c++ c multithreading parallel-processing openmp

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

for (i=0 ;i<n ;i++) 
  for (j=1 ;j<n ;j++)  
    A[i][j]+=A[i][j-1];

如何使for并行?

1 个答案:

答案 0 :(得分: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];

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

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