gpt4 book ai didi

c++ - 我需要帮助来理解这个 openMP 示例

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:19:44 24 4
gpt4 key购买 nike

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

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

我找到了这个答案:

#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 是私有(private)的而不是共享的?
  • 关于这个答案,如果我有 4 个线程,所以每个线程执行相同的代码,我不明白如何才能获得与顺序代码相同的结果?

线程是如何完成这项工作的?我需要你的帮助。

最佳答案

why is i private and not shared?

变量ij 是每个线程私有(private)的,因为它们是循环计数器。每个线程都必须跟踪它正在做什么,与其他线程分开。如果 ij 在线程之间共享,那么每个线程都会更新它们并干扰其他线程的执行。

if i have 4 threads so each thread executes the same code, I don't understand how can I obtain a same result as sequential code ?

每个线程执行相同的代码行,但使用不同的变量。 OpenMP 的“for”指令有助于在线程之间自动分配迭代,以便每个线程在 for 循环中获得不同的 i 起始值和不同的结束值。所以它更像是每个线程在循环内部获得相同的代码,但循环初始化和结束条件不同。所有这些一起(如果编程正确)将产生与顺序实现相同的最终结果。

当然,要实现这一点,循环必须是可并行的。如果循环的每次迭代都依赖于之前迭代计算的结果,那么它就不能并行运行。在这种情况下,您需要重写循环,以便每次迭代都可以独立运行。

关于c++ - 我需要帮助来理解这个 openMP 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28145951/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com