gpt4 book ai didi

c++ - pragma omp 与 for 循环并行的行为

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

我似乎不完全理解带有嵌套 for 循环的 openmp 并行构造的行为。考虑以下代码:

std::size_t idx;
std::size_t idx2;
omp_set_num_threads( 2 );

#pragma omp parallel default(shared) private(idx, idx2)
{

for(std::size_t idx=0;idx<3;idx++)
{
for(std::size_t idx2=0;idx2<4;idx2++)
{
LOG("From thread "+std::to_string(omp_get_thread_num())+" idx "+std::to_string(idx)+" idx2 "+std::to_string(idx2));
}
}
}

这会产生以下输出:

From thread 0 idx 0 idx2 0
From thread 1 idx 0 idx2 0
From thread 0 idx 0 idx2 1
From thread 1 idx 0 idx2 1
From thread 0 idx 0 idx2 2
From thread 1 idx 0 idx2 2
From thread 0 idx 0 idx2 3
From thread 1 idx 0 idx2 3
From thread 0 idx 1 idx2 0
From thread 1 idx 1 idx2 0
From thread 0 idx 1 idx2 1
From thread 1 idx 1 idx2 1
From thread 0 idx 1 idx2 2
From thread 1 idx 1 idx2 2
From thread 0 idx 1 idx2 3
From thread 1 idx 1 idx2 3
From thread 0 idx 2 idx2 0
From thread 1 idx 2 idx2 0
From thread 0 idx 2 idx2 1
From thread 1 idx 2 idx2 1
From thread 0 idx 2 idx2 2
From thread 1 idx 2 idx2 2
From thread 0 idx 2 idx2 3
From thread 1 idx 2 idx2 3

上面似乎发生的事情是分配了 2 个线程来执行两个嵌套循环,结果它们产生了上面的输出(总共 2*3*4=24 条日志消息),这很简单。

但现在考虑以下代码,其中内部 for 循环被声明为 pragma omp for

std::size_t idx;
std::size_t idx2;
omp_set_num_threads( 2 );

#pragma omp parallel default(shared) private(idx, idx2)
{

for(std::size_t idx=0;idx<3;idx++)
{
#pragma omp for
for(std::size_t idx2=0;idx2<4;idx2++)
{
LOG("From thread "+std::to_string(omp_get_thread_num())+" idx "+std::to_string(idx)+" idx2 "+std::to_string(idx2));
}
}
}

这会产生以下 3*4=12 条日志消息:

From thread 0 idx 0 idx2 0
From thread 1 idx 0 idx2 2
From thread 0 idx 0 idx2 1
From thread 1 idx 0 idx2 3
From thread 0 idx 1 idx2 0
From thread 1 idx 1 idx2 2
From thread 0 idx 1 idx2 1
From thread 1 idx 1 idx2 3
From thread 0 idx 2 idx2 0
From thread 0 idx 2 idx2 1
From thread 1 idx 2 idx2 2
From thread 1 idx 2 idx2 3

我本来希望再次将两个线程分配给对应于两个内部 for 循环的代码,并再次获得 24 条输出消息。为什么这两种情况下的输出不同?

最佳答案

第一种情况#pragma omp parallel在每个线程上运行一次整个并行区域。这意味着两个线程将完全运行两个 for 循环,因此每个线程应生成 4*3=12 行输出。

在第二种情况下,内部 #pragma omp for 告诉计算机 idx2 上的内部 for 循环应该在可用线程之间拆分。因此,不是两个线程都执行从 0 到 idx2 的内部循环,而是内部循环的每次迭代都只执行一次。

在第二个输出中,我们应该看到 idx2 的所有值都为 idx 的每个值打印一次,并且来自恰好可用的任何线程。

例如如果 idx 只能为零,则输出可能类似于:

From thread ? idx 0 idx2 0
From thread ? idx 0 idx2 1
From thread ? idx 0 idx2 2
From thread ? idx 0 idx2 3

? 表示它可以是任何可用的线程。

关于c++ - pragma omp 与 for 循环并行的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54016089/

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