В процессе создания программы крайне важным для качества будущего продукта является этап отладки, на котором обнаруживаются, локализуются и устраняются ошибки. Это непростая и трудоемкая работа, причем сложность отладки существенно зависит от выбранного языка программирования.
Чтобы программист мог наблюдать за выполнением созданного кода, обычно используется программный инструмент, называемый отладчиком. Он предоставляет программисту возможность отслеживать изменения значений переменных при пошаговом выполнении программы с помощью развитого пользовательского интерфейса. Однако ситуация значительно изменяется, когда заходит речь об отладке и тестировании многопоточных приложений.
То, каким образом и с использованием каких средств будет проходить отладка приложения, в существенной степени зависит от языка программирования. А если вы пишете многопоточную программу, то помимо выбора языка программирования нужно определить, каким образом реализовывать параллелизм. Обилие различных технологий все только усложняет, ведь создать универсальный отладчик практически невозможно.
OpenMP: ParallelFor
Отладка последовательной программы основана на том, что степень предсказуемости начального и текущего состояний программы определяется входными данными. Когда программист переходит к отладке многопоточного кода, то он обычно сталкивается с совершенно уникальными проблемами: в различных операционных системах применяются разные стратегии планирования, нагрузка на вычислительную систему динамически изменяется, приоритеты процессов могут различаться и т. д. Так, точное воссоздание программы в некоторый момент ее выполнения (тривиальная задача для последовательной отладки) значительно усложняется при переходе к параллельной программе, что связано с недетерминированным поведением последней. Иными словами, поведение запущенных в системе процессов, а именно их выполнение и ожидание выполнения, взаимные блокировки и проч., зависит от случайных событий, происходящих в системе. Как же быть? Очевидно, для отладки параллельного кода требуются совершенно другие средства.
Еще недавно использование параллельных вычислительных систем и, следовательно, параллельная отладка не носили массовый характер. Однако можно утверждать, что сейчас многоядерные процессоры заняли потребительский сегмент рынка, и, значит, увеличился спрос на средства отладки многопоточных приложений, поскольку применение развитых средств отладки упрощает процесс разработки параллельных приложений.
Рассмотрим несколько таких средств, предположив, что будем отлаживать OpenMP-программу, созданную в среде Microsoft Visual Studio 2005. Более подробно о стандарте OpenMP см. «Мир ПК», №10/07, с. 60.
Основная причина ошибок в параллельных программах — некорректная работа с разделяемыми, т. е. общими для всех запущенных процессов ресурсами, в частном случае — с общими переменными. Для примера возьмем программный код, приведенный в листинге 1.
Эта простая программа вычисляет значения некоторой функции. Ее можно легко распараллелить с помощью средств стандарта OpenMP. Добавим одну строку перед первым оператором for (листинг 2).
Episode 4.5 — Parallel Loops, Private and Shared Variables, Scheduling
Данная программа успешно компилируется в среде MS Visual Studio 2005, причем компилятор даже не выдает никаких предупреждений. Однако она совершенно некорректна. Чтобы это понять, надо вспомнить, что в OpenMP-программах переменные делятся на общие (shared), существующие в одном экземпляре и доступные всем потокам, и частные (private), локализованные в конкретном процессе. Кроме того, есть правило, гласящее, что по умолчанию все переменные в параллельных регионах OpenMP общие, за исключением индексов параллельных циклов и переменных, объявленных внутри этих параллельных регионов.
В приведенном выше примере видно, что переменные x, y и s — общие, что совершенно неправильно. Переменная s обязательно должна быть общей, так как в рассматриваемом алгоритме она является, по сути, сумматором. Однако при работе с переменными x или y каждый процесс вычисляет очередное их значение и записывает в соответствующую из них.
И тогда результат вычислений зависит от того, в какой последовательности выполнялись параллельные потоки. Иначе говоря, если первый поток вычислит значение для x, запишет его в переменную x, а потом такие же действия произведет второй поток, то при попытке прочитать значение переменной x первым потоком он получит то значение, которые было записано туда последним по времени, а значит, вычисленное вторым потоком. Подобные ошибки в случае, когда работа программы зависит от порядка выполнения различных фрагментов кода, называются race condition или data race (состояние «гонки» или «гонки» вычислительных потоков; подразумевается, что имеют место несинхронизированные обращения к памяти).
Для поиска таких ошибок необходимы специальные программные средства. Одно из них — Intel Thread Checker. Данная программа поставляется как модуль к профилировщику Intel VTune Performance Analyzer, дополняя имеющиеся средства для работы с многопоточным кодом. Intel Thread Checker позволяет обнаружить как описанные выше ошибки, так и многие другие, например deadlocks («тупики», места взаимной блокировки вычислительных нитей) и утечки памяти.
После установки Intel Thread Checker в диалоге New Project приложения Intel VTune Performance Analyzer появится новая категория проектов — Threading Wizards (мастера для работы с потоками), среди которых будет Intel Thread Checker Wizard. Необходимо выбрать его, а в следующем окне мастера указать путь к запускаемой программе. После запуска программа начнет выполняться, а профилировщик соберет все сведения о работе приложения. Пример такой информации, выдаваемой Intel Thread Checker, приведен на рис. 1.
Как видно, даже для такой небольшой программы количество ошибок достаточно велико. Thread Checker группирует обнаруженные ошибки, одновременно оценивая их критичность для работы программы, и приводит их описание, что существенно повышает эффективность работы программиста. Кроме того, на вкладке Source View представлен программный код приложения с указанием тех мест в коде, где имеются ошибки (рис. 2).
Итак, описанную выше и обнаруженную средствами Intel Thread Checker ошибку записи в переменные x и y исправить довольно просто: нужно лишь добавить в конструкцию #pragma omp parallel for еще одну директиву: private (x, y). Таким образом, эти две переменные будут объявлены как частные, и в каждом вычислительном потоке будут свои копии x и y. Следует также обратить внимание, что все потоки сохраняют вычисленный результат добавлением его к переменной s. И здесь кроется ошибка, для которой Thread Checker приводит такое описание — Write‡Read data race (состояние «гонки» вычислительных потоков). Подобные ошибки происходят тогда, когда один вычислительный поток пытается записать некоторое значение в общую память, а другой в то же время выполняет операцию чтения. В рассматриваемом примере это может привести к некорректному результату.
Рассмотрим инструкцию s = s + j*y. Изначально предполагается, что каждый поток суммирует вычисленный результат с текущим значением переменной s, а потом такие же действия выполняют остальные потоки. Однако возможна ситуация, когда, например, два потока одновременно начали выполнять инструкцию s = s + j*y, т. е. каждый из них сначала прочитает текущее значение переменной s, затем прибавит к этому значению результат умножения j*y и полученное запишет в общую переменную s.
В отличие от операции чтения, которая может быть реализована параллельно и является достаточно быстрой, операция записи всегда последовательна. Следовательно, если сначала первый поток записал новое значение, то второй поток, выполнив после этого запись, затрет результат вычислений первого, потому что оба вычислительных потока сначала прочитали одно и то же значение s, а потом стали записывать свои данные в эту переменную.
Иными словами, то значение s, которое второй поток в итоге запишет в общую память, никак не учитывает результат вычислений, полученный в первом потоке. Можно избежать подобной ситуации, если гарантировать, что в любой момент времени операцию s = s + j*y разрешается выполнять только одному из потоков. Такие операции называются неделимыми или атомарными. Когда нужно указать компилятору, что какая-либо инструкция является атомарной, используется конструкция #pragma omp atomic. Программный код, в котором исправлены указанные ошибки, приведен в листинге 3.
После перекомпиляции программы и ее повторного анализа в Thread Checker получим результат, приведенный на рис. 3.
Теперь программа не содержит критических ошибок. Выводятся только два информационных сообщения о том, что параллельные потоки завершаются при достижении оператора return в функции MathFunction. В рассматриваемом примере так и должно быть, потому что распараллеливается только код внутри данной функции.
Отладчик Intel Thread Checker поддерживает анализ 32- и 64-разрядных приложений в операционных системах MS Windows и Linux. Среди других средств отладки для параллельных приложений можно выделить широко распространенный отладчик TotalView, разрабатываемый компанией TotalView Technologies, а также отладчик dbx и утилиту Thread Analyzer из пакета Sun Studio компании Sun Microsystems. Хотя TotalView и является коммерческим продуктом, он доступен для операционных систем Linux, UNIX, Mac OS, поддерживает языки Си, С++, Фортран и технологии параллельного программирования OpenMP и MPI (Message Passing Interface).
Компилятор Sun Studio имеет поддержку OpenMP, а с помощью отладчика dbx можно выполнять код в области параллельности в пошаговом режиме, устанавливать в параллельном коде точки останова, контролировать значения переменных, которые определены как частные, и т. д. Указанная выше утилита для анализа многопоточного кода Thread Analyzer во многом схожа с Intel Thread Checker: ее работа также строится по принципу сбора данных для дальнейшего анализа. Она может применяться для поиска конфликтов доступа к данным (data races) и тупиков (deadlocks). Для использования Thread Analyzer программа должна быть собрана со специальным ключом компилятора Sun Studio.
Возможности подобных программных продуктов очень широки, однако важно понимать, что иногда результаты анализа, полученные с помощью одного из рассмотренных выше средств, содержат ошибки. Это может быть как ложный конфликт, в действительности не имеющий места, так и случай, когда та или иная ошибка осталась проигнорированной. В то же время современный параллельный отладчик – отличный помощник для программиста, занимающегося поиском конфликтов доступа к данным в многопоточных программах. t
Источник: www.osp.ru
erisnuts / 5*.cpp
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
# include |
# include |
void main () |
int N= 6 ; |
int sum= 0 ; |
omp_set_num_threads ( 10 ); |
# pragma omp parallel reduction(+:sum) |
int k = omp_get_num_threads (); |
int num = omp_get_thread_num (); |
if (k |
int last = N/k*(num+ 1 ); |
if (num+ 1 == k) |
last = N; |
for ( int i = N/k*num+ 1 ; i |
sum = sum + i; |
> |
else |
if (num+ 1 > N) |
sum = 0 ; |
else |
for ( int i = num+ 1 ; i |
sum = sum + i; |
> |
printf ( » [%d]: sum = %d n » , omp_get_thread_num (), sum); |
> |
printf ( » sum = %d n » , sum); |
> |
Источник: gist.github.com
method
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «Южно-Уральский государственный университет» (национальный исследовательский университет) ЗАДАНИЯ ДЛЯ ПРАКТИЧЕСКИХ РАБОТ и МЕТОДИЧЕСКИЕ УКАЗАНИЯ ПО ИХ ВЫПОЛНЕНИЮ по дисциплине «Технологии параллельного программирования» Разработчики: М.Л. Цымблер, к.ф.-м.н., доцент Е.В. Аксенова, ст. преподаватель К.С. Пан, преподаватель Челябинск-2012
ОГЛАВЛЕНИЕ | ||
1. | Технология программирования OpenMP . | 5 |
Задание 1. Создание проекта в среде MS Visual Studio с поддержкой OpenMP . | 5 | |
Задание 2. Многопоточная программа «Hello World!». | 5 | |
Задание 3. Программа «I am!». | 5 | |
Задание 4. Общие и частные переменные в OpenMP: программа «Скрытая ошибка» . | 6 | |
Задание 5. Общие и частные переменные в OpenMP: параметр reduction . | 6 | |
Задание 6. Распараллеливание циклов в OpenMP: программа «Сумма чисел» . | 7 | |
Задание 7. Распараллеливание циклов в OpenMP: параметр schedule . | 7 | |
Задание 8. Распараллеливание циклов в OpenMP: программа «Число ». | 8 | |
Задание 9. Распараллеливание циклов в OpenMP: программа «Матрица» . | 8 | |
Задание 10. Параллельные секции в OpenMP: программа «I’m here» . | 9 | |
Задание 11. Гонка потоков в OpenMP: программа «Сумма чисел» с atomic . | 10 | |
Задание 12. Гонка потоков в OpenMP: программа «Число » с critical . | 10 | |
Задание 13. Исследование масштабируемости OpenMP-программ . | 10 | |
2. | Технология программирования MPI. | 12 |
Задание 14. Создание проекта в среде MS Visual Studio с поддержкой MPI . | 12 | |
Задание 15. Программа «I am!». | 12 | |
Задание 16. Программа «На первый-второй рассчитайся!». | 12 | |
Задание 17. Коммуникации «точка-точка»: простые блокирующие обмены. | 12 | |
Задание 18. Коммуникации «точка-точка»: схема «эстафетная палочка» . | 13 | |
Задание 19. Коммуникации «точка-точка»: схема «мастер-рабочие» . | 13 | |
Задание 20. Коммуникации «точка-точка»: простые неблокирующие обмены. | 14 | |
Задание 21. Коммуникации «точка-точка»: схема «сдвиг по кольцу». | 14 | |
Задание 22. Коммуникации «точка-точка»: схема «каждый каждому». | 15 | |
Задание 23. Коллективные коммуникации: широковещательная рассылка данных . | 16 | |
Задание 24. Коллективные коммуникации: операции редукции . | 17 | |
Задание 25. Коллективные коммуникации: функции распределения и сбора данных . | 17 | |
Задание 26. Группы и коммуникаторы. | 18 | |
Задание 27*. MPI-2: динамическое создание процессов . | 18 | |
Задание 28*. MPI-2: односторонние коммуникации. | 19 | |
Задание 29. Исследование масштабируемости MPI-программ. | 19 | |
3. | Технология программирования MPI+OpenMP . | 20 |
Задание 30. Проект в среде Visual Studio 2010 с поддержкой MPI и OpenMP. | 20 | |
Задание 31. Программа «I am» . | 20 | |
Задание 32. Программа «Число » . | 21 | |
4. | Методические указания . | 22 |
1. Технология программирования OpenMP . | 22 |
Указания к заданию 1. Создание проекта в среде MS Visual Studio с поддержкой | |
OpenMP. | 22 |
Указания к заданию 2. Многопоточная программа «Hello World!» . | 25 |
Указания к заданию 3. Программа «I am!» . | 26 |
Указания к заданию 4. Общие и частные переменные в OpenMP: программа «Скрытая | |
ошибка» . | 27 |
Указания к заданию 5. Общие и частные переменные в OpenMP: параметр reduction 27 | |
Указания к заданию 6. Распараллеливание циклов в OpenMP: программа «Сумма | |
чисел» . | 28 |
Указания к заданию 7. Распараллеливание циклов в OpenMP: параметр schedule . | 29 |
Указания к заданию 8. Распараллеливание циклов в OpenMP: программа «Число » 30 | |
Указания к заданию 9. Распараллеливание циклов в OpenMP: программа «Матрица» | |
. | 30 |
Указания к заданию 10. Параллельные секции в OpenMP: программа «I’m here» . | 31 |
Указания к заданию 11. Гонка потоков в OpenMP: программа «Сумма чисел» с | |
atomic . | 32 |
Указания к заданию 12. Гонка потоков в OpenMP: программа «Число » с critical . | 32 |
Указания к заданию 13. Исследование масштабируемости OpenMP-программ. | 33 |
2. Технология программирования MPI. | 37 |
Указания к заданию 14. Создание проекта в среде MS Visual Studio с поддержкой MPI | |
. | 37 |
Указания к заданию 15. Программа «I am!» . | 41 |
Указания к заданию 16. Программа «На первый-второй рассчитайся!» . | 43 |
Указания к заданию 17. Коммуникации «точка-точка»: простые блокирующие | |
обмены . | 43 |
Указания к заданию 18. Коммуникации «точка-точка»: схема «эстафетная палочка».45 | |
Указания к заданию 19. Коммуникации «точка-точка»: схема «мастер-рабочие». | 46 |
Указания к заданию 20. Коммуникации «точка-точка»: простые неблокирующие | |
обмены . | 46 |
Указания к заданию 21. Коммуникации «точка-точка»: схема «сдвиг по кольцу». | 47 |
Указания к заданию 22. Коммуникации «точка-точка»: схема «каждый каждому» . | 48 |
Указания к заданию 23. Коллективные коммуникации: широковещательная рассылка | |
данных . | 49 |
Указания к заданию 24. Коллективные коммуникации: операции редукции . | 50 |
Указания к заданию 25. Коллективные коммуникации: функции распределения и | |
сбора данных. | 51 |
Указания к заданию 26. Группы и коммуникаторы . | 52 |
Указания к заданию 27. MPI-2: динамическое создание процессов . | 55 |
Указания к заданию 28. MPI-2: односторонние коммуникации . | 55 |
Указания к заданию 29. Исследование масштабируемости MPI-программ . | 57 |
3. Технология программирования MPI+OpenMP. | 57 |
Указания к заданию 30. | Проект в среде Visual Studio 2010 с поддержкой MPI и | |
OpenMP. | 57 | |
Указания к заданию 31. | Программа «I am» . | 57 |
Указания к заданию 31. | Программа «I am» . | 58 |
1. Технология программирования OpenMP Задание 1. Создание проекта в среде MS Visual Studio с поддержкой OpenMP Создайте проект в среде MS Visual Studio 2010 с поддержкой OpenMP. Задание 2. Многопоточная программа «Hello World!» Напишите OpenMP-программу, в которой создается 4 нити и каждая нить выводит на экран строку « Hello World! ». Входные данные: нет. Выходные данные: 4-е строки « Hello World! ». Пример входных и выходных данных
Входные данные | Выходные данные |
Hello World! | |
Hello World! | |
Hello World! | |
Hello World! |
Задание 3. Программа «I am!» 1. Напишите программу, в которой создается k нитей, и каждая нить выводит на экран свой номер и общее количество нитей в параллельной области в формате: I am thread from threads! Входные данные: k – количество нитей в параллельной области. Выходные данные: k строк вида « I am thread from threads! ». Пример входных и выходных данных
Входные данные | Выходные данные | |||
3 | I am 0 | thread from 3 | threads! | |
I am 1 | thread from | 3 | threads! | |
I am 2 | thread from | 3 | threads! |
2. Модифицируйте программу таким образом, чтобы строку I am thread from threads! выводили только нити с четным номером. Пример входных и выходных данных
Входные данные | Выходные данные | |||
3 | I am 0 | thread from | 3 | threads! |
I am 2 | thread from | 3 | threads! |
Задание 4. Общие и частные переменные в OpenMP: программа «Скрытая ошибка» Изучите конструкции для управления работой с данными shared и private. Напишите программу, в которой создается k нитей, и каждая нить выводит на экран свой номер через переменную rank следующим образом: rank = omp_get_thread_num(); printf( «I am %d thread.n» , rank); Экспериментами определите, общей или частной должна быть перемен- ная rank. Входные данные: целое число k – количество нитей в параллельной области. Выходные данные: k строк вида « I am <Номер нити>. ». Пример входных и выходных данных
Входные данные | Выходные данные | |
3 | I am 0 | thread. |
I am 1 | thread. | |
I am 2 | thread. |
Задание 5. Общие и частные переменные в OpenMP: параметр reduction 1. Напишите программу, в которой две нити параллельно вычисляют сумму чисел от 1 до N. Распределите работу по нитям с помощью оператора if языка С. Для сложения результатов вычисления нитей воспользуйтесь OpenMP-параметром reduction. Входные данные: целое число N – количество чисел. Выходные данные: каждая нить выводит свою частичную сумму в формате « [Номер_нити]: Sum = », один раз выводится общая сумма в формате « Sum = ». Пример входных и выходных данных
Входные данные | Выходные данные |
4 | [0]: Sum = 3 |
[1]: Sum = 7 | |
Sum = 10 |
2*. Модифицируйте программу таким образом, чтобы она работала для k нитей. Входные данные: целое число k – количество нитей, целое число N – количество чисел. Выходные данные: каждая нить выводит свою частичную сумму в формате « [Номер_нити]: Sum = », один раз выводится общая сумма в формате « Sum = ».
Пример входных и выходных данных
Входные данные | Выходные данные |
2 | [0]: Sum = 3 |
4 | [1]: Sum = 7 |
Sum = 10 | |
2 | [0]: Sum = 1 |
2 | [1]: Sum = 2 |
Sum = 3 | |
3 | [0]: Sum = 1 |
2 | [1]: Sum = 2 |
[2]: Sum = 0 | |
Sum = 3 |
Задание 6. Распараллеливание циклов в OpenMP: программа «Сумма чисел» Изучите OpenMP-директиву параллельного выполнения цикла for. Напишите программу, в которой k нитей параллельно вычисляют сумму чисел от 1 до N. Распределите работу по нитям с помощью OpenMP-директивы for. Входные данные: целое число k – количество нитей, целое число N – количество чисел. Выходные данные: каждая нить выводит свою частичную сумму в формате « [Номер_нити]: Sum = », один раз выводится общая сумма в формате « Sum = ». Пример входных и выходных данных
Входные данные | Выходные данные |
2 | [0]: Sum = 3 |
4 | [1]: Sum = 7 |
Sum = 10 | |
2 | [0]: Sum = 1 |
2 | [1]: Sum = 2 |
Sum = 3 | |
3 | [0]: Sum = 1 |
2 | [1]: Sum = 2 |
[2]: Sum = 0 | |
Sum = 3 |
Задание 7. Распараллеливание циклов в OpenMP: параметр schedule Изучите параметр schedule директивы for. Модифицируйте программу «Сумма чисел» из задания 6 таким образом, чтобы дополнительно выводилось на экран сообщение о том, какая нить, какую итерацию цикла выполняет: []: calculation of the iteration number . Задайте k = 4, N = 10. Заполните следующую таблицу распределения итераций цикла по нитям в зависимости от параметра schedule:
Номер | Значение параметра schedule | ||||||
итерации | static | static, 1 | static, 2 | dynamic | dynamic, 2 | guided | guided, 2 |
1 | |||||||
2 | |||||||
3 | |||||||
4 | |||||||
5 | |||||||
6 | |||||||
7 | |||||||
8 | |||||||
9 | |||||||
10 |
Задание 8. Распараллеливание циклов в OpenMP: программа «Число » 1. Напишите OpenMP-программу, которая вычисляет число с точностью до N знаков после запятой. Используйте следующую формулу: Распределите работу по нитям с помощью OpenMP-директивы for. Входные данные: одно целое число N (точность вычисления). Выходные данные: одно вещественное число pi. Пример входных и выходных данных
Входные данные | Выходные данные |
1000000000 | 3.14159265 |
Задание 9. Распараллеливание циклов в OpenMP: программа «Матрица» Напишите OpenMP-программу, которая вычисляет произведение двух квадратных матриц × = С размера × . Используйте следующую формулу:
Входные данные: целое число n, 1 ≤ ≤ 10 , n 2 вещественных элементов матрицы A и n 2 вещественных элементов матрицы B . Выходные данные: n 2 вещественных элементов матрицы С . Пример входных и выходных данных
Входные данные | Выходные данные | |
2 | 14 4 | |
1 | 3 | 44 16 |
4 | 8 | |
5 | 4 | |
3 |
Задание 10. Параллельные секции в OpenMP: программа «I’m here» Изучите OpenMP-директивы создания параллельных секций sections и section. Напишите программу, содержащую 3 параллельные секции, внутри каждой из которых должно выводиться сообщение: []: came in section Вне секций внутри параллельной области должно выводиться следующее сообщение: []: parallel region Запустите приложение на 2-х, 3-х, 4-х нитях. Проследите, как нити распределяются по параллельным секциям. Входные данные: k – количество нитей в параллельной области. Выходные данные: k-строк вида « []: came in section », k-строк вида « []: parallel region ». Пример входных и выходных данных
Входные данные | Выходные данные |
3 | [0]: came in section 1 |
[1]: came in section 2 | |
[2]: came in section 3 | |
[0]: parallel region | |
[1]: parallel region | |
[2]: parallel region |
9
Задание 11. Гонка потоков 1 в OpenMP: программа «Сумма чисел» с atomic Перепишите программу, в которой параллельно вычисляется сумма чисел от 1 до N (см. задание 6), без использования параметра reduction. Вместо параметра reduction используйте директиву atomic. Задание 12.
Гонка потоков в OpenMP: программа «Число » с critical Перепишите параллельную программу вычисления числа (см. задание 8) без использования параметра reduction. Вместо параметра reduction используйте директиву critical. Задание 13. Исследование масштабируемости OpenMP-программ 1. Проведите серию экспериментов на персональном компьютере по исследованию масштабируемости OpenMP-программ. Заполните следующую таблицу:
№ | Количество | Время | |
Программа | Параметр N | выполнения | |
п/п | нитей | ||
(сек.) | |||
1 | «Матрица» (см. задание 9 ) | 100 | 1 |
2 | 1 000 000 | 1 | |
3 | 100 | 2 | |
4 | 1 000 000 | 2 | |
5 | 100 | 4 | |
6 | 1 000 000 | 4 | |
7 | 100 | 6 | |
8 | 1 000 000 | 6 | |
9 | 100 | 8 | |
10 | 1 000 000 | 8 | |
11 | 100 | 10 | |
12 | 1 000 000 | 10 | |
13 | 100 | 12 | |
14 | 1 000 000 | 12 |
На основании данных таблицы постройте график масштабируемости для каждого значения параметра N. Определите для каждого графика, при каком количестве нитей достигается максимальное ускорение. 2. Проведите серию экспериментов на суперкомпьютере по исследованию масштабируемости OpenMP-программ. Заполните следующую таблицу: 1 Гонка потоков (race conditions) – ситуация когда результат вычислений зависит от темпа выполнения программы нитями. Для исключения гонки необходимо обеспечить, чтобы изменение значений общих переменных осуществлялось в каждый момент времени только одним единственным потоком. В OpenMP это может быть организовано следующими основными механизмами: неделимые (atomic) операции, механизм критических секций (critical sections).
Источник: studfile.net