Ім'я файлу: Модуль №1.docx
Розширення: docx
Розмір: 21кб.
Дата: 30.10.2021
скачати

Львівський національний університет імені Івана Франка

Факультет електроніки та комп’ютерних технологій

Модульний контроль №1

Виконала:

Студентка групи ФеП-21

Павлюк Єлизавета

Викладач:

Шувар Р. Я.

Львів 2021

Директива teams в OpenMP: призначення, використання з іншими директивами, приклади застосування

OpenMP – стандарт паралельного програмування для багатопроцесорних систем зі спільною пам'яттю.

Директива teams створює колекцію команд потоків, головний потік кожної команди виконує область команд.

Коли потік зустрічає директиву teams, створюється група команд. Кожна команда є початковою командою, і початковий потік у кожній команді виконує teams регіон. Кількість створених команд визначена реалізацією, але менше або дорівнює значенню, зазначеному в пункті num_teams. Потік може отримати кількість початкових команд, створених конструкцією за допомогою виклику підпрограми omp_get_num_teams.

Максимальна кількість потоків, які беруть участь у групі аргументу, яку ініціює кожна команда, є визначена реалізацією, проте менше або дорівнює значенню, вказаному в пункті thread_limit.

У комбінованій або складеній конструкції, що включає конструкції target та teams, вирази в пропозиціях num_teams та thread_limit обчислюються на хост-пристрої при вході до target конструкції.

Після створення команд, кількість початкових команд залишається незмінною протягом усього періоду teams.

У межах teams регіону початкові номери команд однозначно ідентифікують кожну початкову команду. Початкові номери команд – це послідовні цілі числа в діапазоні від нуля до одиниці менше, ніж кількість початкових команд. Потік може отримати власний початковий номер команди шляхом виклику підпрограми бібліотеки omp_get_team_num. Визначено політику присвоєння початкових потоків місцям. Конструкція команд встановлює ICV для place-partition-var та default-device-var для кожного початкового потоку значення, яке визначається реалізацією.

Після того, як команди завершать виконання teams області, завдання, що зустрічається, відновлює виконання області, що охоплює завдання.

Використання конструкції teams:

  1. Для цільової області без зазначення teams створюється одна команда, і її головний потік виконує цільову область.

  2. Директива omp teams повинна бути строго вкладена всередину цільової області, тобто між директивою omp target та директивою omp teams не може існувати код. Необхідно вкладати наступні регіони OpenMP усередині регіону команд:

  • omp distribute;

  • omp distribute simd;

  • omp distribute parallel for;

  • omp distribute parallel for simd;

  • Паралельні області, включаючи будь-які паралельні області, що виникають із комбінованих конструкцій.

  1. В основному компілятор створює стільки команд, скільки ви запитуєте. Однак, якщо число, яке ви запитуєте, перевищує будь-яке з наведених нижче, створюються команди з меншим числом між ними:

  • Значення, вказане в реченні num_teams;

  • 65536, що є обмеженням, визначеним реалізацією.

  1. В основному компілятор створює стільки потоків для кожної команди, скільки ви запитуєте. Однак, якщо число, яке ви запитуєте, перевищує будь-яке з наступних чисел, потоки меншого числа між ними створюються для кожної команди:

  • Значення, вказане в реченні thread_limit;

  • 992, що є обмеженням, визначеним реалізацією.

  1. Після створення команд кількість команд залишається незмінною протягом усього періоду команд.

  2. Коли директива omp teams використовується як частина комбінованої конструкції, наприклад, директиви omp target teams, вираз, що використовується в реченні num_teams або thread_limit, обчислюється на хості.

  3. У командній області кожна команда має унікальний номер команди. Номери команд – це послідовні цілі числа, які коливаються від нуля до одиниці менше кількості команд. Можна отримати номер команди, викликавши функцію omp_get_team_num.

Обмеження конструкції teams:

  1. Програма, яка розгалужується на teams регіон або виходить з нього, є невідповідною.

  2. Програма не повинна залежати від будь-якого впорядкування оцінок пунктів директиви teams або від будь-яких побічних ефектів оцінки пунктів.

  3. У директиві може бути принаймні одне речення thread_limit. Вираз thread_limit має оцінюватись як додатне ціле значення.

  4. У директиві може бути принаймні одне речення num_teams. Вираз num_teams повинен мати натуральне ціле значення.

  5. teams може бути вкладений лише в неявну паралельну область або target. Якщо конструкція команд вкладена в цільову конструкцію, ця цільова конструкція не повинна містити жодних операторів, оголошень або директив поза конструкцією команд.

  6. distribute, distribute simd, розподіляє паралельний цикл спільного використання, розподіляє паралельний цикл робочого спільного використання SIMD, parallel регіони, включаючи будь-які parallel регіони, що виникають із комбінованих конструкцій, регіони omp_get_num_teams () та omp_get_team_num () – єдині регіони OpenMP, які можуть бути строго вкладені всередину teams.

Синтаксис побудови teams такий:

#pragma omp teams [пункт1 [[,] пункт2] ...] новий рядок

структурований-блок

де пункти є одним із наступних:

  • num_teams ([нижня межа:] верхня межа)

  • threadlimit (цілочисловий вираз)

  • default (атрибут спільного використання даних)

  • private (список)

  • firstprivate (список)

  • shared (список)

  • reduction ([за замовчуванням,] ідентифікатор скорочення: список)

  • allocate ([розподілювач:] список)

а де нижня і верхня межі – це скалярні цілі вирази.

Приклад використання директиви teams в OpenMP №1: виконується скорочення команд для відображеної змінної res.

#include

#include

#include

int foo();

int main()

{

int res = 0, n = 0;

#pragma omp target teams num_teams(foo()) map(res, n) reduction(+:res)

{

res = omp_get_team_num();

if (omp_get_team_num() == 0)

n = omp_get_num_teams();

}

Assert (res == (n*(n-1))/2); // Sum of first n-1 natural numbers

}

Приклад використання директиви teams в OpenMP №2: множення двох квадратних матриць шляхом паралелізації

#include

void matmul (float *a, float const *b, float const * c, int N) {

#pragma omp teams {

int i;

#pragma omp distribute

for (i=0; i

int j;

#pragma omp parallel for

for (j=0; j

int k;

for (k=0; k

a[i*N+k] = a[i*N+k] + b[i*N+j] * c[j*N+k];

}

}

}

}

}
скачати

© Усі права захищені
написати до нас