При использовании директивы OpenMP SECTIONS приватная переменная печатается как мусорное значение - PullRequest
2 голосов
/ 13 февраля 2012

Внутри параллельного блока моего кода я ссылаюсь на приватную переменную потока, tid.tid назначается в директиве SECTIONS.

Однако, когда я печатаю его значение, я получаю значение мусора внутри параллельного блока, но вне блока секций.

Почему я получаю мусорзначение?

Что я знаю, вы обычно получаете значение мусора, если вы обращаетесь к переменной вне блока omp parallel и не определяются как lastprivate.

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

/* 4 threads, 1 core */
int main (int argc, char *argv[]) 
{
    int nthreads, tid;

    /* Fork a team of threads giving them their own copies of variables */
    #pragma omp parallel private(tid) 
    {
        #pragma omp sections
        {
            /* Obtain thread number */
            tid = omp_get_thread_num();

            printf("Hello World from thread = %d\n", tid);

            /* Only master thread does this */
            if (tid == 0) 
            {
                nthreads = omp_get_num_threads();
                printf("Number of threads = %d\n", nthreads);
            }

            printf("Inside sections %d \n" ,tid);
        }

        printf("Out of sections %d  \n", tid );

        #pragma omp single
        {
            printf("Inside single block %d \n" , tid);
        }
    }  /* All threads join master thread and disband */

    printf("Outside parallel block \n");
}  

Ниже приведен вывод Iполучил:

Hello World from thread = 3
Inside sections 3 
Out of sections 0  
Inside single block 0 
Out of sections 1  
Out of sections 3  
Out of sections -1078056856  
Outside parallel block 

Почему tid дал это значение мусора (-1078056856)?

1 Ответ

2 голосов
/ 13 февраля 2012
  1. Вы должны инициализировать tid перед параллельным блоком
  2. Чтобы использовать это значение внутри потоков, объявите его как firstprivate(tid) в pragma omp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...