嵌套循环 OpenMP 并行化、私有索引还是公共索引?
Nested loop OpenMP Parallellizing, private or public index?
>想象一下,在一个并行区域中有一个嵌套循环,如下所示:
#pragma omp parallel
{
for (int i = 0, ...) {
for (int j = 0, ...) { }}}
或
#pragma omp parallel
{
for (int i = 0, ...) {
for (int j = i, ...) { }}}
如果我们使用 #pragma omp,i 索引会自动变为私有。但。。。 我们需要将 j 索引设置为私有还是公共?效果如何?
#pragma omp parallel
{
#pragma omp for shared(j)
for (int i = 0, ...) {
for (int j = 0, ...) { }}}
或
#pragma omp parallel
{
#pragma omp for private(j)
for (int i = 0, ...) {
for (int j = 0, ...) { }}}
提前感谢!
在并行区域内声明的所有内容都自动是私有的。这(大概(是你想要的行为:i
的每次迭代都应该遍历所有j
,j
循环都是独立的(因此是私有的,而不是公共的(。但是,您实际上缺少重要的parallel
部分:如果您不写
#pragma omp parallel for
但只有
#pragma omp for
那么你不会并行发生任何事情(除非你首先在封闭范围内创建了一个并行区域#pragma omp parallel
(!
私有 j不起作用,因为 j 默认是私有的(因为它的作用域在 i for 循环中,所以当创建新线程时,j 特定于该线程
#pragma omp parallel for private(j)
for (int i = 0, ...) {
for (int j = 0, ...) { }}
如果你使用shared j
它应该没有如上所述的效果,因为j的作用域是i的每个实例的局部,如果你将j的范围扩展到全局,你会遇到种族编码
相关文章:
- 数组索引的值没有增加
- OpenMP阵列性能较差
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 查找最接近的大于当前数字的数字的索引
- 在C++中调整向量中的索引
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 重载元组索引运算符-C++
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 为std::string的某个索引赋值
- 并行用于C++17中数组索引范围内的循环
- OpenMP:并行更新数组总是需要减少数组吗
- 跟随整数索引列表的自定义类迭代器
- 如何在for循环中包含两个索引值的测试条件
- D3D11-将混合权重和索引传递到顶点着色器
- 嵌套循环 OpenMP 并行化、私有索引还是公共索引?
- 嵌套循环中的 OpenMP 数组索引
- OpenMP嵌套循环索引依赖项
- OpenMP循环中的索引是否按升序处理
- OpenMP - OpenMP 语句中的索引变量'for'必须具有有符号整型