Ree*_*eed 2 c++ multithreading openmp
我有两组线程,一组由 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);
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的输出是:
function1 is called
function1 is called
function1 is called
...
n
function2 is called
...
m
Run Code Online (Sandbox Code Playgroud)
我期望的输出(只是一个随机示例):
function2 is called
function2 is called
function1 is called
function2 is called
function1 is called
...
Run Code Online (Sandbox Code Playgroud)
在您的示例中,您遇到的行为正是人们所期望的,因为 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;
}
Run Code Online (Sandbox Code Playgroud)
注意:我在函数调用中添加了一些伪随机等待,以允许一些延迟返回,否则,看到损坏的输出的可能性非常小。
在我的四核机器上,这给了我(例如):
~/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 )
Run Code Online (Sandbox Code Playgroud)
所以这回答了你的直接问题,但我有一种感觉,最初的方法可能不是最合适的方法。您应该明确考虑查看task构造,因为它可能更适合您想要实现的目标。
| 归档时间: |
|
| 查看次数: |
972 次 |
| 最近记录: |