gpt4 book ai didi

c++ - 我如何理解我在 openMP 中的代码?

转载 作者:行者123 更新时间:2023-11-28 06:28:19 25 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 个线程,那么每个线程都有 (i = 0; i < n;++i) 和 (j = 0; j < n;++j) 迭代?我需要你的帮助。

最佳答案

1)i是私有(private)的,因为每个线程都需要分别从0迭代到n;否则,如果使 i 共享,当您的线程一起迭代一个从 0n 的循环时。

2) 是的,在这段代码中,每个线程都有自己的 ij 变量拷贝,这就是它们将单独运行的原因。

3) 在这个例子中我不确定,但我可以说你必须避免数据依赖,因为它会导致代码并行工作时出现问题:处理器(或workers) 必须只做一项工作而不依赖于另一个 worker 的状态或结果以带来更高的效率。参见 SIMD并尝试找到一些向量化信息。简而言之,矢量化是一种有助于并行化代码的技术,因为它实现了 SIMD 范例。在 Intel Sandy Bridge 等现代 cpu 和使用此技术的旧架构上,您可以通过使用 AVX/AVX2 扩展来大大加快并行计算速度。

关于c++ - 我如何理解我在 openMP 中的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28135263/

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