Общие и частные переменные в openmp программа скрытая ошибка
Пример входных и выходных данных для 2-х процессов
4. Методические указания
1. Технология программирования OpenMP
Указания к заданию 1. Создание проекта в среде MS Visual Studio с поддерж-
1. Создайте на рабочем столе папку с вашей фамилией.
2. Запустите Microsoft Visual Studio 2010. Внимание! При первом запуске
Visual Studio выберите интерфейс по умолчанию «Параметры разработки
3. Создание проекта . Для этого выберите пункт в меню File -> New -> Project , или нажмите Ctrl+Shift+N
4. В окне New Project в раскрывающемся списке Visual
C++ выбирите Win32 . В подокне в середине выберите Win32 Console Application . Внизу введите имя проекта Name (например, example1), и место расположения проекта Location (укажите папку с вашей фамилией на рабочем столе), и нажмите кнопку OK . См. рис. 3.1.
5. В открывшемся окне Win32 Application Wizard - example1 нажмите кноп-
6. Теперь создадим файл с кодом приложения . Выберите пункт в ме-
-> Add New Item , или нажмите Ctrl+Shift+A. В категории Visual
C++ выберите подкатегорию Code . В подокне в середине установите С++ File (.cpp) . Введите имя файла, например, source, и нажмите кнопку Add . См. рис. 3.3.
7. В открывшемся окне source.cpp введите следующий код на языке С:
Сохраните файл, выбрав пункт меню File -> Save source.cpp , или нажав
8. Для компиляции приложения выберите пункт меню Debug -> Build Solution , или нажмите F7.
9. Для запуска приложения выберите пункт меню Debug -> Start Without Debugging , или нажмите Ctrl+F5. См. рис. 3.4.
10. Для включения поддержки OpenMP установите дополнительные параметры компиляции проекта:
В главном меню выберите Project -> Имя_проекта Properties
11. Для компиляции приложения нажмите F7.
12. Для запуска приложения нажмите Ctrl+F5.
Указания к заданию 2. Многопоточная программа «Hello World!»
1. Создайте проект omp_intro в Microsoft Visual Studio 2010 с поддержкой
OpenMP (см. указания к заданию 1).
2. Напишите программу, печатающую на экран строку «Hello World!».
3. Подключите заголовочный файл omp.h с функциями и переменными OpenMP. Строка подключения заголовочного файла:
4. В функции main создайте параллельную область с помощью OpenMPдирективы parallel. Обратите внимание , что открывающаяся фигурная скобка и название директивы должны находиться в разных строках! Поместите команду вывода строки «Hello World!» внутрь параллельной области.
printf( "Hello World!\n" );
5. Задайте количество нитей в параллельной области одним из следующих способов:
Способ 1 . Вызовите функцию omp_set_num_threads() перед началом па-
раллельной области. В качестве параметра укажите одно целое число – количество нитей в параллельной области:
printf( "Hello World!\n" );
Способ 2 . Добавьте к директиве parallel параметр num_threads(). В качестве параметра укажите одно целое число – количество нитей в параллельной области:
printf( "Hello World!\n" );
6. Скомпилируйте и запустите ваше приложение. Убедитесь, что строка «Hello World!» выводится на экран столько раз, сколько нитей вы задали в параллельной области.
Указания к заданию 3. Программа «I am!»
1. Откройте проект omp_intro в Microsoft Visual Studio 2010 (см. указания к заданию 2).
2. Определите параметр k. В параллельной области функции main задайте k нитей.
3. Для получения номера нити внутри параллельной области необходимо вызвать OpenMP-функцию omp_get_thread_num() . Для получения значения количества нитей внутри параллельной области необходимо вызвать
В параллельную область вставьте следующий код для вывода на экран строки:
printf( "I am %d thread from %d threads!\n" , omp_get_thread_num(), //Номер нити в параллельной области omp_get_num_threads() //Количество нитей в параллельной области
4. Скомпилируйте и запустите ваше приложение. Убедитесь, что результат верный.
5. В параллельной области с помощью оператора if определите четный ли номер нити и выводите строку « I am thread from threads! » только в случае четного номера.
6. Скомпилируйте и запустите ваше приложение. Убедитесь, что результат верный.
Указания к заданию 4. Общие и частные переменные в OpenMP: программа «Скрытая ошибка»
1. Создайте проект omp_hide_error в Microsoft Visual Studio 2010 с поддерж-
кой OpenMP (см. указания к заданию 1).
2. В функции main создайте параллельную область c k нитями. Вставьте следующий код:
rank = omp_get_thread_num(); printf( "I am %d thread.\n" , rank);
3. Определите переменную rank как общую. Для этого достаточно объявить переменную rank до начала параллельной области. Скомпилируйте и запустите ваше приложение. Верный ли результат выдает программа?
4. Добавьте в параллельную область код, имитирующий длительные вычисления, следующим образом:
Sleep(100); // Имитация длительных вычислений printf( "I am %d thread.\n" , rank);
Справка: функция Sleep приостановит выполнение программы на указанный интервал времени, заданный во входном параметре в миллисекундах. Для использования данной функции в вашей программе необходимо подключить заголовочный файл Windows.h.
5. Скомпилируйте и запустите ваше приложение. Верный ли результат выдает программа?
6. Переопределите переменную rank как частную. Для этого добавьте к директиве parallel параметр private(), в круглые скобки поместите перемен-
7. Скомпилируйте и запустите ваше приложение. Объясните все полученные выше результаты.
Указания к заданию 5. Общие и частные переменные в OpenMP: параметр reduction
1. Создайте проект omp_reduction в Microsoft Visual Studio 2010 с поддерж-
кой OpenMP (см. указания к заданию 1).
2. В функции main создайте параллельную область c 2-я нитями.
3. Для распределения вычислений по нитям в параллельной области напишите следующую конструкцию:
if (omp_get_thread_num() == 0)
// вычисления для нити с номером 0
// вычисления для нити с номером 1
Напишите для нити с номером 0 цикл, вычисляющий сумму чисел от 1 до N/2, а для нити с номером 1 – от N/2 до N. Частичные суммы запишите в переменную sum.
4. Общей или частной должна быть переменная sum? Переменная sum
должна быть с одной стороны частной, чтобы избежать ошибки потери слагаемого при одновременной записи в нее двумя нитями, а с другой стороны – должна быть общей, чтобы иметь возможность сложить частичные суммы, подсчитанные нитями. Для таких случаев удобно исполь-
зовать OpenMP-параметр reduction.
5. Вставьте в директиве parallel параметр reduction:
Синтаксис параметра reduction:
reduction( операция : список ) , где
список – это список общих переменных, для каждой из которых создаются локальные копии в каждой нити. Над локальными копиями переменных после выполнения всех операторов параллельной области выполняется операция . Локальные копии инициализируются соответственно типу операции (для аддитивных операций – 0 или его аналоги, для мультипликативных операций – 1 или ее аналоги).
6. Скомпилируйте и запустите ваше приложение. Убедитесь, что выдается верный результат.
Указания к заданию 6. Распараллеливание циклов в OpenMP: программа «Сумма чисел»
1. Откройте проект omp_reduction в Microsoft Visual Studio 2010 (см. указа-
ния к заданию 5).
2. Определите параметр k. В параллельной области функции main задайте k нитей.
3. В параллельную область вставьте директиву for, которая самостоятельно будет производить распределение итераций по нитям:
После директивы for должен идти только оператор for языка С. Счетчик цикла должен принимать все (!) значения от 1 до N:
// вычисление суммы чисел от 1 до N >
4. В результате выполнения такого цикла каждая из k нитей будет выполнять k-ю часть всех имеющихся итераций цикла. При этом на вид параллельных циклов накладывается ограничение: программа не должна зависеть от того, какая именно нить, какую итерацию параллельного цикла выполнит,
т.е. итерации цикла должны быть не зависимы !
В данной задаче это условие выполняется, т.к. очередность сложения слагаемых не важна.
5. Для сложения частичных сумм используйте параметр reduction.
6. Скомпилируйте и запустите ваше приложение. Убедитесь, что выдается верный результат.
Указания к заданию 7. Распараллеливание циклов в OpenMP: параметр schedule
1. Откройте проект omp_reduction в Microsoft Visual Studio 2010 (см. указа-
ния к заданию 6).
calculation of the iteration number . ».
2. Добавьте для директивы for параметр schedule, который задает, каким образом итерации цикла распределяются между нитями. Присваивая ему поочередно значения из таблицы, компилируйте и запускайте ваше приложение. Результаты выполнения запишите в таблицу, данную в задании.
Синтаксис параметра schedule:
schedule( type[ , chunk] ) ,
где type задает тип распределения итераций; основные значения следующие:
static – блочно-циклическое распределение итераций цикла; размер блока – chunk. Первый блок из chunk итераций выполняет нулевая нить, второй блок — следующая и т.д. до последней нити, затем распределение снова начинается с нулевой нити. Если значение chunk не указано, то все множество итераций делится на непрерывные куски примерно одинакового размера (конкретный способ зависит от реализации), и полученные порции итераций распределяются между нитями.
dynamic – динамическое распределение итераций с фиксированным
размером блока: сначала каждая нить получает chunk итераций (по умолчанию chunk=1), та нить, которая заканчивает выполнение своей порции итераций, получает первую свободную порцию из chunk итераций. Освободившиеся нити получают новые порции итераций до тех пор, пока все порции не будут исчерпаны. Последняя порция может содержать меньше итераций, чем все остальные.
guided – динамическое распределение итераций, при котором размер порции уменьшается с некоторого начального значения до величины chunk (по умолчанию chunk=1) пропорционально количеству еще не распределенных итераций, деленному на количество нитей, выполняющих цикл. Размер первоначально выделяемого блока зависит от реализации. В ряде случаев такое распределение позволяет аккуратнее разделить работу и сбалансировать загрузку нитей. Количество итераций в последней порции может оказаться меньше значения chunk.
Указания к заданию 8. Распараллеливание циклов в OpenMP: программа «Число »
1. Создайте проект omp_pi в Microsoft Visual Studio 2010 с поддержкой
OpenMP (см. указания к заданию 1).
2. Напишите последовательную программу, вычисляющую число с точностью до N знаков после запятой по приведенной в задании формуле.
3. Определите код, который можно распараллелить, и задайте параллельную область с помощью директивы parallel.
4. Для распределения работы по нитям используйте OpenMP-директиву for. Убедитесь, что все итерации распараллеливаемого цикла независимы!
5. Изучите все переменные в параллельной области. Определите, общие переменные, частные и reduction.
6. Скомпилируйте и запустите ваше приложение. Убедитесь, что выдается верный результат.
Указания к заданию 9. Распараллеливание циклов в OpenMP: программа «Матрица»
1. Создайте проект omp_matrix в Microsoft Visual Studio 2010 с поддержкой
OpenMP (см. указания к заданию 1).
2. Напишите последовательную программу, вычисляющую произведение матриц по приведенной в задании формуле.
3. Определите код, который можно распараллелить, и задайте параллельную область с помощью директивы parallel.
4. Определите цикл for, подходящий для распараллеливания. Используйте для него OpenMP-директиву for.
Здравствуйте, уже давно копаюсь с кодом, но никак не пойму в чем ошибка, искал в инете похожие задания.
Вот мое задание: Напишите параллельную программу, находящую сумму max элементов строк матрицы.
Я писал много вариантов, но все они приходят к одной и той же ошибке:
Предупреждение C6993 При анализе кода структуры OpenMP игнорируются; анализируется код одного потока.
Вроде сама прога работает правильно, но не параллелится.
Я уже хз что делать, такое чувство что-где то мини-косяк, который я тупо не понимаю, помогите, пожалуйста.
Желательно с объяснением.
OpenMP. Время выполнения программы больше чем без OpenMP
Сегодня первый раз сел за OpenMP. Читаю на сайте майкрософта как работает этот API. Так вот там.
OpenMP
здравствуйте, народ я делал консольное приложение с openmp, решил вот красиво оформить в формочку.
OpenMP
Здравствуйте! Подскажите, что значит данная строчка: srand(time(0) + 1000 * omp_get_thread_num());
Я писал много вариантов, но все они приходят к одной и той же ошибке:
Предупреждение C6993 При анализе кода структуры OpenMP игнорируются; анализируется код одного потока.
In17, Изменение summax должно быть внутри блока редукции, иначе он уже не будет локальным.
приватные переменные лучше объявлять внутри параллельной секции, тогда их не надо специально помечать:
Включал, хотя похоже у меня тупит сам вижак, потому что даже в других программах это предупреждение выскакивает, хотя там работает не один поток
Добавлено через 5 минут
В начале я так и делал, просто потом решил вытащить, похоже дело в самом вижаке, потому что даже в программах попроще это предупреждение выскакивает, хотя там работает несколько потоков(видно по выводу), теперь даже не знаю что делать, разве что пытаться проверять с помощью таймера.
хотя очень странное предупреждение
Добавлено через 5 часов 13 минут
Все я окончательно пришел к выводу, что программа хоть и слегка правленная работает, просто в вижаке баг с этим предупреждением, хотя я впервые сталкиваюсь с этим.
Все я окончательно пришел к выводу, что программа хоть и слегка правленная работает, просто в вижаке баг с этим предупреждением, хотя я впервые сталкиваюсь с этим.
Так это предупреждение IntelliSense. Не смотри их вообще, поставь в Error List - Build Only, вместо Build + IntelliSense.
Qt и OpenMp
Доброго времени суток Установил QT на мак. есть программа, в которой присутствует.
OpenMP
Здравствуйте! Нужна помощь с OpenMP, не могу понять как распараллелить цикл. void.
Qt и openMP
Здравствуйте. Хочется написать программу для решегия уравнения Бюргерса. Попытался распаралелить с.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Задание 1. Создание проекта в среде MS Visual Studio с поддержкой OpenMP .
Задание 2. Многопоточная программа «Hello World!».
Задание 3. Программа «I am!».
Задание 4. Общие и частные переменные в OpenMP: программа «Скрытая ошибка» .
Задание 5. Общие и частные переменные в OpenMP: параметр reduction .
Задание 6. Распараллеливание циклов в OpenMP: программа «Сумма чисел» .
Задание 7. Распараллеливание циклов в OpenMP: параметр schedule .
Задание 8. Распараллеливание циклов в OpenMP: программа «Число ».
Задание 9. Распараллеливание циклов в OpenMP: программа «Матрица» .
Задание 10. Параллельные секции в OpenMP: программа «I'm here» .
Задание 11. Гонка потоков в OpenMP: программа «Сумма чисел» с atomic .
Задание 12. Гонка потоков в OpenMP: программа «Число » с critical .
Задание 13. Исследование масштабируемости OpenMP-программ .
Технология программирования MPI.
Задание 14. Создание проекта в среде MS Visual Studio с поддержкой MPI .
Задание 15. Программа «I am!».
Задание 16. Программа «На первый-второй рассчитайся!».
Задание 17. Коммуникации «точка-точка»: простые блокирующие обмены.
Задание 18. Коммуникации "точка-точка": схема «эстафетная палочка» .
Задание 19. Коммуникации «точка-точка»: схема «мастер-рабочие» .
Задание 20. Коммуникации «точка-точка»: простые неблокирующие обмены.
Задание 21. Коммуникации «точка-точка»: схема «сдвиг по кольцу».
Задание 22. Коммуникации «точка-точка»: схема «каждый каждому».
Задание 23. Коллективные коммуникации: широковещательная рассылка данных .
Задание 24. Коллективные коммуникации: операции редукции .
Задание 25. Коллективные коммуникации: функции распределения и сбора данных .
Задание 26. Группы и коммуникаторы.
Задание 27*. MPI-2: динамическое создание процессов .
Задание 28*. MPI-2: односторонние коммуникации.
Задание 29. Исследование масштабируемости MPI-программ.
Технология программирования MPI+OpenMP .
Задание 30. Проект в среде Visual Studio 2010 с поддержкой MPI и OpenMP.
Задание 31. Программа «I am» .
Задание 32. Программа «Число » .
1. Технология программирования OpenMP .
Указания к заданию 1. Создание проекта в среде MS Visual Studio с поддержкой
Указания к заданию 2. Многопоточная программа «Hello World!» .
Указания к заданию 3. Программа «I am!» .
Указания к заданию 4. Общие и частные переменные в OpenMP: программа «Скрытая
Указания к заданию 5. Общие и частные переменные в OpenMP: параметр reduction 27
Указания к заданию 6. Распараллеливание циклов в OpenMP: программа «Сумма
Указания к заданию 7. Распараллеливание циклов в OpenMP: параметр schedule .
Указания к заданию 8. Распараллеливание циклов в OpenMP: программа «Число » 30
Указания к заданию 9. Распараллеливание циклов в OpenMP: программа «Матрица»
Указания к заданию 10. Параллельные секции в OpenMP: программа «I'm here» .
Указания к заданию 11. Гонка потоков в OpenMP: программа «Сумма чисел» с
Указания к заданию 12. Гонка потоков в OpenMP: программа «Число » с critical .
Указания к заданию 13. Исследование масштабируемости OpenMP-программ.
2. Технология программирования MPI.
Указания к заданию 14. Создание проекта в среде MS Visual Studio с поддержкой MPI
Указания к заданию 15. Программа «I am!» .
Указания к заданию 16. Программа «На первый-второй рассчитайся!» .
Указания к заданию 17. Коммуникации «точка-точка»: простые блокирующие
Указания к заданию 18. Коммуникации "точка-точка": схема «эстафетная палочка».45
Указания к заданию 19. Коммуникации «точка-точка»: схема «мастер-рабочие».
Указания к заданию 20. Коммуникации «точка-точка»: простые неблокирующие
Указания к заданию 21. Коммуникации «точка-точка»: схема «сдвиг по кольцу».
Указания к заданию 22. Коммуникации «точка-точка»: схема «каждый каждому» .
Указания к заданию 23. Коллективные коммуникации: широковещательная рассылка
Указания к заданию 24. Коллективные коммуникации: операции редукции .
Указания к заданию 25. Коллективные коммуникации: функции распределения и
Указания к заданию 26. Группы и коммуникаторы .
Указания к заданию 27. MPI-2: динамическое создание процессов .
Указания к заданию 28. MPI-2: односторонние коммуникации .
Указания к заданию 29. Исследование масштабируемости MPI-программ .
3. Технология программирования MPI+OpenMP.
Указания к заданию 30.
Проект в среде Visual Studio 2010 с поддержкой MPI и
Указания к заданию 31.
Указания к заданию 31.
1. Технология программирования OpenMP
Задание 1. Создание проекта в среде MS Visual Studio с поддержкой
Создайте проект в среде MS Visual Studio 2010 с поддержкой OpenMP.
Задание 2. Многопоточная программа «Hello World!»
Напишите OpenMP-программу, в которой создается 4 нити и каждая нить выводит на экран строку « Hello World! ».
Выходные данные: 4-е строки « Hello World! ».
Пример входных и выходных данных
Задание 3. Программа «I am!»
1. Напишите программу, в которой создается k нитей, и каждая нить выводит на экран свой номер и общее количество нитей в параллельной области в формате:
Выходные данные: k строк вида « I am thread from
личество нитей> threads! ».
Пример входных и выходных данных
2. Модифицируйте программу таким образом, чтобы строку I am
мер нити> thread from threads! выводили только
нити с четным номером.
Пример входных и выходных данных
Задание 4. Общие и частные переменные в OpenMP: программа «Скрытая ошибка»
Изучите конструкции для управления работой с данными shared и private. Напишите программу, в которой создается k нитей, и каждая нить выводит на экран свой номер через переменную rank следующим образом:
rank = omp_get_thread_num(); printf( "I am %d thread.\n" , rank);
Экспериментами определите, общей или частной должна быть перемен-
Выходные данные: k строк вида « I am . ».
Пример входных и выходных данных
Задание 5. Общие и частные переменные в OpenMP: параметр reduction
1. Напишите программу, в которой две нити параллельно вычисляют сумму чисел от 1 до N. Распределите работу по нитям с помощью оператора if языка С. Для сложения результатов вычисления нитей воспользуйтесь OpenMP-параметром reduction.
Выходные данные: каждая нить выводит свою частичную сумму в формате
« [Номер_нити]: Sum = », один раз выводится общая
сумма в формате « Sum = ».
Пример входных и выходных данных
2*. Модифицируйте программу таким образом, чтобы она работала для k нитей.
Выходные данные: каждая нить выводит свою частичную сумму в формате
« [Номер_нити]: Sum = », один раз выводится общая
сумма в формате « Sum = ».
Пример входных и выходных данных
Задание 6. Распараллеливание циклов в OpenMP: программа «Сумма чисел»
Изучите OpenMP-директиву параллельного выполнения цикла for. Напишите программу, в которой k нитей параллельно вычисляют сумму чисел от 1 до N. Распределите работу по нитям с помощью OpenMP-директивы for.
Выходные данные: каждая нить выводит свою частичную сумму в формате
« [Номер_нити]: Sum = », один раз выводится общая
сумма в формате « Sum = ».
Пример входных и выходных данных
Задание 7. Распараллеливание циклов в OpenMP: параметр schedule
[]: calculation of the iteration number .
Задайте k = 4, N = 10. Заполните следующую таблицу распределения итераций цикла по нитям в зависимости от параметра schedule:
Значение параметра schedule
Задание 8. Распараллеливание циклов в OpenMP: программа «Число »
1. Напишите OpenMP-программу, которая вычисляет число с точностью до N знаков после запятой. Используйте следующую формулу:
Пример входных и выходных данных
Задание 9. Распараллеливание циклов в OpenMP: программа «Матрица»
Напишите OpenMP-программу, которая вычисляет произведение двух квадратных матриц × = С размера × . Используйте следующую формулу:
Выходные данные: n 2 вещественных элементов матрицы С .
Пример входных и выходных данных
Задание 10. Параллельные секции в OpenMP: программа «I'm here»
Запустите приложение на 2-х, 3-х, 4-х нитях. Проследите, как нити распределяются по параллельным секциям.
Выходные данные: k-строк вида « []: came in section », k-строк вида « []: parallel region ».
Пример входных и выходных данных
[0]: came in section 1
[1]: came in section 2
[2]: came in section 3
[0]: parallel region
[1]: parallel region
[2]: parallel region
Задание 11. Гонка потоков 1 в OpenMP: программа «Сумма чисел» с atomic
Перепишите программу, в которой параллельно вычисляется сумма чисел от 1 до N (см. задание 6), без использования параметра reduction. Вместо параметра reduction используйте директиву atomic.
Задание 12. Гонка потоков в OpenMP: программа «Число » с critical
Перепишите параллельную программу вычисления числа (см. задание 8) без использования параметра reduction. Вместо параметра reduction используйте директиву critical.
Задание 13. Исследование масштабируемости OpenMP-программ
1. Проведите серию экспериментов на персональном компьютере по исследованию масштабируемости OpenMP-программ. Заполните следующую таблицу:
«Матрица» (см. задание 9 )
На основании данных таблицы постройте график масштабируемости для каждого значения параметра N. Определите для каждого графика, при каком количестве нитей достигается максимальное ускорение.
2. Проведите серию экспериментов на суперкомпьютере по исследованию масштабируемости OpenMP-программ. Заполните следующую таблицу:
1 Гонка потоков (race conditions) – ситуация когда результат вычислений зависит от темпа выполнения программы нитями. Для исключения гонки необходимо обеспечить, чтобы изменение значений общих переменных осуществлялось в каждый момент времени только одним единственным потоком. В OpenMP это может быть организовано следующими основными механизмами:
Задание 1. Создание проекта в среде MS Visual Studio с поддержкой OpenMP .
Задание 2. Многопоточная программа «Hello World!».
Задание 3. Программа «I am!».
Задание 4. Общие и частные переменные в OpenMP: программа «Скрытая ошибка» .
Задание 5. Общие и частные переменные в OpenMP: параметр reduction .
Задание 6. Распараллеливание циклов в OpenMP: программа «Сумма чисел» .
Задание 7. Распараллеливание циклов в OpenMP: параметр schedule .
Задание 8. Распараллеливание циклов в OpenMP: программа «Число ».
Задание 9. Распараллеливание циклов в OpenMP: программа «Матрица» .
Задание 10. Параллельные секции в OpenMP: программа «I'm here» .
Задание 11. Гонка потоков в OpenMP: программа «Сумма чисел» с atomic .
Задание 12. Гонка потоков в OpenMP: программа «Число » с critical .
Задание 13. Исследование масштабируемости OpenMP-программ .
Технология программирования MPI.
Задание 14. Создание проекта в среде MS Visual Studio с поддержкой MPI .
Задание 15. Программа «I am!».
Задание 16. Программа «На первый-второй рассчитайся!».
Задание 17. Коммуникации «точка-точка»: простые блокирующие обмены.
Задание 18. Коммуникации "точка-точка": схема «эстафетная палочка» .
Задание 19. Коммуникации «точка-точка»: схема «мастер-рабочие» .
Задание 20. Коммуникации «точка-точка»: простые неблокирующие обмены.
Задание 21. Коммуникации «точка-точка»: схема «сдвиг по кольцу».
Задание 22. Коммуникации «точка-точка»: схема «каждый каждому».
Задание 23. Коллективные коммуникации: широковещательная рассылка данных .
Задание 24. Коллективные коммуникации: операции редукции .
Задание 25. Коллективные коммуникации: функции распределения и сбора данных .
Задание 26. Группы и коммуникаторы.
Задание 27*. MPI-2: динамическое создание процессов .
Задание 28*. MPI-2: односторонние коммуникации.
Задание 29. Исследование масштабируемости MPI-программ.
Технология программирования MPI+OpenMP .
Задание 30. Проект в среде Visual Studio 2010 с поддержкой MPI и OpenMP.
Задание 31. Программа «I am» .
Задание 32. Программа «Число » .
1. Технология программирования OpenMP .
Указания к заданию 1. Создание проекта в среде MS Visual Studio с поддержкой
Указания к заданию 2. Многопоточная программа «Hello World!» .
Указания к заданию 3. Программа «I am!» .
Указания к заданию 4. Общие и частные переменные в OpenMP: программа «Скрытая
Указания к заданию 5. Общие и частные переменные в OpenMP: параметр reduction 27
Указания к заданию 6. Распараллеливание циклов в OpenMP: программа «Сумма
Указания к заданию 7. Распараллеливание циклов в OpenMP: параметр schedule .
Указания к заданию 8. Распараллеливание циклов в OpenMP: программа «Число » 30
Указания к заданию 9. Распараллеливание циклов в OpenMP: программа «Матрица»
Указания к заданию 10. Параллельные секции в OpenMP: программа «I'm here» .
Указания к заданию 11. Гонка потоков в OpenMP: программа «Сумма чисел» с
Указания к заданию 12. Гонка потоков в OpenMP: программа «Число » с critical .
Указания к заданию 13. Исследование масштабируемости OpenMP-программ.
2. Технология программирования MPI.
Указания к заданию 14. Создание проекта в среде MS Visual Studio с поддержкой MPI
Указания к заданию 15. Программа «I am!» .
Указания к заданию 16. Программа «На первый-второй рассчитайся!» .
Указания к заданию 17. Коммуникации «точка-точка»: простые блокирующие
Указания к заданию 18. Коммуникации "точка-точка": схема «эстафетная палочка».45
Указания к заданию 19. Коммуникации «точка-точка»: схема «мастер-рабочие».
Указания к заданию 20. Коммуникации «точка-точка»: простые неблокирующие
Указания к заданию 21. Коммуникации «точка-точка»: схема «сдвиг по кольцу».
Указания к заданию 22. Коммуникации «точка-точка»: схема «каждый каждому» .
Указания к заданию 23. Коллективные коммуникации: широковещательная рассылка
Указания к заданию 24. Коллективные коммуникации: операции редукции .
Указания к заданию 25. Коллективные коммуникации: функции распределения и
Указания к заданию 26. Группы и коммуникаторы .
Указания к заданию 27. MPI-2: динамическое создание процессов .
Указания к заданию 28. MPI-2: односторонние коммуникации .
Указания к заданию 29. Исследование масштабируемости MPI-программ .
3. Технология программирования MPI+OpenMP.
Указания к заданию 30.
Проект в среде Visual Studio 2010 с поддержкой MPI и
Указания к заданию 31.
Указания к заданию 31.
1. Технология программирования OpenMP
Задание 1. Создание проекта в среде MS Visual Studio с поддержкой
Создайте проект в среде MS Visual Studio 2010 с поддержкой OpenMP.
Задание 2. Многопоточная программа «Hello World!»
Напишите OpenMP-программу, в которой создается 4 нити и каждая нить выводит на экран строку « Hello World! ».
Выходные данные: 4-е строки « Hello World! ».
Пример входных и выходных данных
Задание 3. Программа «I am!»
1. Напишите программу, в которой создается k нитей, и каждая нить выводит на экран свой номер и общее количество нитей в параллельной области в формате:
Выходные данные: k строк вида « I am thread from
личество нитей> threads! ».
Пример входных и выходных данных
2. Модифицируйте программу таким образом, чтобы строку I am
мер нити> thread from threads! выводили только
нити с четным номером.
Пример входных и выходных данных
Задание 4. Общие и частные переменные в OpenMP: программа «Скрытая ошибка»
Изучите конструкции для управления работой с данными shared и private. Напишите программу, в которой создается k нитей, и каждая нить выводит на экран свой номер через переменную rank следующим образом:
rank = omp_get_thread_num(); printf( "I am %d thread.\n" , rank);
Экспериментами определите, общей или частной должна быть перемен-
Выходные данные: k строк вида « I am . ».
Пример входных и выходных данных
Задание 5. Общие и частные переменные в OpenMP: параметр reduction
1. Напишите программу, в которой две нити параллельно вычисляют сумму чисел от 1 до N. Распределите работу по нитям с помощью оператора if языка С. Для сложения результатов вычисления нитей воспользуйтесь OpenMP-параметром reduction.
Выходные данные: каждая нить выводит свою частичную сумму в формате
« [Номер_нити]: Sum = », один раз выводится общая
сумма в формате « Sum = ».
Пример входных и выходных данных
2*. Модифицируйте программу таким образом, чтобы она работала для k нитей.
Выходные данные: каждая нить выводит свою частичную сумму в формате
« [Номер_нити]: Sum = », один раз выводится общая
сумма в формате « Sum = ».
Пример входных и выходных данных
Задание 6. Распараллеливание циклов в OpenMP: программа «Сумма чисел»
Изучите OpenMP-директиву параллельного выполнения цикла for. Напишите программу, в которой k нитей параллельно вычисляют сумму чисел от 1 до N. Распределите работу по нитям с помощью OpenMP-директивы for.
Выходные данные: каждая нить выводит свою частичную сумму в формате
« [Номер_нити]: Sum = », один раз выводится общая
сумма в формате « Sum = ».
Пример входных и выходных данных
Задание 7. Распараллеливание циклов в OpenMP: параметр schedule
[]: calculation of the iteration number .
Задайте k = 4, N = 10. Заполните следующую таблицу распределения итераций цикла по нитям в зависимости от параметра schedule:
Значение параметра schedule
Задание 8. Распараллеливание циклов в OpenMP: программа «Число »
1. Напишите OpenMP-программу, которая вычисляет число с точностью до N знаков после запятой. Используйте следующую формулу:
Пример входных и выходных данных
Задание 9. Распараллеливание циклов в OpenMP: программа «Матрица»
Напишите OpenMP-программу, которая вычисляет произведение двух квадратных матриц × = С размера × . Используйте следующую формулу:
Выходные данные: n 2 вещественных элементов матрицы С .
Пример входных и выходных данных
Задание 10. Параллельные секции в OpenMP: программа «I'm here»
Запустите приложение на 2-х, 3-х, 4-х нитях. Проследите, как нити распределяются по параллельным секциям.
Выходные данные: k-строк вида « []: came in section », k-строк вида « []: parallel region ».
Пример входных и выходных данных
[0]: came in section 1
[1]: came in section 2
[2]: came in section 3
[0]: parallel region
[1]: parallel region
[2]: parallel region
Задание 11. Гонка потоков 1 в OpenMP: программа «Сумма чисел» с atomic
Перепишите программу, в которой параллельно вычисляется сумма чисел от 1 до N (см. задание 6), без использования параметра reduction. Вместо параметра reduction используйте директиву atomic.
Задание 12. Гонка потоков в OpenMP: программа «Число » с critical
Перепишите параллельную программу вычисления числа (см. задание 8) без использования параметра reduction. Вместо параметра reduction используйте директиву critical.
Задание 13. Исследование масштабируемости OpenMP-программ
1. Проведите серию экспериментов на персональном компьютере по исследованию масштабируемости OpenMP-программ. Заполните следующую таблицу:
«Матрица» (см. задание 9 )
На основании данных таблицы постройте график масштабируемости для каждого значения параметра N. Определите для каждого графика, при каком количестве нитей достигается максимальное ускорение.
2. Проведите серию экспериментов на суперкомпьютере по исследованию масштабируемости OpenMP-программ. Заполните следующую таблицу:
1 Гонка потоков (race conditions) – ситуация когда результат вычислений зависит от темпа выполнения программы нитями. Для исключения гонки необходимо обеспечить, чтобы изменение значений общих переменных осуществлялось в каждый момент времени только одним единственным потоком. В OpenMP это может быть организовано следующими основными механизмами:
Читайте также: