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

C++ 如何使用openMP将顺序程序转换为并行程序?,c++,c,multithreading,parallel-processing,openmp,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]; 对于(i=0;i我建议您首先查看以下链接:。 它简要概述了使用OpenMP可以实现的功能 对于您的代码片段,并行化可以像编写一个pragma一样简单: #pragma omp parallel for private(i, j) shared(A, n) for (i = 0; i < n; +

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

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

对于(i=0;i我建议您首先查看以下链接:。
它简要概述了使用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];
私有(i,j)共享(A,n)的pragma omp并行 对于(i=0;i
这就是OMP背后的思想:用消息注释程序,这些消息允许编译代码并与OMP链接,然后并行运行,或者忽略pragmas进行编译,在这种情况下,程序应保持有效的顺序程序


在这种情况下,
pragma
将决定运行时要运行多少线程。运行时通常根据机器中的内核数量做出决定。外部循环将被并行化,每个
i
迭代在概念上将由不同的线程执行。这一点很重要,因为各种
j
迭代之间的数据依赖关系以及并行通信/同步是很棘手的。将内部循环保持在一个线程内可解决此问题。
共享的
部分可能会被忽略,因为默认情况下是共享的。但正是出于这个原因,不应该将其忽略:be exp关于您想要共享的内容和您想要私有的内容是合法的。这是避免编写并行代码时出现许多错误的好方法。

非常感谢您的回答,但我想知道我是否可以编写
#pragma omp parallel for private(j)shared(a,n,i)
?关于你的答案,我们假设我有4个线程,每个线程都有
(i=0;i
(j=0;j
iteration?我希望你的帮助,谢谢。你不能写shared
i
,因为不同的线程会试图同时将它们的迭代索引存储在同一个内存位置,数据可能会被破坏。实际上,我不知道omp是否会忽略
shared(i)
用于最外层循环索引变量,并将其设置为私有。每个线程将获得最外层循环的一部分(因此一些
i
值)并使用它执行所有
j
迭代。因此,总的来说,执行的工作量与不使用omp时相同,但最外层循环是并行执行的。