OpenMP - объявления переменных в циклах for - PullRequest
4 голосов
/ 08 июня 2011

Я пытаюсь адаптировать обычный код к параллельному.Когда я делаю параллельный цикл for, в котором есть некоторые переменные, объявленные внутри него, эти переменные являются частными или общими?

Должен ли я определять каждую из них как частную при определении прагмы?


Кстати, последний вопрос.Я могу использовать for-pragma с начальным параметром итератора тоже верно?как for(iter=xlist.begin() ; ... )

Я использую последнюю версию кодовых блоков и MINGW.

Ответы [ 2 ]

9 голосов
/ 08 июня 2011

Все, что объявлено внутри параллельной области (независимо от того, является ли это циклом или нет), является частным, за исключением случаев, перечисленных ниже в комментарии @ejd.Вы не можете перечислить его как личное в строке #pragma, так как переменная еще не существует.

Так, например, в приведенном ниже примере, даже с default(none) нам не нужно указывать общий доступtid, даже если бы вы могли;он находится внутри параллельной секции, поэтому он является приватным для каждого потока.(Заметьте также, что вам не нужно указывать i как private, поскольку индекс цикла для omp для него обязательно является приватным.)

$ more foo.c
#include <stdio.h>
#include <omp.h>

int main(int argc, char *argv[]) {
    int i;

    #pragma omp parallel for default(none) private(i)
    for(i=0;i<10;i++){
        int tid = omp_get_thread_num();
        printf("Thread %d gets iteration %d\n", tid, i);
    }

    return 0;
}
gpc-f103n084-$ !g
gcc -o foo foo.c -fopenmp 
$ ./foo
Thread 1 gets iteration 2
Thread 1 gets iteration 3
Thread 3 gets iteration 6
Thread 3 gets iteration 7
Thread 0 gets iteration 0
Thread 0 gets iteration 1
Thread 4 gets iteration 8
Thread 4 gets iteration 9
Thread 2 gets iteration 4
Thread 2 gets iteration 5
4 голосов
/ 08 июня 2011

Если они нужны только внутри блока цикла и вы хотите распараллелить цикл, оставьте их внутри блока цикла. Если вы объявите их вне параллельной конструкции и объявите их как частные, каждый поток будет иметь свою собственную копию. Так что это не имеет значения.

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