Н., Пескова Е. Е., Шаманаев П. А. Основы параллельного программирования с использованием технологий mpi и openmp учебное пособие саранск издательство свмо 2013 2



Pdf көрінісі
бет38/53
Дата07.06.2023
өлшемі6.58 Mb.
#474796
1   ...   34   35   36   37   38   39   40   41   ...   53
ParProg MPI OpenMP

3.3.3 Классы переменных 
В OpenMP переменные в параллельных областях программы 
разделяются на два основных класса: 
shared (общие; все нити видят одну и ту же переменную); 
private (локальные, приватные; каждая нить видит свой экземпляр 
данной переменной). 
Общая переменная всегда существует лишь в одном экземпляре для 
всей области действия и доступна всем нитям под одним и тем же именем. 
Объявление локальной переменной вызывает порождение своего 
экземпляра данной переменной (того же типа и размера) для каждой нити. 
Изменение нитью значения своей локальной переменной никак не влияет 
на изменение значения этой же локальной переменной в других нитях. 
Если несколько переменных одновременно записывают значение 
общей переменной без выполнения синхронизации или если как минимум 
одна нить читает значение общей переменной и как минимум одна нить 
записывает значение этой переменной без выполнения синхронизации, то 
возникает ситуация так называемой «гонки данных» (data race), при 
которой результат выполнения программы непредсказуем. 
По умолчанию, все переменные, порождённые вне параллельной 
области, при входе в эту область остаются общими (shared). Исключение 
составляют переменные, являющиеся счетчиками итераций в цикле, по 
очевидным причинам. Переменные, порождённые внутри параллельной 
области, по умолчанию являются локальными (private). Явно назначить 
класс переменных по умолчанию можно с помощью опции default. Не 
рекомендуется постоянно полагаться на правила по умолчанию, для 
большей надёжности лучше всегда явно описывать классы используемых 
переменных [5,6]. 
Пример 3.9. 
#include 
#include 
int main()
{
int n=1;
printf("n в последовательной области (начало): %d\n", n);
#pragma omp parallel private(n)
{
n=omp_get_thread_num();


59 
printf("Значение n на нити: %d\n", n);
}
printf("n в последовательной области (конец): %d\n", n); 
return 0; 

 
В данном примере демонстрируется использование опции private. В 
последовательной области переменно n присвоено значение 1. Далее 
порождается параллельная область, где переменной n каждой нити 
присваивается номер потока и выводится на экран. После выхода из 
параллельной области значение n снова оказывается равным 1.
Для реализации механизма передачи данных между параллельными 
потоками из одного параллельного структурного блока программы в 
другой, минуя промежуточный последовательный структурный блок в 
OpenMP имеется специальная директива threadprivate.



Достарыңызбен бөлісу:
1   ...   34   35   36   37   38   39   40   41   ...   53




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет