Неявный барьер в конце #pragma for

Друзья, я пытаюсь изучить парадигму openMP. Я использовал следующий код, чтобы понять #omp для прагмы.

int main(void){
int tid;
int i;

omp_set_num_threads(5);
#pragma omp parallel \
    private(tid)
{
    tid=omp_get_thread_num();
    printf("tid=%d started ...\n", tid);
    fflush(stdout);

    #pragma omp for
    for(i=1; i<=20; i++){
        printf("t%d - i%d \n",
                omp_get_thread_num(), i);
        fflush(stdout);
    }

    printf("tid=%d work done ...\n", tid);
}

return 0;

}

В приведенном выше коде есть неявный барьер в конце #pragma omp parallel, что означает, что все потоки 0,1,2,3,4 должны достичь его, прежде чем перейти к следующему оператору.

Итак, чтобы проверить этот барьер, я заключил эту "прагму для" в условие if (tid! = 0), что означает, что все потоки, кроме потока 0, т.е. 1,2,3,4, должны завершить свою работу в цикле и ждать thread0 бесконечно. Но, к моему удивлению, этого не происходит. Каждый поток выполняет свою итерацию и успешно завершается. т.е. t1 завершает итерации 5,6,7,8 ---- t2 выполняет 9,10,11,12 ---- t3 выполняет 13,14,15,16 и t4 выполняет 17,18,19,20. Обратите внимание: итерации 1,2,3,4 так и не были завершены.

Чтобы копнуть глубже, вместо tid! = 0 я заключил ту же самую #pragma for в tid! = 1, означающую, что вместо thread0 thread1 обходит барьер. К моему удивлению, программа теперь зависает, и все потоки ждут thread1.

Подскажите, пожалуйста, объяснение такого неожиданного поведения. Последний повешенный код:

int main(void){
int tid;
int i;

omp_set_num_threads(5);
#pragma omp parallel \
    private(tid)
{
    tid=omp_get_thread_num();
    printf("tid=%d started ...\n", tid);
    fflush(stdout);

    if(tid!=1){
        /* worksharing */
        #pragma omp for
        for(i=1; i<=20; i++){
            printf("t%d - i%d \n", 
                omp_get_thread_num(), i);
            fflush(stdout);
        }
    }else{
        printf("t1 reached here. \n");
    }

    printf("tid=%d work done ...\n", tid);
}

return 0;

}

Я попытался установить «общий» или «частный», но это не повлияло на поведение программы.

6
задан prathmesh.kallurkar 25 January 2012 в 04:21
поделиться