Разработка параллельных приложений для многоядерных...

17
Разработка параллельных приложений для многоядерных систем С.В. Ковальчук НИИ Наукоемких компьютерных технологий, СПбГУ ИТМО

Upload: errol

Post on 05-Jan-2016

61 views

Category:

Documents


1 download

DESCRIPTION

Разработка параллельных приложений для многоядерных систем. С.В. Ковальчук НИИ Наукоемких компьютерных технологий, СПбГУ ИТМО. Используемые средства. Intel C++ Compiler Оптимизирующий компилятор OpenMP, Intel Threading Building Blocks Средства распараллеливания для систем с общей памятью. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Разработка параллельных приложений для многоядерных систем

Разработка параллельных приложений для многоядерных

систем

С.В. Ковальчук

НИИ Наукоемких компьютерных технологий, СПбГУ ИТМО

Page 2: Разработка параллельных приложений для многоядерных систем

НИИ Наукоемких компьютерных технологий, СПбГУ ИТМОНИИ Наукоемких компьютерных технологий, СПбГУИТМО

Используемые средства

Intel C++ CompilerОптимизирующий компилятор

OpenMP, Intel Threading Building BlocksСредства распараллеливания для систем с общей памятью

Page 3: Разработка параллельных приложений для многоядерных систем

НИИ Наукоемких компьютерных технологий, СПбГУ ИТМОНИИ Наукоемких компьютерных технологий, СПбГУИТМО

Intel C++ Compiler

Архитектуры процессоровIA-32, x86-64 (Intel 64 and AMD64), IA-64, Xscale

Операционные системыMicrosoft Windows, Linux, Mac OS

Основные возможностиВысокоуровневая оптимизацияМежпроцедурная оптимизацияАвтоматическое распараллеливание кода:ВекторизацияРазделение циклов по нескольким нитямПрофилирующая оптимизация

Интеграция с VisualStudio

Page 4: Разработка параллельных приложений для многоядерных систем

НИИ Наукоемких компьютерных технологий, СПбГУ ИТМОНИИ Наукоемких компьютерных технологий, СПбГУИТМО

OpenMP

Распараллеливание на системах с общей памятью

Стандарт для языков C/С++, Fortran

Использование директив для распараллелива

Поддержка компиляторами Intel, Microsoft, GCC и т.п.

Расширение для разделенной памяти

Cluster OpenMP

Page 5: Разработка параллельных приложений для многоядерных систем

НИИ Наукоемких компьютерных технологий, СПбГУ ИТМОНИИ Наукоемких компьютерных технологий, СПбГУИТМО

Преимущества OpenMP

Поэтапное (инкрементальное) распараллеливаниеМожно распараллеливать последовательные программы поэтапно, не меняя их структуру

Единственность разрабатываемого кодаНет необходимости поддерживать последовательный и параллельный вариант программы, поскольку директивы игнорируются обычными компиляторами (в общем случае)

ЭффективностьУчет и использование возможностей систем с общей памятью

Стандартизованность (переносимость), поддержка в наиболее распространенных языках (C/C++, Fortran) и платформах (Windows, Unix)

Page 6: Разработка параллельных приложений для многоядерных систем

НИИ Наукоемких компьютерных технологий, СПбГУ ИТМОНИИ Наукоемких компьютерных технологий, СПбГУИТМО

Принцип организации параллелизма

Использование потоков (общее адресное пространство)

Пульсирующий (“вилочный”, fork-join) параллелизм

Page 7: Разработка параллельных приложений для многоядерных систем

НИИ Наукоемких компьютерных технологий, СПбГУ ИТМОНИИ Наукоемких компьютерных технологий, СПбГУИТМО

Состав библиотеки

Набор директив компилятора#pragma omp <директива> <параметры>

Библиотека функцийomp_...()

Набор переменных окружения

Page 8: Разработка параллельных приложений для многоядерных систем

НИИ Наукоемких компьютерных технологий, СПбГУ ИТМОНИИ Наукоемких компьютерных технологий, СПбГУИТМО

Использование OpenMP

Использование директивы parallel

#include <omp.h> main () { int nthreads, tid; #pragma omp parallel private(nthreads, tid) { tid = omp_get_thread_num(); printf("Hello World from thread = %d\n", tid); if (tid == 0) { nthreads = omp_get_num_threads(); printf("Number of threads = %d\n", nthreads); } } }

Page 9: Разработка параллельных приложений для многоядерных систем

НИИ Наукоемких компьютерных технологий, СПбГУ ИТМОНИИ Наукоемких компьютерных технологий, СПбГУИТМО

Способы распараллеливания

Распараллеливание цикла#pragma omp for

Распараллеливание секциями#pragma omp sections{ #pragma omp section { ...

} #pragma omp section { ...

}}

Выполнение кода одним потоком#pragma omp master#pragma omp single

Page 10: Разработка параллельных приложений для многоядерных систем

НИИ Наукоемких компьютерных технологий, СПбГУ ИТМОНИИ Наукоемких компьютерных технологий, СПбГУИТМО

Расписание (schedule)

