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



Pdf көрінісі
бет49/53
Дата07.06.2023
өлшемі6.58 Mb.
#474796
1   ...   45   46   47   48   49   50   51   52   53
ParProg MPI OpenMP

3.5.3 Директива atomic 
Этот тип синхронизации определяет переменную в левой части 
оператора присваивания, которая должна корректно обновляться 


71 
несколькими нитями. В этом случае происходит предотвращение 
прерывания доступа, чтения и записи данных, находящихся в общей 
памяти, со стороны других потоков. 
Отметим, что синхронизация atomic является альтернативой 
директивы reduction. Применяется эта синхронизация только для 
операторов, следующих непосредственно за определяющей ее директивой. 
Синхронизация atomic - очень дорогая операция с точки зрения 
трудоемкости выполнения программы. Она выполняется автоматически 
по умолчанию при завершении циклов в параллельном режиме. Для того 
чтобы ее исключить, следует использовать директиву nowait [3,5]. 
#pragma omp atomic [read | write | update | capture ]оператор 
или 
#pragma omp atomic capture структурированный блок 
 
Пример 3.17. 
#include 
#include 
int main()
{
int x; 
x=0; 
#pragma omp parallel shared(x) 

#pragma omp atomic 
x=x++; 

printf(“Число нитей %d\n”,x); 
return 0;} 
 
В 
данном 
примере 
директива 
atomic 
используется 
для 
предотвращения 
одновременного 
изменения 
несколькими 
нитями 
значения переменной x. Результатом работы программы является общее 
количество нитей. 
3.5.4 Замки 
Один из вариантов синхронизации в OpenMP реализуется через 
механизм замков (locks). В качестве замков используются общие 
целочисленные переменные (размер должен быть достаточным для 


72 
хранения адреса). Данные переменные должны использоваться только как 
параметры примитивов синхронизации. 
Замок 
может 
находиться 
в 
одном 
из 
трёх 
состояний: 
неинициализированный, 
разблокированный 
или 
заблокированный. 
Разблокированный замок может быть захвачен некоторой нитью. При 
этом он переходит в заблокированное состояние. Нить, захватившая 
замок, и только она может его освободить, после чего замок возвращается 
в разблокированное состояние. 
Есть два типа замков: простые замки и множественные замки. 
Множественный замок может многократно захватываться одной нитью 
перед его освобождением, в то время как простой замок может быть 
захвачен только однажды. Для множественного замка вводится понятие 
коэффициента 
захваченности 
(nesting 
count). 
Изначально 
он 
устанавливается в ноль, при каждом следующем захватывании 
увеличивается на единицу, а при каждом освобождении уменьшается на 
единицу. Множественный замок считается разблокированным, если его 
коэффициент захваченности равен нулю. 
Для 
инициализации 
простого 
или 
множественного 
замка 
используются 
соответственно 
функции 


Достарыңызбен бөлісу:
1   ...   45   46   47   48   49   50   51   52   53




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

    Басты бет