разные значения в переменных - PullRequest
1 голос
/ 21 марта 2012

Почему у меня разные значения i в main и foo?

Вот мой пример кода:

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

double a;
int i;
int j;
int nr_threads;

void foo()
{
    printf("foo::i: \t%d\n", i);
}


int main()
{
    puts("hejka");
    a = 0;

    nr_threads = omp_get_num_threads();
    printf("Threads: %d\n", nr_threads);

    omp_set_num_threads(7);

#pragma omp parallel private(i,j) shared(a)
{
   #pragma omp single
    {
        nr_threads = omp_get_num_threads();
        printf("Threads: %d\n", nr_threads);
    }

#pragma omp for reduction(+:a)
    for(i=0;i<10;i++)
    {
        printf("main::i:\t%d\n", i);
        foo();
    }
}

    printf("a: %lf\n",a);
    printf("i: %d\n",i);
    printf("j: %d\n",j);
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 26 марта 2012

Проблема в том, что переменная цикла parallel for неявно делается частной для каждого рабочего потока, поэтому каждый поток получит закрытую переменную i.Нет никакой связи между i, видимым рабочими потоками, и i, видимым основным потоком, за исключением имени.

0 голосов
/ 21 марта 2012

Вам нужно инициализировать i внутри вашей параллельной секции.

Я думаю, что 'copyin' #pragma (или что-то в этом роде) можно использовать для клонирования значения в каждый поток при запуске параллельной секции.

Частные переменные потока не инициализируются.

Если память служит, то по умолчанию создаются объекты thread = private класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...