2

私はコードをもっている:

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

static void func()
{
    char t[30];
    sprintf(t,"%d %d\n",omp_get_num_threads(),omp_get_thread_num());
    write(1,t,strlen(t));
    write(1,"checkpoint 1\n",13);
    #pragma omp barrier 
    write(1,"checkpoint 2\n",13);
    #pragma omp barrier
    write(1,"checkpoint 3\n",13);
    #pragma omp barrier
    write(1,"checkpoint 4\n",13);
}

int main()
{
    int i;
#pragma omp parallel for
    for(i=0;i<2;i++)
    {
       func();
    }
} 

そして出力:

8 1
8 0
checkpoint 1
checkpoint 1
checkpoint 2
checkpoint 2
[here my program blocks].

2 を 8 に変更すると、機能します。しかし、for ループに 2 が必要です。

ループの前に omp_set_num_threads(2) を使用せずにコードを機能させる方法は? (これを入れても動作します)

4

1 に答える 1

3

バリアは、チーム内のすべてのスレッドを同期するために使用されます。すべてのスレッドがバリアに到達するまで、到着するすべてのスレッドがブロックされます。そうして初めて、それらがすべて継続します。

この結果、プログラムが終了するためには、すべてのスレッドが存続中に同じ数のバリアに到達する必要があります。1 つのスレッドが他のスレッドよりも多くのバリアを持っている場合、そのスレッドは他のスレッドを待機するため、その余分なバリアを通過することはできません。

function にバリアがfuncあり、並列ループの反復ごとに 1 回実行されます。これらの反復をスレッドに割り当てるのは OpenMP 次第であるため、すべての反復が同じ数の反復を受け取るとは限りません (あなたの場合、2 のスレッド カウントに対して同じ数を受け取ります - すべてのスレッドに対して 1 つの反復、それがあなたのプログラムの理由です)。その後終了します)。バリアの数が等しくないため、プログラムがブロックされます。

バリアは、すべてのスレッドが同じ頻度で実行されることがわかっている場所にのみ配置してください。

于 2015-06-10T09:28:53.353 に答える