Содержание
- 2. ОПЦИЯ COLLAPSE collapse(n) — n последовательных тесновложенных циклов ассоциируется с данной директивой. Для циклов образуется общее
- 3. ОПЦИЯ ORDERED Опция для указания о том, что в цикле могут встречаться директивы ordered. В этом
- 4. ОПЦИЯ NOWAIT По умолчанию в конце параллельного цикла происходит неявная барьерная синхронизация параллельно работающих тредов –
- 5. ПРИМЕР #include #define CHUNKSIZE 100 #define N 1000 main () { int i, chunk; float a[N],
- 6. ЗАКЛЮЧЕНИЕ ПО РАСПАРАЛЛЕЛИВАНИЮ ЦИКЛОВ При распараллеливании цикла надо убедиться в том, что итерации данного цикла не
- 7. ДИРЕКТИВА SECTIONS Используется для реализации функционального параллелизма. Эта директива определяет набор независимых секций кода, каждая из
- 8. СИНТАКСИС ДИРЕКТИВЫ SECTIONS #pragma omp sections [опции ...] newline private (list) firstprivate (list) lastprivate (list) reduction
- 9. ПРИМЕР int main() { int n; #pragma omp parallel private(n) { n=omp_get_thread_num(); #pragma omp sections {
- 10. Перед первым участком кода в блоке sections директива section не обязательна. Какие треды будут выполнять какую
- 11. Опция lastprivate определенно связана с последней section: int n=0; #pragma omp parallel { #pragma omp sections
- 12. Переменная n объявлена как lastprivate. Три треда, выполняющие секции section, присваивают своей локальным копиям n разные
- 13. С. – ожидание одних (выполняющихся тредов) другими (уже выполненными). С. действует в некоторых случаях (см. ранее
- 14. Синтаксис директивы: #pragma omp barrier Треды, выполняющие текущую параллельную область, дойдя до этой директивы, останавливаются и
- 15. #pragma omp parallel { printf("Message 1\n"); printf("Message 2\n"); #pragma omp barrier printf("Message 3\n"); } Выдачи разных
- 16. Синтаксис директивы: #pragma omp ordered { ... } Директива определяет блок внутри параллельного цикла, который должен
- 17. Для вложенных циклов выделенный блок операторов относится к самому внутреннему из циклов. Тред, выполняющий первую итерацию
- 18. int i, n; omp_set_num_threads(4); #pragma omp parallel private (i, n) { n=omp_get_thread_num(); #pragma omp for ordered
- 19. В результате: первая выдача будет неупорядоченной, вторая идёт в порядке по возрастанию номера итерации. ПРИМЕР –
- 20. В коде можно выделять критические разделы. С помощью критических разделов можно предотвратить одновременный доступ к одному
- 21. Синтаксис директивы: #pragma omp critical [name] { ... } ДИРЕКТИВА CRITICAL
- 22. В каждый момент времени критический раздел может выполнять не более одного треда. Если критический раздел уже
- 23. main() { int x; x = 0; #pragma omp parallel shared(x) { #pragma omp critical x
- 24. Блок выполняется единственным тредом Синтаксис директивы: #pragma omp single [опции ...] newline private (list) firstprivate (list)
- 25. После выполнения треда новые значения переменных списка будут доступны всем одноименным частным переменным (private и firstprivate),
- 26. int n; #pragma omp parallel private(n) { n=omp_get_thread_num(); printf("n (start): %d\n", n); #pragma omp single copyprivate(n)
- 27. Блок выполняется единственным master-тредом. Остальные треды пропускают блок и продолжают работу с оператора, расположенного за ним.
- 28. Используется для корректного обновления общих переменных. Применяется к отдельному оператору типа присваивания. Синтаксис директивы: #pragma omp
- 29. statement_expression: x op= expr;//составное присваивание x = x op expr; x++; ++x; x--; --x; х –
- 30. На время выполнения оператора блокируется доступ к данной переменной всем запущенным в данный момент тредам, кроме
- 31. int count = 0; #pragma omp parallel { #pragma omp atomic count++; } printf("number of threads:
- 32. Используется для согласования состояния памяти (консистентность). Синтаксис директивы: #pragma omp flush [(list)] ДИРЕКТИВА FLUSH
- 33. Значения всех переменных (или переменных из списка), временно хранящиеся в регистрах и кэш-памяти текущего треда, будут
- 35. Скачать презентацию