gpt4 book ai didi

c - 是否在其中的部分中为 "grow"并行分配了一个工作组?

转载 作者:太空宇宙 更新时间:2023-11-04 00:01:43 27 4
gpt4 key购买 nike

我有一段代码想在多线程中运行,但是当我增加要运行的线程数时,我并没有得到太多加速。在一个点之后,我遇到的线程越多,它就越糟糕,以至于比顺序运行更糟糕。

所以我想知道可能是什么问题,我想知道 Open MP 是否允许我做我想做的事情。

代码基本就是这样

int threads = omp_get_num_threads()/2;

#pragma omp parallel for schedule(dynamic,1) num_threads(threads)
for(i =0; i<len; i++)
{
#pragma omp sections
{
#pragma omp section
{
do_stuf();
}
#pragma omp section
{
do_stuf2();
}
}
}

假设我有 16 个线程(在 16 核机器上)。我正在寻找的是让一个由 8 个核心组成的工作组在 for 循环中工作,并且当其中一个线程在 for 循环内的部分需要另一个线程时(因为有两个部分),我希望他们使用一个在我分配的工作组之外基本上处于空闲状态的线程的数量。

OpenMP 是否允许我做我想做的事,而我只是在线程管理上增加了开销?如果是这样,当“空闲”线程完成工作时,它会从分配给 for 的工作组中分离出来,还是会再次空闲?

还是我弄错了,这些部分根本没有使用空闲线程?

谢谢

最佳答案

你有两个简单的解决方案来解决这个问题,都使用嵌套并行:

  1. 与您提议的差不多,但只需将 parallel 添加到您的 sections 指令中,并使用 num_threads(2)(这将给 #pragma omp parallel sections num_threads(2)。这连同初始的 omp_set_nested(1) 启用嵌套并行性就可以实现你想要的。然而,这意味着你将必须在封闭循环的每次迭代中处理嵌套线程池的初始化/终止。这可能会或可能不会增加一些开销,具体取决于您的 OpenMP 实现的质量...
  2. 为了避免之前的循环内 parallel 指令,您可以首先创建一个由 2 个线程组成的团队,两个线程都运行整个(嵌套并行化的)for 循环,并且根据其 id 仅运行 do_stuf() 函数之一。

这是它的样子:

#include <stdio.h>
#include <omp.h>

void do_stuf1( int i, int tidl1 ) {
printf( "1: idx %d tid level 1 %d, tid level 2 %d\n",
i, tidl1, omp_get_thread_num() );
}

void do_stuf2(int i, int tidl1 ) {
printf( "2: idx %d tid level 1 %d, tid level 2 %d\n",
i, tidl1, omp_get_thread_num() );
}

int main() {
int nbth = omp_get_max_threads() / 2;
omp_set_nested( 1 );
#pragma omp parallel num_threads( 2 )
{
int tidl1 = omp_get_thread_num();
#pragma omp parallel for num_threads( nbth )
for ( int i = 0; i < 10; i++ ) {
if ( tidl1 == 0 ) {
do_stuf1( i, tidl1 );
}
else if ( tidl1 == 1 ){
do_stuf2( i, tidl1 );
}
else {
printf( "**** that's not good!\n ****");
}
}
}
return 0;
}

在我的机器上,使用 8 个线程,这给了我这个:

1: idx 6 tid level 1 0, tid level 2 2
1: idx 7 tid level 1 0, tid level 2 2
1: idx 8 tid level 1 0, tid level 2 3
1: idx 9 tid level 1 0, tid level 2 3
1: idx 0 tid level 1 0, tid level 2 0
1: idx 1 tid level 1 0, tid level 2 0
1: idx 2 tid level 1 0, tid level 2 0
1: idx 3 tid level 1 0, tid level 2 1
1: idx 4 tid level 1 0, tid level 2 1
1: idx 5 tid level 1 0, tid level 2 1
2: idx 0 tid level 1 1, tid level 2 0
2: idx 1 tid level 1 1, tid level 2 0
2: idx 2 tid level 1 1, tid level 2 0
2: idx 3 tid level 1 1, tid level 2 1
2: idx 4 tid level 1 1, tid level 2 1
2: idx 5 tid level 1 1, tid level 2 1
2: idx 6 tid level 1 1, tid level 2 2
2: idx 7 tid level 1 1, tid level 2 2
2: idx 8 tid level 1 1, tid level 2 3
2: idx 9 tid level 1 1, tid level 2 3

关于c - 是否在其中的部分中为 "grow"并行分配了一个工作组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40567116/

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