gpt4 book ai didi

c - OpenMP - 在 for 循环中生成和终止线程时的开销

转载 作者:行者123 更新时间:2023-11-30 16:38:27 24 4
gpt4 key购买 nike

我对 OpenMP 相当陌生,我有一些蒙特卡洛代码正在尝试并行化。

我有一个必须串行运行的 for 循环,它调用 new_value() 函数:

for(int i = 0; i < MAX_VAL; i++)
new_value();

此函数在每次调用时打开一个并行区域:

void new_value()
{
#pragma omp parallel default(shared)
{
int thread_rank = omp_get_thread_num();

#pragma omp for schedule(static)
for(int i = 0; i < N; i++)
arr[i] = update(thread_rank);
}
}

这可以工作,但是会产生大量与线程的生成和终止相关的开销;我想知道是否有人知道在进入循环之前生成线程(并获得 thread_rank)而不并行循环的方法?

有几个问题提出了同样的问题,但它们要么是错误的,要么是没有答案,例如:

This question它询问一个类似的事情,答案建议创建一个并行区域,然后在最外层循环上使用#pragma omp single,但正如“Joe C”在回复评论,这个不行。我可以确认该程序只是挂起。

This question询问完全相同相同的事情,但(未勾选的)答案只是并行化运行循环4000 * num_threads的最外层循环,这既不是提问者想要的,也不是我想要的想要。

最佳答案

你的第二个问题的答案实际上是正确的。

#pragma omp parallel
for(int i = 0; i < MAX_VAL; i++)
new_value();

void new_value()
{
int thread_rank = omp_get_thread_num();

#pragma omp for schedule(static)
for(int i = 0; i < N; i++)
arr[i] = update(thread_rank);
}

是正确的并且正是您想要的。它与您问题中的代码具有相同的语义。不同之处在于只有一个并行区域,并且循环变量 i现在由整个团队计算。请注意,外循环以工作共享方式并行化 ( omp parallel for )。

因此,当运行此代码时,num_threads线程将执行循环头一次 new_value并到达omp for都有他们的私有(private)i == 0 。他们将分担内循环的工作。然后他们将等到每个人都在隐式障碍处完成循环,增加他们的私有(private) i并重复...我希望现在很清楚,这与以前的内部循环行为相同,但线程管理开销更少。

关于c - OpenMP - 在 for 循环中生成和终止线程时的开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47488196/

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