581.45K
Категория: ПрограммированиеПрограммирование

Параллельное программирование. Параллельные архитектуры. Вычислительные комплексы и компьютеры

1.

ПАРАЛЛЕЛЬНОЕ
РОГРАММИРОВАНИЕ
Гусенков Александр Михайлович
[email protected]
Казанский федеральный университет
2020

2.

Параллельные архитектуры
Вычислительные комплексы и компьютеры делятся на три группы:
• Системы с распределенной памятью. Каждый процессор имеет
свою память и не может напрямую обращаться к памяти другого
процессора.
Программист в явном виде должен задать всю систему
коммуникации (Передача сообщений – Message Passing).
Библиотеки: MPI, PVM, Shmem (Cray only).
• Системы с общей (разделяемой) памятью. Процессор может
напрямую обращаться к памяти другого процессора. Процессоры
могут сидеть на одной шине (SMP). Разделяемая память может
быть физически распределенной, но тогда стоимость доступа к
удаленной памяти может быть очень высока, и это должен
учитывать разработчик ПП.
Подходы к разработке ПО: Threads, директивы компилятора
(OpenMP), механизм передачи сообщения.
• Комбинированные системы. В кластерах могут объединяться
компьютеры различной конфигурации.

3.

Параллельные архитектуры
• SISD
• SIMD
• MISD
• MIMD

4.

ТЕХНОЛОГИИ ПАРАЛЛЕЛЬНОГО
ПРОГРАММИРОВАНИЯ
• OpenMP
Параллельное программирование для системы
с общей памятью
• Mvi
Параллельное программирование для систем
с распределенной памятью (кластеров)
• CUDA
технология высокопроизводительных
вычислений, использующая графический
процессор (GPU).

5.

Программная модель OpenMP
• Основной поток порождает дочерние потоки
по мере необходимости
• Программирование путем вставки директив
компилятора в ключевые места исходного
кода программы.
• Компилятор интерпретирует эти директивы и
вставляет в соответствующие места
программы библиотечные вызовы для
распараллеливания участков кода.

6.

Последовательный код
void main(){
double x[1000];
for(i=0; i<1000; i++){
calc_smth(&x[i]);
}
}

7.

Параллельный код
void main(){
double x[1000];
#pragma omp parallel for
for(i=0; i<1000; i++){
calc_smth(&x[i]);
}
}

8.

• Директива #pragma omp parallel for указывает
на то, что данный цикл следует разделить по
итерациям между потоками.
• Количество потоков можно контролировать из
программы, или через среду выполнения
программы- переменную окружения
OMP_NUM_THREADS.
• Следует отметить, что разработчик
ответственен за синхронизацию потоков и
зависимость между данными.

9.

Microsoft Visual Studio 2019 Community
#include <iostream>
#include "omp.h"
int main()
{
omp_set_num_threads(4);
#pragma omp parallel
{
std::cout << "Total " << omp_get_num_threads() << " Proc " <<
omp_get_thread_num() << " Hello World!\n";
}
}

10.

Свойства проекта

11.

Установленные компоненты

12.

Microsoft Visual Studio 2015 Community
edition
Для выполнения практических заданий и завершения
курса «Введение в параллельное программирование с
использованием OpenMP и MPI» понадобится
следующее ПО:
• Microsoft Visual Studio 2015 Community edition
– интегрированная среда разработки
программного обеспечения. Visual Studio
включает в себя редактор исходного кода с
поддержкой технологии IntelliSense и
возможностью простейшего рефакторинга
кода.

13.

Microsoft Visual Studio 2015 Community
edition
• Intel Parallel Studio — параллельный пакет
разработки программного обеспечения Intel,
сочетающий в себе ведущие в индустрии
C/C++ компилятор и Fortran компилятор,
различные библиотеки, инструменты
профилирования и многое другое.
• HPC Pack 2008 SDK – набор инструментов
разработчика для создания программного
обеспечения специально для кластерных
сред

14.

Microsoft Visual Studio 2015 Community
edition

15.

Microsoft Visual Studio 2015 Community
edition

16.

Видокурсы
• https://www.intuit.ru/studies/courses/1111/295
/info
• https://www.intuit.ru/studies/courses/1112/232
/info

17.

Задачи
Задача 1
Написать программу где каждый поток печатает свой
идентификатор, количество потоков всего и строчку «Hello
World». Запустить программу с 8 потоками. Всегда ли вывод
идентичен? Почему?
Задача 2
Написать программу, в которой определить две параллельные
области, выполнение которых зависит от условного оператора
#pragma omp parallel if(…), если заданное значение числа
нитей больше 1, параллельная область выполняется, иначе не
выполняется. Число нитей перед первой областью задать равным
3, перед второй – равным 1. Внутри параллельных областей
определить количество нитей и номер каждой нити, результат
выдать на экран. Убедиться в правильности работы программы.

18.

Задача 3
Написать программу, в которой объявить и присвоить начальные
значения целочисленным переменным: a и b, определить две
параллельные области, первая – с числом нитей 2, вторая – с
числом нитей 4. Для первой области переменные a и b объявить
защищенными, с режимом доступа private и firstprivate
соответственно, внутри области определить номер нити и
выполнить увеличение значения переменных на это величину.
Выдать на экран значения переменных до входа в параллельную
область, внутри параллельной области и после выхода из
параллельной области. Для второй области переменную a
объявить общей, переменную b объявить защищенной, с
режимом доступа private, определить номер нити и выполнить
уменьшение значения переменных на это величину. Выдать на
экран значения переменных до входа в параллельную область,
внутри параллельной области и после выхода из параллельной
области.

19.

Задача 4
Написать программу, в которой объявить и присвоить начальные
значения целочисленным массивам a[10] и b[10], определить
параллельную область, количество нитей задать равным 2,
выделить код для основной (номер 0) и нити с номером 1.
Основная нить должна выполнять поиск min значения элементов
массива a, нить с номером 1 - поиск max значения элементов
массива b. Результат выдать на экран.

20.

Спасибо за внимание!
English     Русский Правила