Skip to content

Commit

Permalink
Updates glava4/glava_4.md
Browse files Browse the repository at this point in the history
Auto commit by GitBook Editor
  • Loading branch information
Ruslan Dautov committed Apr 6, 2017
1 parent 3b189da commit a62314c
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 33 deletions.
32 changes: 16 additions & 16 deletions SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,27 @@

* [Readme](README.md)
* [Глава 1](glava1/glava_1.md)
* [Стратегии](glava1/strategii.md)
* [Механизмы](glava1/mehanizmi.md)
* [Таксономия Флинна](glava1/taksonomiya_flinna.md)
* [Аппаратная часть](glava1/apparatnaya_chast.md)
* [Теория производительности](glava1/teoriya_proizvoditelnosti.md)
* [Стратегии](glava1/strategii.md)
* [Механизмы](glava1/mehanizmi.md)
* [Таксономия Флинна](glava1/taksonomiya_flinna.md)
* [Аппаратная часть](glava1/apparatnaya_chast.md)
* [Теория производительности](glava1/teoriya_proizvoditelnosti.md)
* [Глава 2](glava2/glava_2.md)
* [Начало](glava2/nachalo.md)
* [История OpenMP](glava2/istoria.md)
* [Компиляторы](glava2/kompilyatori.md)
* [Начало](glava2/nachalo.md)
* [История OpenMP](glava2/istoria.md)
* [Компиляторы](glava2/kompilyatori.md)
* [Глава 3](glava3/glava_3.md)
* [parallel](glava3/parallel.md)
* [for](glava3/for.md)
* [proc\_bind](glava3/proc_bind.md)
* [sections single](glava3/sections.md)
* [parallel](glava3/parallel.md)
* [for](glava3/for.md)
* [proc\_bind](glava3/proc_bind.md)
* [sections single](glava3/sections.md)
* [Глава 4](glava4/glava_4.md)
* [SIMD](glava4/simd.md)
* [Помощь векторизации](pomosch_vektorizatsii.md)
* [SIMD](glava4/simd.md)
* [Помощь векторизации](pomosch_vektorizatsii.md)
* [Критические секции](kriticheskie_sektsii.md)
* [task](task.md)
* [Дополнительные материалы](dopolnitelnie_materiali.md)
* [Типичные ошибки](tipichnie_oshibki.md)
* [Критические секции](kriticheskie_sektsii.md)
* [Переменные окружения](peremennie_okruzheniya.md)
* [task](task.md)
* [Что такое Valgrind и для чего он нужен.](chto_takoe_valgrind.md)

6 changes: 2 additions & 4 deletions glava4/glava_4.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
# Глава 4

В данной главе мы рассмотрим векторизацию и как помочь компилятору векторизировать наш код. Это позволит наиболее эффективно использовать центральный процессор.

simd

В данной главе мы рассмотрим векторизацию и как помочь компилятору векторизировать наш код. Это позволит наиболее эффективно использовать центральный процессор.

simd

30 changes: 17 additions & 13 deletions kriticheskie_sektsii.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
# Критические секции

#####*В очередь, сукины дети, в очередь!*
##### _В очередь, сукины дети, в очередь!_

###### М. А. Булгаков "Собачье сердце"

```
#pragma omp critical (name)
#pragma omp critical (name)
```
С помощью директивы **critical** мы можем указать участок кода, который будет исполняться только одним потоком в один момент времени. Если один из потоков начал выполнение критической секции с данным именем, то остальные потоки, начавшие выполнение этой же секции, будут заблокированы. Они будут ждать своей очереди. Как только первый поток завершит выполнение секции, один из заблокированных потоков войдёт в неё. Выбор следующего потока, который будет выполнять критическую секцию, будет случайным.

С помощью директивы **critical** мы можем указать участок кода, который будет исполняться только одним потоком в один момент времени. Если один из потоков начал выполнение критической секции с данным именем, то остальные потоки, начавшие выполнение этой же секции, будут заблокированы. Они будут ждать своей очереди. Как только первый поток завершит выполнение секции, один из заблокированных потоков войдёт в неё. Выбор следующего потока, который будет выполнять критическую секцию, будет случайным.

```
#include <omp.h>
Expand All @@ -15,7 +17,7 @@ void main()
{
int x;
x = 0;
#pragma omp parallel shared(x)
{
#pragma omp critical
Expand All @@ -24,8 +26,7 @@ void main()
}
```


Критические секции могут быть именованными или не именованными. В различных ситуациях улучшает производительность. Согласно стандарту все критические секции без имени, будут ассоциированы одним именем.
Критические секции могут быть именованными или не именованными. В различных ситуациях улучшает производительность. Согласно стандарту все критические секции без имени, будут ассоциированы одним именем.
Присвоение имени позволит вам одновременно выполнять две и более критические секции одновременно.

```
Expand All @@ -50,17 +51,17 @@ void main()
doworkB();
}
//секции с doworkA () и doworkB() будут выполнены одновременно
//секции с doworkA () и doworkB() будут выполнены одновременно
```
Очень важно что бы имя критической секции не было названием системной функции или же было идентично уже использованному в проекте.

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

Есть случаи когда именовать нужно одним именем. Когда у вас в обоих критических секциях вывод в один и тот же файл или же вывод на экран.

```
#pragma omp critical
{
cout << "Привет от потока № " << omp_get_thread_num()<<endl;
cout << "Привет от потока № " << omp_get_thread_num()<<endl;
}
//omp_get_thread_num() - библиотечная функция которая возвращает номер потока.
Expand Down Expand Up @@ -96,14 +97,17 @@ for ( i = 0 ; i < N; ++i )
}
}
}
```
Измененный код, будет более производительным.

Измененный код, будет более производительным.

Типичные ошибки:

* Использование critical когда эффективнее использовать atomic

* Большие объёмы работ внутри critical секции

* Использование не нужной critical секции



0 comments on commit a62314c

Please sign in to comment.