gpt4 book ai didi

c++ - 如何同时启动两个线程函数不同的线程组?

转载 作者:行者123 更新时间:2023-11-30 00:44:48 24 4
gpt4 key购买 nike

我有两组线程,一组由n个线程执行,一组由m个线程执行。我想同时启动它们,但我得到的是第 1 组先启动,然后是第 2 组。

//group 1   
#pragma omp parallel num_threads(n)
{
#pragma omp for
for (int i = 0; i < n; i++) {
function1(i);
}
}
//group 2
#pragma omp parallel num_threads(m)
{
#pragma omp for
for (int i = 0; i < m; i++) {
function2(i);
}
}

我得到的输出是:

function1 is called
function1 is called
function1 is called
...
n
function2 is called
...
m

我期望的输出(只是一个随机示例):

function2 is called
function2 is called
function1 is called
function2 is called
function1 is called
...

最佳答案

在您的示例中,您遇到的行为正是人们所期望的,因为 2 个 parallel 区域是依次创建的。

如果您想坚持使用parallel for 结构的方法,您需要将它们封装到另一个parallel 结构中,并且还允许嵌套并行。例如:

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

void function1( int i ) {
printf( "Function1( %d )\n", i );
usleep( ( i * 1237 + 8765 ) % 9797 );
}

void function2( int i ) {
printf( "Function2( %d )\n", i );
usleep( ( i * 7321 + 5678 ) % 10903 );
}

int main() {

int n = 10, m = 5;
omp_set_nested( 1 );

#pragma omp parallel sections num_threads( 2 )
{
#pragma omp section
#pragma omp parallel for num_threads( n )
for ( int i = 0; i < n; i++ )
function1( i );
#pragma omp section
#pragma omp parallel for num_threads( m )
for ( int i = 0; i < m; i++ )
function2( i );
}

return 0;
}

注意:我在函数调用中添加了一些伪随机等待,以允许在返回时出现一些延迟,否则,看到损坏输出的可能性非常小。

在我的四核机器上,这给了我(例如):

~/tmp$ gcc -fopenmp pools.c
~/tmp$ ./a.out
Function2( 2 )
Function1( 5 )
Function1( 1 )
Function2( 1 )
Function2( 0 )
Function1( 0 )
Function1( 3 )
Function1( 4 )
Function1( 6 )
Function1( 9 )
Function1( 7 )
Function2( 4 )
Function1( 2 )
Function1( 8 )
Function2( 3 )

所以这回答了您的直接问题,但我感觉最初的方法可能不是最合适的方法。您应该明确考虑查看 task 构造,因为它可能更适合您想要实现的目标。

关于c++ - 如何同时启动两个线程函数不同的线程组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46839150/

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