Распределение итераций в директиве for регулируется параметром (clause) schedulestatic – итерации делятся на блоки по chunk итераций и статически разделяются между потоками; если параметр chunk не определен, итерации делятся между потоками равномерно и непрерывноdynamic – распределение итерационных блоков осуществляется динамически (по умолчанию chunk=1)guided – размер итерационного блока уменьшается экспоненциально при каждом распределении; chunk определяет минимальный размер блока (по умолчанию chunk=1)runtime – правило распределения определяется переменной OMP_SCHEDULE (при использовании runtime параметр chunk задаваться не должен)

Page 11: Разработка параллельных приложений для многоядерных систем

НИИ Наукоемких компьютерных технологий, СПбГУ ИТМОНИИ Наукоемких компьютерных технологий, СПбГУИТМО

Задача

Нахождение суммы тригонометрического ряда

double summ = 0;for (int k = 0; k < N; k++){

double ind = k;summ += ((k & 1) ? -1 : 1) *

(sin(ind*(ind + 1)) - cos(ind)*sin(ind*ind)) / (cos(ind*(1 - ind)) - 2*sin(ind)*sin(ind*ind)) * (sin(ind*(ind + 1)) - cos(ind)*sin(ind*ind)) / (cos(ind*(1 - ind)) - 2*sin(ind)*sin(ind*ind));

}}

Page 12: Разработка параллельных приложений для многоядерных систем

НИИ Наукоемких компьютерных технологий, СПбГУ ИТМОНИИ Наукоемких компьютерных технологий, СПбГУИТМО

Реализация распараллеливания

Добавление директивы OpenMP

double summ = 0;#pragma omp parallel forfor (int k = 0; k < N; k++){

double ind = k;summ += ((k & 1) ? -1 : 1) *

(sin(ind*(ind + 1)) - cos(ind)*sin(ind*ind)) / (cos(ind*(1 - ind)) - 2*sin(ind)*sin(ind*ind)) * (sin(ind*(ind + 1)) - cos(ind)*sin(ind*ind)) / (cos(ind*(1 - ind)) - 2*sin(ind)*sin(ind*ind));

}}

Page 13: Разработка параллельных приложений для многоядерных систем

НИИ Наукоемких компьютерных технологий, СПбГУ ИТМОНИИ Наукоемких компьютерных технологий, СПбГУИТМО

Организация синхронной работы потоков

Параллельный доступ к переменным

double summ = 0;#pragma omp parallel for reduction (+:summ)for (int k = 0; k < N; k++){

double ind = k;summ += ((k & 1) ? -1 : 1) *

(sin(ind*(ind + 1)) - cos(ind)*sin(ind*ind)) / (cos(ind*(1 - ind)) - 2*sin(ind)*sin(ind*ind)) * (sin(ind*(ind + 1)) - cos(ind)*sin(ind*ind)) / (cos(ind*(1 - ind)) - 2*sin(ind)*sin(ind*ind));

}}

Page 14: Разработка параллельных приложений для многоядерных систем

НИИ Наукоемких компьютерных технологий, СПбГУ ИТМОНИИ Наукоемких компьютерных технологий, СПбГУИТМО

Intel Threading Building Blocks

Высокоуровневая библиотека для разработки параллельных программ для систем с общей памятью

Реализована на языке C++ в форме классов и шаблонов

Поддерживаемые ОС: Microsoft Windows, Linux, Mac OS

Page 15: Разработка параллельных приложений для многоядерных систем

НИИ Наукоемких компьютерных технологий, СПбГУ ИТМОНИИ Наукоемких компьютерных технологий, СПбГУИТМО

Возможности Intel TBB

Решение типичных задач параллельного программирования

распараллеливание циклов с известным числом повторений;распараллеливание циклов с известным числом повторений с редукции;распараллеливание циклов с условием;распараллеливание рекурсии.

Кроме того, содержитпотокобезопасные контейнеры;аллокаторы, операторы выделения динамической памяти;примитивы синхронизации.

Page 16: Разработка параллельных приложений для многоядерных систем

НИИ Наукоемких компьютерных технологий, СПбГУ ИТМОНИИ Наукоемких компьютерных технологий, СПбГУИТМО

Пример кода с использованием Intel TBB

int main() { task_scheduler_init init; string str[N] = { string(”a”), string(”b”) }; for (size_t i = 2; i < N; ++i)

str[i] = str[i-1]+str[i-2]; string &to_scan = str[N-1]; size_t *max = new size_t[to_scan.size()]; size_t *pos = new size_t[to_scan.size()]; parallel_for(

blocked_range<size_t>(0, to_scan.size(), 100), SubStringFinder( to_scan, max, pos ) );

for (size_t I = 0; I < to_scan.size(); ++i) cout<<” ”<<max[i]<<”(”<< pos[i]<<”)”<< endl;

return 0; }

Page 17: Разработка параллельных приложений для многоядерных систем

НИИ Наукоемких компьютерных технологий, СПбГУ ИТМОНИИ Наукоемких компьютерных технологий, СПбГУИТМО

Ссылки

Intelhttp://www.intel.com/

OpenMPhttp://www.openmp.org/

Intel TBBhttp://threadingbuildingblocks.org/