Как выполнять одновременные вычисления в языке Wolfram Language
Использование множественных ядер языка Wolfram Language позволяет одновременно выполнять разные команды. Это делает возможным, например, использование пользовательского интерфейса системы the Mathematica для интерактивных вычислений в то время, как одно из ядер производит трудоемкое вычисление. Для того, чтобы использовать множественные ядра языка Wolfram Language, создайте конфигурацию нового ядра и используйте его для вычислений в новом блокноте. Шаги создания нового ядра схожи на те, что необходимы для соединения с удаленным ядром, за тем только исключением, что новое ядро будет локальным, а не удаленным.
- Запустите систему Mathematica. В меню выберете Evaluation ► Kernel Configuration Options.
- Появится диалог конфигурирования ядер.
- Для того, чтобы добавить и конфигурировать новое ядро, нажмите кнопку Add (добавить). Появится диалоговое окно Kernel Properties (параметры ядра).
- Введите подходящее название для ядра, как, например, “Alternate Local Kernel”.”
- В разделе Basic Options (основные параметры) убедитесь, что “Launch on” (выполнять на) установлено в состояние “Local Machine” (локальный компьютер).
- Нажмите кнопку OK для подтверждения выбранных значений параметров.
- Откройте новый Wolfram блокнот.
- В меню выберете Evaluation ► Notebook’s Kernel и щелкните по имени новосозданного ядра.
Этот блокнот теперь использует альтернативное ядро. Любые вычисления в этом блокноте выполняются независимо и одновременно с вычислениями в других блокнотах.
Как запустить терминал языка Wolfram Language
Терминал вычислительного ядра языка Wolfram Language – это текстовая среда для выполнения вычислений. У него есть много применений, включая диагностирование трудностей с установкой. Следующий пример содержит указания для системы Mathematica.
Windows
Щелкните на меню Пуск, выбирете All Programs ► Wolfram Mathematica, потом щелкните на программу Mathematica Kernel.
Mac
- Откройте приложение Finder и откройте в нем директорию Applications. Щелкните правой кнопкой мышки или щелкните мышкой, удерживая нажатой клавишу Control по иконке Mathematica в директории Applications и выберите “Show Package Contents” (отображать содержимое пакета).
- Появится новое окно. Перейдите в папку Contents ► MacOS.
- Дважды щелкните по иконке MathKernel, чтобы запустить терминал системы Mathematica.
Linux
Откройте системный терминал и выполните следующую команду:
math
Это запустит терминальный консоль системы Mathematica.
О реализации параллельных вычислений в системе Wolfram Mathematica Текст научной статьи по специальности «Компьютерные и информационные науки»
Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Егорова Дарья Константиновна, Шмелева Мария Дмитриевна
В статье рассматриваются некоторые вопросы реализации параллельных вычислений в системе компьютерной алгебры Wolfram Mathematica. Проводится сравнительный анализ нескольких последовательных и параллельных алгоритмов, реализованных в
i Надоели баннеры? Вы всегда можете отключить рекламу.
Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Егорова Дарья Константиновна, Шмелева Мария Дмитриевна
Возможности параллельного программирования в математических пакетах
Оценка эффективности реализации параллельных алгоритмов на нрс-кластере
Реализация параллельного алгоритма глобального поиска на gpu
Обзор моделей параллельных вычислений
Повышение производительности расчета динамики частиц на параллельных системах
i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.
Wolfram Mathematica 8.0 и Visual Studio 2010 c поддержкой OpenMP.The article considers some issues of implementation of parallel computing in Wolfram Mathematica . The analysis of several sequential and parallel algorithms implemented in Wolfram Mathematica 8.0 and Visual Studio 2010 with OpenMP support is presented.
Текст научной работы на тему «О реализации параллельных вычислений в системе Wolfram Mathematica»
ШМЕЛЕВА М. Д., ЕГОРОВА Д. К.
О РЕАЛИЗАЦИИ ПАРАЛЛЕЛЬНЫХ ВЫЧИСЛЕНИЙ В СИСТЕМЕ WOLFRAM MATHEMATICA Аннотация. В статье рассматриваются некоторые вопросы реализации параллельных вычислений в системе компьютерной алгебры Wolfram Mathematica. Проводится сравнительный анализ нескольких последовательных и параллельных алгоритмов, реализованных в Wolfram Mathematica 8.0 и Visual Studio 2010 c поддержкой OpenMP.
Ключевые слова: Wolfram Mathematica, последовательный алгоритм, параллельный алгоритм, время, ускорение, эффективность.
SHMELYOVA M. D., EGOROVA D. K.
ON IMPLEMENTATION OF PARALLEL COMPUTING IN WOLFRAM MATHEMATICA SYSTEM Abstract. The article considers some issues of implementation of parallel computing in Wolfram Mathematica. The analysis of several sequential and parallel algorithms implemented in Wolfram Mathematica 8.0 and Visual Studio 2010 with OpenMP support is presented.
Keywords: Wolfram Mathematica, sequential algorithm, parallel algorithm, time, acceleration, efficiency.
Система компьютерной алгебры Wolfram Mathematica является весьма эффективным средством вычислений. На сегодняшний день система содержит порядка 5 000 функций, многие из них написаны изначально в оптимизированном виде (особенно для низкоуровневых вычислений), а большинство операций в Wolfram Mathematica, таких как операции по снижению размерности, обработка статистических данных, обработка изображений и т.п. автоматически распараллеливаются на локальные ядра. Однако существует набор инструментов (например, ParallelSum, Parallelize, ParallelMap, ParallelTable, ParallelArray, ParallelCombine и т.д.) использование которых, при реализации многопоточных задач, призвано значительно ускорить код. Отметим, что в некоторых случаях ускорения может и не быть, или оно есть, но не достаточное по сравнению с применением других средств программирования для той же задачи. Это может быть связано с тем, что применение инструментов параллельного программирования в Wolfram Mathematica, возможно, решает задачи распределения данных и сбора результатов, не учитывая, например, накладные расходы и т.п.
Приведем несколько примеров. Все вычисления проведены на 2-х ядерном Intel Core 2 Duo с установленными лицензионными версиями Wolfram Mathematica 8.0 и Visual Studio 2010 c поддержкой OpenMP.
Проведем последовательное и параллельное вычисление суммы \00 000 i реализованное на Visual Studio 2010. Результаты измерения времени вычисления приведены на рисунках 1 и 2.
Рис. 1. Последовательный алгоритм. Рис. 2. Параллельный алгоритм.
Теперь произведем эти же вычисления в системе Wolfram Mathematica. Результаты приведены на рисунках 3 и 4.
Рис. 3. Последовательный алгоритм. Рис. 4. Параллельный алгоритм.
Последовательные вычисления произвели с помощью функции Sum. ParallelSum параллельная версия Sum, которая автоматически распределяет частичные сложения между различными ядрами и процессорами. Функция AbsoluteTiming возвращает реальное время вычисления своего аргумента в секундах и результат вычисления аргумента. Ее отличие от функции Timing заключается в том, что Timing измеряет количество процессорного времени, потребляемый ядром для оценки данного выражения. Ее результат лишь приблизителен, так как, в зависимости от базовой платформы, он может включать или не включать в себя процессорное время, используемое для системных вызовов, ошибок страниц и т.д. Она также не включает в себя время центрального процессора, используемого для параллельных процессов и потоков, и на ядра системы Wolfram Mathematica [3; 4].
Вычислим эффективность и ускорение алгоритмов (см. табл. 1).
Эффективность и ускорение алгоритмов
Visual Studio Wolfram Mathematica
Последовательный алгоритм Параллельный алгоритм Последовательный алгоритм Параллельный алгоритм
Время, Т 0,019353 0,002518 0,469 0,047
Т-, Ускорение, S=— Тп 7,685861795 9,9787234
5 Эффективность, E=- 3,84293 4,9893617
Из результатов таблицы 1 видно, что E>1, т.е. мы получили суперлинейное ускорение. Это может быть связано с тем, что, например, при реализации вычислений в Visual Studio в качестве последовательного алгоритма был применен не самый оптимальный алгоритм из известных, а при вычислениях реализованных в Wolfram Mathematica увеличение количества вычислений вызвало рост суммарного объема их оперативной и кэш памяти вследствие чего, большая часть данных умещается в кэше.[1]
Рассмотрим задачу вычисления числа п. Результаты замеров времени при параллельной и последовательной реализациях в Visual Studio и Wolfram Mathematica приведены в таблице 2.
Сравнительный анализ ускорения и эффективности при параллельной и последовательной реализациях алгоритма вычисления числа я в Visual Studio и Wolfram Mathematica
Visual Studio Wolfram Mathematica
Последовательный алгоритм Параллельный алгоритм Последовательный алгоритм Параллельный алгоритм
Время, T 0,064970 0,063345 126,0468750 96,672
т1 Ускорение, S=— Тп 1,025653 1,3038612
5 Эффективность, E=- 0,512826 0,65193
Из таблиц 1 и 2 видно, что время вычислений как последовательного, так и параллельного алгоритмов приведенных тестовых задач в Wolfram Mathematica существенно больше времени выполнения тех же задач в Visual Studio. Хотя ускорение, все же, достигает
удовлетворительных значений и в первом, и во втором случае. Следует заметить, что при повторном запуске одних и тех же вычислений в Wolfram Mathematica получаем худший результат при параллельных вычислениях, так как система «запоминает» предыдущие действия и при запуске последовательного алгоритма не тратит время на вычисления, а при запуске параллельных вычислений тратит время на распределение данных по ядрам.
Решение этих проблем [2] при реализации параллельных алгоритмов в системе Wolfram Mathematica может состоять в выполнении следующих действий:
1) при контрольных замерах времени загружать данные ядра только один раз;
2) избегать необходимости обмена данными между ядрами с помощью совместно используемых данных;
3) избегать повторения идентичных вычислений на отдельных ядрах.
1. Зюзьков В. М. Компьютерная алгебра. — Томск: Издательство Томского университета, 2014. — 121 с.
2. Mangano S. Mathematica Cookbook. — O’Reilly Media, 2010. — 830 р.
Wolfram Mathematica: параллельные вычисления, эффективный код, маркетинговые ловушки
Продолжаем серию кратких сообщений о некоторых возможностях Wolfram Mathematica и особенностях работы с этой программой.
Ранее, в заметке было проиллюстрировано, почему имеет смысл применять Wolfram Mathematica при разработке (прототипировании) систем Больших Вычислений, лежащих в основе концепции Большой Аналитики основанной на парадигме Big Data. Стоить отметить, что с выходом Wolfram Mathematica 9, количество пунктов «за» – существенно увеличилось.
Далее, последовала заметка об основах компилирования исполняемых функций в среде Wolfram Mathematica (через функцию-обёртку Compile[ ]) и простейших способах реализации моделей параллельных вычислений SIMD и shared memory.
В настоящей статье рассмотрим простейшие примеры реализации другого подхода к параллельным вычислениям в Wolfram Mathematica – через порождение объектов KernelObject[ ] и реализацию модели distributed memory. Заметим, что в Mathematica существует ещё и третий подход к организации параллельных вычислений, через MathLink (и/или Wolfram LibraryLink), но его рассмотрение выходит за рамки данной статьи.
Поводом к написанию данного эссе послужили отклики читателей на наш ранее написанный материал, а также забавный эпизод, связанный с некорректной рекламой возможностей параллелизма в системе Wolfram Mathematica одной группой её «фанатов». Поэтому для начала воспроизведём их результаты, а затем покажем настоящее лицо Mathematica. Справедливости ради отметим, что воспроизводить ситуацию будем на Intel Core i5-2430M (два ядра, два потока на ядро), но качественно, ситуация остаётся похожей и на других, более мощных процессорах.
Дальнейшее изложение, в принципе, рассчитано на читателя уже немного знакомого с системой Wolfram Mathematica 8 (9) и с синтаксисом её языка программирования. Если знаний всё же окажется недостаточно, по ходу чтения можно заглядывать в официальное справочное руководство.
Итак, для начала сконфигурируем среду вычислений:
LaunchKernels[4];
ParallelEvaluate[$HistoryLength = 0;];
Зададим функцию, синтаксически эквивалентную «фанатской» функции (забегая вперёд, отметим, что ключевой момент «фанатского» подхода – это вызов функции AppendTo[ ]):
SlopeFan[n_] := Module[,
result = <>;
Do[
a = Cos[RandomReal[]];
AppendTo[result, a];
, ]; result];
Выполним эту функцию на одном ядре, в однопоточном режиме:
tFanS = AbsoluteTiming[rFanS = SlopeFan[Nn];]
А теперь запустим её в параллельном режиме, на всех 4-х ядрах (при самостоятельных экспериментах следите за целочисленным соотношением между Nn и $KernelCount):
tFanP = AbsoluteTiming[
rFanP = Module[,
n = Table[Nn / $KernelCount, ];
r = Flatten[ParallelMap[SlopeFan[#] &, n]];
r];
]
Далее подсчитаем ускорение достигнутое за счёт параллелизма. Отметим, что в настоящей заметке результаты не усреднялись по набору многократных запусков, но контрольные запуски показали, что вариативность времени достаточно низка, что вполне позволяет увидеть определённые закономерности. Итак, коэффициент ускорения полученный для функции SlopeFan[ ], при 100 000 вызовах:
(* Sequential vs Parallel for Fan *)
tFanS[[1]] / tFanP[[1]]
7.1776237
Что мы видим? Семикратное ускорение программы на «слабеньком» Intel Core i5-2430M (два ядра, два потока на ядро)! Воображение уже рисует перспективы. «Нью-Васюки» уже совсем близко. В общем отличный маркетинговый ход для неискушённых пользователей Wolfram Mathematica. Но опыт и теория подсказывают, что так не бывает, что «копать» нужно в сторону оптимальности кода. И действительно, перепишем функцию SlopeFan[ ] в ином представлении – откажемся от вызова AppendTo[ ] динамически изменяющей размер списка (она весьма затратна в плане ресурсов и времени выполнения), и перейдём к списку фиксированной длины:
SlopeOurM1[n_] := Module[,
result = ConstantArray[0., n];
Do[
result[[i]] = Cos[RandomReal[]]
, ]; result];
Выполним эту функцию на одном ядре, в однопоточном режиме:
tOurM1S = AbsoluteTiming[rOurM1S = SlopeOurM1[Nn];]
Сравним результаты запусков в последовательном режиме функций SlopeFan[ ] и SlopeOurM1[ ]:
(* Sequential Fan vs Sequential OurM1 *)
tFanS[[1]] / tOurM1S[[1]]
138.2889
Иное представление функции, и код ускорился в 138 раз! И без параллелизма. А если с параллелизмом? Пробуем:
tOurM1P = AbsoluteTiming[
rOurM1P = Module[,
n = Table[Nn / $KernelCount, ];
r = Flatten[ParallelMap[SlopeOurM1[#] &, n]];
r];
]
Ускорение от параллелизма:
(* Sequential vs Parallel for OurM1 *)
tOurM1S[[1]] / tOurM1P[[1]]
1.500001
Параллельный код всего лишь в 1.5 раза быстрее последовательного, при запуске на 4-х ядрах (Kernel) Mathematica на процессоре с двумя ядрами (core), по два потока на ядро. Это уже похоже на правду!
А быстрее можно?
Можно! И Wolfram Mathematica даёт эту возможность. Перепишем ещё раз код функции Slope*[ ](здесь стоит отметить, что новый вариант функции потребляет памяти в два раза больше, нежели вариант SlopeOurM1[ ]):
SlopeOurM2[n_] := Module[,
a = RandomReal[, n];
result = Cos[a]; result];
Запускаем эту функцию на одном ядре, в однопоточном режиме:
tOurM2S = AbsoluteTiming[rOurM2S = SlopeOurM2[Nn];]
Измеряем прирост скорости относительно других реализаций:
(* Sequential Fan vs Sequential OurM2 *)
tFanS[[1]] / tOurM2S[[1]]
2074.34
(* Sequential OurM1 vs Sequential OurM2 *)
tOurM2S[[1]] / tOurM2S[[1]]
15.0000
(* Parallel OurM1 vs Sequential OurM2 *)
tOurM2S[[1]] / tOurM1P[[1]]
10.0000
Получаем. Относительно исходного варианта SlopeFan[ ] – ускорение в 2000 раз! Относительно нашей первой реализации SlopeOurM1[ ] – ускорение в 15 раз! Относительно нашей первой реализации SlopeOurM1[ ], запущенной в параллельном режиме – ускорение в 10 раз!
Ни первое, ни второе! Вся хитрость заключается в трёх моментах. Во-первых, это способы обработки в Wolfram Mathematica функций имеющих атрибут (Attributes[ ]) Listable. Во-вторых, это активное применение в Mathematica библиотеки Intel MKL. В-третьих, это устройство и принципы функционирования самой библиотеки Intel MKL: параллелизм и векторизация вычислений. Чтобы увидеть третий момент наглядно, запустим SlopeOurM2[ ] в параллельном режиме:
tOurM2P = AbsoluteTiming[
rOurM2P = Module[,
n = Table[Nn / $KernelCount, ];
r = Flatten[ParallelMap[SlopeOurM2[#] &, n]];
r];
]
Получаем прирост скорости:
(* Sequential vs Parallel for OurM2 *)
tOurM2S[[1]] / tOurM2P[[1]]
0.50000
То есть на самом деле мы получили не прирост, а замедление скорости в 2 раза. Простое объяснение этого факта (и в силу простоты, строго говоря, не совсем корректное) – это конкуренция за аппаратные ресурсы (2 вычислительных ядра процессора) со стороны вычислительных процессов, порождаемых в ядрах Wolfram Mathematica, и выполняемых библиотекой Intel MKL.
В качестве резюме.
Первое. Система Wolfram Mathematica умеет быстро и точно считать, нужно только правильно поставить ей задачу.
Второе. Параллелизм в Wolfram Mathematica, основанный на порождении объектов KernelObject[ ] и реализации модели distributed memory, достаточно эффективно работает, нужно только правильно и к месту его применять (с учётом алгоритмических, программных и аппаратных особенностей и ограничений).
Третье. Никогда не поддавайтесь на маркетинговые трюки.
Четвёртое. Перед решением сложных, ёмких задач всегда изучайте документацию (теорию), анализируйте чужой и собственный опыт, разбивайте задачу на блоки и экспериментируйте на тестовых примерах (моделируйте проблему в малом).
Пятое. Старайтесь применять специализированные средства разработки. Кстати, для Wolfram Mathematica существует такое замечательное средство. Оно называется Wolfram WorkBench. Этот пакет, предоставляет неплохую среду разработки (Integrated Development Environment). Помимо навигации по исходному коду, он обеспечивает разработчика также инструментами для отладки (дебага), профилирования и развёртывания приложения. В качестве бонусов: интеграция с системами контроля версий и средства групповой работы; проектирование и запуск юнит-тестов, модульное и функциональное тестирование; написание и оформление онлайн документации в стиле Wolfram Mathematica Documentation Center. В общем, без Wolfram WorkBench достаточно проблематично разрабатывать сложные и большие программные системы, эффективно и надёжно работающие в среде Mathematica.
Шестое. Желаем успехов в познании и свершениях!
12 февраля 2013 года.
Андрей Макаренко,
группа «Конструктивная Кибернетика».
Ключевые слова: Wolfram Mathematica, параллельные вычисления, KernelObject, distributed memory, Большие вычисления, Wolfram WorkBench.