Re[8]: Параллельное программирование
От: Gaperton http://gaperton.livejournal.com
Дата: 13.08.07 12:41
Оценка: 35 (2)
Здравствуйте, Didro, Вы писали:

D>Спасибо, нет слов

D>Буду рефакторить курс.
D>С частностями иногда был не согласен, но в целом думаю прочувствовал верно.

Я так понял, вас заинтересовала картинка светлого будущего (я ее набросал по данным исследования рынка High-Performance Computing, которое делал год назад). Так вот, я в ней кое-что пропустил. Попробую более системно изложить.

Раньше параллельные вычисления применялись либо для суперкомпьютерных нужд (научные вычисления, моделирование), либо были всякие другие применения (обработка сигналов, изображений, рендеринг), которые были массовыми и решались аппаратно (ПЛИС, специализированные сигнальные процессоры, графические ускорители, мэйнфреймы) и особо "программиста обыкновенного" не волновали.

Общая список тенденций сейчас такой.
1) "Суперкомпьютерные задачи", под которые собирают специальное железо.
— Дешевые линух-кластеры из гражданских компов объединенные скоростным Ethernet — применяются для научных вычислений, моделирования, и рассчета 3D-графики. Программится это добро традиционно на MPI, практически так же, как взрослые суперкомпьютеры, соединенные вместо Ethernet низколатентными сетями типа Merynet или Infiniband. Это не есть гражданская задача гражданского программера, об этом достаточно "иметь представление". Технология зрелая — мэйнстрим.
— Растущая популярность GRID и технологий peer-to-peer для традиционно суперкомпьютерных задач. Folding@Home, SETI@home. Технология в пред-зрелом состоянии — то есть приложения уже есть, однако их создание не поставлено на поток пока. Тоже не гражданская задача, достаточно нишевая, достаточно "иметь представление".
— Применение разнообразных аппаратных плат-ускорителей, построенных на основе ПЛИС или векторных чипов, таких как CellBE и ClearSpeed. Это — нишевые применения, для всякой биологии. Их достаточно просто упомянуть, даже не иметь представления. Стандарта на эти штуки нет, спрос небольшой, см. "потоковые вычисления" ниже.

2) "Обычные задачи" , с которыми человек столкнется на десктопе.
— Векторные расширения. Раньше было в суперкомпьютерах, теперь давно и везде есть. SSE3 для x86 и AltiVec/VMX для PowerPC. Длина векторов 128 бит, оперирут векторами чисел разных форматов, применяется для ускорения мультимедийной и сигнальной обработки. SSE3 умеет работать и с числами double precision, можно и в научных рассчетах применять. Алгоритмы надо уметь "векторизовывать" — компиляторы это тоже умеют делать, конечно, но плохо. Технология зрелая, мэйнстрим (в 80-е применялось тока для научных суперкомпьютерных рассчетов), вполне можно и "уметь".
— SMP и мультитредные архитектуры. Сейчас — это почти мйнстрим. Аппаратная многопоточность применяется для борбы с латентностью памяти. Надо однозначно уметь и иметь опыт. Здесь ожидается упрощение технологий разаботки за счет применения более высокоуровневых моделей параллелизма.
— Потоковые вычисления. Это то, чего лет 10-15 назад никто не ожидал. Речь идет об ассиметричных архитектурах — GPGPU, и Cell BE. Состояние — предмйнстрим, примеры приложений есть, однако средства разработки пока плохие или отсутствуют, и технологии не устоялись. Более того, в индустрии сейчас нет единства на тему, насколько это приживется для задач общего назначения. Чтобы это прижилось в мэйнстриме, надо иметь простую, понятную и общепринятую модель программирования, которая пока еще не оформилась. Один из рабочих вариантов — kernel-stream. Посему — достаточно "иметь представление", тренингов тут проводить нельзя, черт его знает как повернется. Есть стартап — RapidMind, который утверждает, что их софтина решает эти проблемы — типа, написал один раз, и это компилиться куда угодно, хоть под Cell, хоть под GPU, или просто под SMP. Вот, пока такие тулзы не войдут в обиход, это не станет мэйнстримом. Есть нефиговые предпосылки, что в течении пары лет все устаканится.

3) Серверные приложения.
— Традиционные кластеры. Web-кластеры, кластерные application-сервера (в основном — Java). Надо знать и уметь и иметь представление, тем более, что там будет и многоядерный SMP, и инфраструктура довольно специфическая. Паттерны архитектурные тут есть. Знать надо, ИМХО. Кондовый мйнстрим, на Жабе такие штуки делают на потоке на счет раз-два-три. Жаба вообще неплохо приспособлена к светлому будущему, надо сказать. Начиная с высокоуровневого wait-notify, заканчивая готовыми application-серверами и развитой инфраструктурой для построения серерных решений.
— Веб-сервисы и service-oriented модель, противопоставляемая клиент-серверной модели. Некоторая философия и набор технологий, о которых можно иметь представление.
— Технологии peer-to-peer. Чрезвычайно интересная штука вообще — примеры это не только файл-обменные сети, но и платный сервис XBOX-Live. Надо иметь хорошее представление. Я, кстати, представления не имею — только слышал мнение экспертов, дружно говорят, что появления p2p — это очень неожиданная и значимая штука.
— Распределенка с целью отказоустойчивости. Пересекается с кластерами. Тоже — есть зарактерные приемы и архитектурные паттерны.

Короче говоря, теперь вроде ничего не пропустил. Дополняйте, расшыряйте, режте, выкидывайте. Теперь вам нужно выбрать фокусы для вашего курса. Хорошо дать в начале курса общий обзор в области параллельных вычислений, четко сказать, на чем вы делаете фокус, и на что сознательно забиваете болт.
Re[6]: Параллельное программирование
От: Gaperton http://gaperton.livejournal.com
Дата: 10.08.07 12:32
Оценка: 33 (2)
Здравствуйте, Didro, Вы писали:

D>Похоже, я опять перескочил через ответы на "тривиальные" вопросы. Т.е. те цели и задачи, которые приведены в предыдущем посте — это цели и задачи курса в его нынешнем состоянии. Попробую описать цели и задачи модифицированного курса. Отличий правда не много:


Ну вот, замечательно. Не хватает двух вещей.
1. Нам надо иметь картину будущего, в котором ваши студенты будут жить и благодарить вас за ваш замечательный курс.
А будущее нас будет такое:
— многоядерные процы с симметричной архитектурой — как Niagara (Ultrasparc T1 — 32 аппаратных потока).
Это означает, что параллельное программирование станет мэйнстримом, и будет сильно проще, чем сейчас.
Другими словами, довольно скоро в ходу будут более высокоровневые и менее error-prone механизмы, чем мутексы с семафорами.

— аппаратная поддержка transactional memory (Whoops! What the fuck is this?!)
Ага. Она родимая. Интел давно грозится ее реализовать. Неплохо оказатся готовым к такому варианту с любым языком, не так ли? Лок-фри структуры данных тоже будут весьма актуальны.

— ассиметричные архитектуры, ориентированной на потоковые вычисления (Cell Broadband Engine, 3D ускорители с унифицированной шейдерной архитектурой — см www.gpgpu.org).

Ага. Никакой джойнт-калькулюс тут не поможет — здесь рулят потоковые модели типа kernel-stream.

И это не отдаленное будущее. Разработчики игр под Playstation 3 уже озадачены этой проблемой — они поставлены перед фактом — надо писать под Cell. Годика через два они прочухают, как правильно управляться с Cell, и такие компании, как RapidMind им помогут. Кроме Целла, — тут прошлым летом АМД купила ATI Graphics, и анонсировала разработку проца усиленного унифицированными потоковыми шейдерными процессорами. А Интел уже второй год ведет разработку видеоускорителя, в котором в качестве шейдерных процов применются x86-совместимые процессоры.

Вот такие у нас сейчас тенденции в мире. Почему это важно? Курс у вас устарел, так? А почему он устарел? Вот именно поэтому — в нашей картине светлого будущего Ада не является языком выбора, и концепции, заложенные в него, не играют большой роли. За Аду вам студенты живущие в таком мире спасибо не скажут.

2. Нужен список prerequisites для вашего курса — что студенты должны знають к моменту его начала. Нужно это, чтобы не дублировать то, что они и так знают, и более того — задействовать предыдущие курсы, чтобы новый за них "зацеплялся". Предполагаю, что они уже прошли курс оперсистем и знакомы с понятием процессов, потоков, и примитивов синхронизации. Также, они знакомы с какими-нибудь современными языками программирования. Также, они прошли курс архитектуры ЭВМ, и знают, что такое SMP, конвейр, и прочее. Всему этому учить второй раз не надо.
_________________________
Вот теперь можно проверять ваши "цели и задачи". Проверять будем так:
1) По соответствию настоящему и будущему с учетом тенденций — насколько актуален курс.
2) По соответствию секции опыта остальным секциям — они должны быть согласованы и подкреплять друг-друга.
3) По перегруженности курса — надо выкинуть из него все, что можно выкинуть, тогда останется больше времени на полезные вещи. Особенно это касается секции "опыт".
Поехали.

D>Цели и задачи


D>Предметом курса являются методы и системы параллельной обработки информации, модели вычислений, языки параллельного программирования. В результате изучения дисциплины студенты должны:


Формулируем в одно предложение, нормальным человеческим языком, не для протокола: курс знакомит слушателя с современными и перспективными технологиями параллельного программирования, готовя его к работе программистом. Цель — все-таки научить его писать и проектировать прикладные параллельные программы.

D>1. Представлять:

• основные положения теории параллельных вычислительных процессов и структур;
Допустим. Это вспомогательный материал. Надо давать его без фанатизма.

• особенности языков параллельного программирования;
И много у нас таких языков?

• проблемы и тенденции развития языков параллельного программирования;
Ну положим. Только, я бы акцентировал внимание не на языках, а на подходах, показав их эволюцию и исторический экскурс, чтобы студенты представляли себе тенденцию. Например, wait-notify он и в африке wait-notify, а не только в яве.

• современные средства спецификации и моделирования систем параллельной обработки информации;
Кому это надо? Это хоть кто-то в практической работе использует?

• перспективные направления исследований в области параллельных вычислений и параллельного программирования.
Направления исследований -> технологии. Есть огромная разнца между наукой и технологией — и надо осознать, что вы на самом деле учите людей технологии. Разница проста — наука превращает деньги в знания, а технологии — знания в деньги. Какому из этих двух процессов вы собираетесь учить? Подсказка — ученые заняты первым, инженеры — вторым.

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

D>• особенности многопоточного программирования в ОС Microsoft ® .NET FW 2.0.

Почему именно .NET framework? То перспективные исследования — а тут вдруг такая частность. Это у нас что — нечто фундаментальное?

D>2. Знать и уметь использовать:

• формальные модели процессов и средства спецификации и моделирования механизмов взаимодействия параллельных процессов;
Нахрена, извините? Больше знать и уметь использовать нечего? Есть масса полезных вещей — lock-free структуры данных, например. Есть масса полезных умений — например, умение применять семафорный стиль, wait-notify или ваш любимый joint-calculus подход. Или "мой любимый" крышесрывательный kernel-stream.
про
• модели вычислительных процессов и методы конструирования алгоритмов параллельных вычислений;
Что это? Сети Петри, пости господи? Зачем это знать и уметь использовать, а не просто "иметь представление"?

• современные методы распараллеливания алгоритмов.
А это зачем знать? О чем вообще речь? Об алгоритмах автоматического распараллеливания?

D>3.Иметь опыт:

D>• разработки программ на языке АДА (подмножество SmallAda) и приложений для Microsoft ® WindowsTM.
Опыт разработки программ на Аде мало поможет в нашем светлом будущем, и слабо согласуется с вашим курсом. Иметь целью курса параллельного программирования получение опыта разработки приложений для MS Windows — тоже несколько странно. Вы уверены, что не ошиблись в названии курса?

D>• разработки программ на языке MC# и приложений для Microsoft ® .NET FW 2.0.

"Приложений для .NET" — то же самое. Насчет MC# — не знаю что это. Почему не COmega — как яркий представитель Joint Calculus и кандидат в мэйнстрим? Хотя, тут вам виднее.

D>• моделирования процессов вычислений в рамках различных моделей вычислений с использованием среды моделирования Ptolemy II.

Зачем? Как это согласуется с остальным?

D>Теперь, я надеюсь, контекст вопроса достаточно хорошо прорисован. Хотелось бы услышать критику "целей и задач", ну и критику по курсу в целом на основе его спецификации.


Пока — предложения:
1) Выкинуть Язык Ада к чертям — уже видно, что она совершенно лишняя.
2) Переформулировать пункты, добиться согласованности. Наполнить их, кстати, конкретикой. Те пункты, которые не съезжают на частности, наоборот — настолько общи, что подходят под все, что угодно.
3) Подумать о GPGPU, kernel-stream и потоковых можелях, транзакционной памяти, локфри-структурах.
Re: Параллельное программирование
От: Gaperton http://gaperton.livejournal.com
Дата: 08.08.07 08:19
Оценка: 24 (2)
Здравствуйте, Didro, Вы писали:

D>Возможно кто-то преподавал параллельное программирование или готовил практические занятия\семинары по этой тематике. Перед мной встала такая задача. Точнее говоря, есть желание модернизировать курс, материал, сам подход к преподаванию параллельного программирования в своем вузе. Особо обсудить эту тему не с кем, поэтому и написал сюда.


D>Любые комментарии, опыт, предложения, примеры задач и методы проведения занятий будут очень кстати.


Цель курса какая? Кого и чему вы хотите научить? В чем должен разбираться и что должен уметь ученик, сдавший ваш курс на 5, как он поможет ему в дальнейшем? Другими словами — в чем именно обусловлена необходимость присутствия этого курса в программе? Только ответив на эти вопросы можно приступать к составлению его плана и наполнения. "Модернизировать курс" — это не цель, это активность.

Второе. Курс должен в первую очередь давать обзор существующих в мире знаний, и открывать студенту возможность в дальнейшем обучаться теме самостоятельно. Поэтому, учебный курс не должен состоять из оригинальных мыслей автора, он должен быть на 100% подкреплен литературой. Следовательно, вы в первую очередь после постановки цели должны составить список хорошей, классической литературы по данной теме.

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

Как можно давать вам советы по устройству курса, не зная ответа на вопросы первого абзаца? И ведь дают, что интересно . При таком подходе у вас и получится все сваленно в кучу — ПЛИС, VHDL, C#, .NET, Java, DSP, суперкомпьютеры, многоядерные процы, и все-все-все. Получится очередной невнятный курс — сборная солянка, не имеющий четкого фокуса и не учащий студентов ничему из того, о чем идет речь.
Re: Параллельное программирование
От: SergH Россия  
Дата: 07.08.07 01:14
Оценка: 12 (1)
Здравствуйте, Didro, Вы писали:

D>Возможно кто-то преподавал параллельное программирование или готовил практические занятия\семинары по этой тематике. Перед мной встала такая задача. Точнее говоря, есть желание модернизировать курс, материал, сам подход к преподаванию параллельного программирования в своем вузе. Особо обсудить эту тему не с кем, поэтому и написал сюда.


D>Любые комментарии, опыт, предложения, примеры задач и методы проведения занятий будут очень кстати.


D>Спасибо.


Я кину ссылку моему научному руководителю, он ведёт курс, который называется "Распределённые вычислительные системы". С сентября я даже буду ему немного помогать Правда, направленность курса совсем другая. Лекции были про разное (одним словом не описать), а лабы — RPC, Java RMI, CORBA, Web Services (на жабе). Но общее, скорее всего, тоже есть.

Ещё у Танненбаума есть хорошая книжка на эту тему.
Делай что должно, и будь что будет
Re[2]: Параллельное программирование
От: igorstr  
Дата: 07.08.07 06:40
Оценка: 12 (1)
Здравствуйте, SergH, Вы писали:

SH>Здравствуйте, Didro, Вы писали:


D>>Возможно кто-то преподавал параллельное программирование или готовил практические занятия\семинары по этой тематике. Перед мной встала такая задача. Точнее говоря, есть желание модернизировать курс, материал, сам подход к преподаванию параллельного программирования в своем вузе. Особо обсудить эту тему не с кем, поэтому и написал сюда.


D>>Любые комментарии, опыт, предложения, примеры задач и методы проведения занятий будут очень кстати.


D>>Спасибо.


SH>Я кину ссылку моему научному руководителю, он ведёт курс, который называется "Распределённые вычислительные системы". С сентября я даже буду ему немного помогать Правда, направленность курса совсем другая. Лекции были про разное (одним словом не описать), а лабы — RPC, Java RMI, CORBA, Web Services (на жабе). Но общее, скорее всего, тоже есть.


SH>Ещё у Танненбаума есть хорошая книжка на эту тему.


Да, действительно, общее есть, но направленность совсем другая Мне фактически пришлось вставить в курс "Распределенные системы" раздел про параллельное программирование поскольку больше ни в одном (!) курсе у нас об этом речь не идет. А знать об этом будущим специалистам надо. Поэтому сейчас перед нами (мной и моими коллегами) тоже стоит задача разработки курса "Параллельное программирование", но начнется он не в ближайшем семестре, так что пока есть только план курса и потребность в обмене опытом.

Я хорошо знаком с работами Эдварда Ли, поскольку пишу диссертацию, связанную с параллельным программированием систем реального времени — так сказать, преодолеваю "технологический и концептуальный разрыв" между моделями программ реального времени и реализацией на конкретной вычислительной системе (в моем случае — сети DSP-процессоров). Есть и опыт разработки конкретных систем. К сожалению, с точки зрения преподавания пока этот вопрос не рассматривал, но очень интересной показалась идея использовать PtolemyII для лаб.

Очень верно отмечено, что параллельное программирование — это не только большие задачи и супер-ЭВМ. Задача "впихнуть" в курс все и не потерять при этом суть практически невыполнима. Замечу, что у Ли — это все-таки специализированный курс, посвященный в первую очередь моделям параллельного программирования в embedded системах. Наверное, правильнее всего иметь некоторый базовый курс "Параллельное программирование", обязательный для всех, и специализированные курсы по желанию: "ПП в системах реального времени", "ПП в распределенных системах" и т.п. Поэтому мы пока не включили в свой план курса такие специфические разделы (но, возможно, это обсуждение подтолкнет к тому, чтобы все-таки включить).

Очень серьезный курс читается в ННГУ (http://www.software.unn.ru/ccam/files/HTML_Version/index.html). Планируя свой курс, мы решили несколько уменьшить долю математики, но зато увеличить "охват" с технической точки зрения: показать, что параллелизм возможен не только в суперкомпьютерах, но и, скажем, при работе с внешними устройствами в системах реального времени. Необходимо, чтобы студенты с одной стороны твердо освоили классику (в том числе и пресловутых обедающих философов — все-таки один из самых наглядных примеров дедлока), с другой стороны почувствовали особенность эффективного параллельного программирования на примере более интересных задач. Кстати говоря, суммирование с использованием древовидной свертки — наиболее типичный пример (а не интересная задача). В указанном пособии ННГУ приведено еще множество подобных примеров. Дополнительные примеры можно подчерпнуть в области цифровой обработки сигналов — например, параллельная реализация дискретного преобразования Фурье. А вот использование функциональных языков и модели потоков данных — это действительно интересно.

В общем, у нас получился пока следующий план (повторяю, это только предварительный план, а не готовый курс):

1.Истоки параллелизма в вычислительных системах
a.Скалярная обработка и конвейеризация
b.Прерывания и параллельная работа устройств ввода-вывода
c.Многопроцессорные системы с общей памятью
d.Многоядерные процессоры
e.Многокомпьютерные системы с распределенной памятью
2.Модели параллельного программирования
a.Параллельные процессы
b.Потоки выполнения
c.Параллелизм данных
d.Параллелизм задач
e.Функциональное программирование
f.Модели потоков данных
3.Проблемы синхронизации параллельных процессов и потоков выполнения
a.Взаимное исключение
b.Примитивы синхронизации: семафоры, мьютексы, критические секции, мониторы Хоара, спинлоки, барьерная синхронизация
c.Классические задачи синхронизации: поставщик-потребитель, писатель-читатель, обедающие философы
d.Необходимая аппаратная поддержка
4.Основы параллельных алгоритмов
a.Законы Амдала и Густавсона
b.Понятие графа алгоритма
c.Концепция неограниченного параллелизма
d.Эквивалентные преобразования программ
e.Примеры эффективных параллельных алгоритмов: сортировка, линейная алгебра, переборные задачи оптимизации, трехмерная графика
5.Языки параллельного программирования
a.Модификация традиционных языков для поддержки параллелизма. OpenMP, mpC.
b.Функциональные языки для параллельного программирования. Erlang, Haskell.
6.Системы программирования на основе передачи сообщений
a.Интерфейс MPI
b.Система PVM
Re[12]: Параллельное программирование
От: BulatZiganshin  
Дата: 23.08.07 08:51
Оценка: 10 (1)
D>Вот о чем жалею, дак это о том, что не успеваю ввести паралелльное программирование в функциональных языках. В

посмотрите Tackling the awkward squad: monadic input/output, concurrency, exceptions, and foreign-language calls in Haskell [http://research.microsoft.com/Users/simonpj/papers/marktoberdorf/marktoberdorf.ps.gz]
Люди, я люблю вас! Будьте бдительны!!!
Re[9]: Параллельное программирование
От: Gaperton http://gaperton.livejournal.com
Дата: 13.08.07 14:07
Оценка: 5 (1)
Здравствуйте, Didro, Вы писали:

D>Здравствуйте, SergH, Вы писали:


SH>>Это оно? Т.е., фактически речь о data flow?

D>Как я понял, да. Аппаратная реализация data flow (как противоположность control flow и как часть message-oriented).
D>Предположение
зиждеться во-первых, на статье из wiki (см. также про Cell), во-вторых на Вашей цитате.

По-моему, я осторожничаю с оценкой зрелости GPGPU. Еще осенью было ясно, что наш прогноз по GPGPU сбывается вдвое более быстрыми темпами, чем мы ожидали. Вот ссылки:

SDK для разработчика от NVidia.
http://developer.nvidia.com/object/cuda.html

Аппаратные решения для HPC от nVidia.
http://www.nvidia.com/object/tesla_computing_solutions.html

А вот АМД-АТИ:
Стрим-процессор:
http://ati.amd.com/products/streamprocessor/index.html

Общая страница про стим-компьтинг.
http://ati.amd.com/technology/streamcomputing/index.html
Бедновато у них с SDK, мне кажется. nVidia, например, уже как пару лет переманила ведущего учоново из Стенфорда, который теперь эту тему у них ведет. Так что все наладится.
Параллельное программирование
От: Didro Россия home~pages
Дата: 06.08.07 21:53
Оценка: :)
Возможно кто-то преподавал параллельное программирование или готовил практические занятия\семинары по этой тематике. Перед мной встала такая задача. Точнее говоря, есть желание модернизировать курс, материал, сам подход к преподаванию параллельного программирования в своем вузе. Особо обсудить эту тему не с кем, поэтому и написал сюда.

Любые комментарии, опыт, предложения, примеры задач и методы проведения занятий будут очень кстати.

Спасибо.

Далее идут рассуждения на тему. вопрос вверху.

Я считаю, что необходимо в таком курсе подходит к параллельному программированию не тольно как к программированию супер-ЭВМ — средству решения "Больших задач" (а именно такую направленность носит фортпост параллельного программирования в России — сайт http://parallel.ru/)
В конце концов это слишком специфично с теоретический точки зрения и ещё более специфично с практической.
Поэтому хочу вдарить по всему спектру задач параллельного программирования — от Больших задач и до задач реального времени. Это так сказать крайние линии спектра, я в свое время попытался дать сравнение этих классов задач, правда получилось довольно банально:

Параметр \ Задача Большая задача Задача реального времени
Объем данныхТерабайты\ПетабайтыТерабайты\Петабайты
Тип данныхСтатичные данныеДинамические потоки данных
Реальное времяНетДа
НадежностьПроизвольнаКритична
Число одновременно решаемых задачДесятки крупных задачМножество («мелкозернистых») задач
Режим работыПакетный (Offline)Непрерывный (Online)
Взаимодействие с внешней средойПочти отсутствуетИнтенсивное
Требования к производительностиПиковая производительность для данной задачиПиковая пропускная способность
ПримерыHPC:задачи гидро- и аэродинамики, моделирование климата, моделирование в области астрономии или ядерной физики DSP, Embedded, телеком:задачи распознавания, планирования, задачи массового обслуживания, диагностики и контроля, задачи управления
Но все это параллельные системы и параллельное программирование. (не знаю, может быть у меня параноя, но мне кажется, что почему-то для большинства параллельное программирование<=>(потоки|суперкомпьютеры))
Понятно, что есть задачи, лежащие где-то между этими крайностями. Взять хотя бы такую прикладную задачу как отзывчивый-GUI или транзакции в распределенных системах, планирование исполнения запросов в БД и т.д. Я уж не говорю о такой теме как модели параллельного программирования, технологии и языки, языки(исчисления, calculus) формального описания семантики языков — тут вообще темный лес (в смысле очень много и неклассифицировано).

Я понимаю, что в один курс впихнуть невпихаемое не возможно, и что большинству слушателей курса может быть воообще до фени. Просто хотелось заинтересовать тех кто любит программирование, computer science, а такие есть.

Конкретный инструментарий пока не выбрал, ищу интересные задачки — например, как эта (Асинхронное, но последовательное выполнение)
Автор: pASkuda
Дата: 20.06.07
или эта (Суммирование с использованием древовидной свертки).
Я это к тому, что обедающие философы, это кончено классика, но сколько можно...(тем более, что знаю, слушатели курса уже знакомы с этой задачей)

Если говорить о том, чего хотелось бы достич, то в Беркли преподает процессор Эдвард А. Ли(Lee), и я бы многое отдал, чтоб посетить его курс, этот же человек возглавляет такой проект как ProlemyII (собираюсь использовать его на лабораторных) и кстати любит произведения Достоевского в оригинале . В частности у него есть такая концептуальная схемка, которая мне очень нравиться (перевод на русский мой):


Похожий вопрос обсуждали здесь
Автор: Slicer [Mirkwood]
Дата: 16.08.05
, но пока я не готов к столь активному использованию аппаратуры (в планах есть использование ПЛИС и уже сделаны первые шаги в этом направлении, но к сентябрю точно не успею), да и курс не "системы реального времени" называется.

Извиняюсь за этот поток мыслей, просто наболело.
p.s.
до недавнего времени курс базировался на описании CSP-Хоара и языке Ада(Ada95). В принципе ничего плохого, но как бы не получилось как здесь
Автор: dr.Chaos
Дата: 09.07.07
:

>Я помню был у нас препод молодой, [censored]. Так вот он так достал своим параллельным программированием на Ада старший курс, что >однажды вечером попал в больницу на 2 месяца.


p.p.s
еле удержался, чтоб не написать про многоядерность, которое делает(?) прикладное параллельное программирование актуальным...слишком уж много об этом сейчас говорят.
Re: Параллельное программирование
От: Аноним  
Дата: 07.08.07 08:44
Оценка:
Здравствуйте, Didro, Вы писали:

D>Любые комментарии, опыт, предложения, примеры задач и методы проведения занятий будут очень кстати.


Обязательно, совершенно необходимо и неизбежно надо начинать курс с рассказа о Пи-исчислении. И тогда уже не будет особой разницы между сверхпроизводительной вычислительной задачей и "отзывчивым GUI", математика за ними одна.
Re[3]: Параллельное программирование
От: Didro Россия home~pages
Дата: 07.08.07 10:13
Оценка:
Здравствуйте, igorstr, Вы писали:

I>Здравствуйте, SergH, Вы писали:

SH>>Я кину ссылку моему научному руководителю, он ведёт курс, который называется "Распределённые вычислительные системы". С сентября я даже буду ему немного помогать Правда, направленность курса совсем другая. Лекции были про разное (одним словом не описать), а лабы — RPC, Java RMI, CORBA, Web Services (на жабе). Но общее, скорее всего, тоже есть.

I>Да, действительно, общее есть, но направленность совсем другая Мне фактически пришлось вставить в курс "Распределенные системы" раздел про параллельное программирование поскольку больше ни в одном (!) курсе у нас об этом речь не идет. А знать об этом будущим специалистам надо. Поэтому сейчас перед нами (мной и моими коллегами) тоже стоит задача разработки курса "Параллельное программирование", но начнется он не в ближайшем семестре, так что пока есть только план курса и потребность в обмене опытом.


Огромное спасибо за подробный рассказ! Увидел, что есть общие точки соприкосновения и это, как говориться, радует
Re[3]: Параллельное программирование
От: Didro Россия home~pages
Дата: 07.08.07 13:24
Оценка:
D>Конкретный инструментарий пока не выбрал, ищу интересные задачки — например, как эта (Асинхронное, но последовательное выполнение) или эта (Суммирование с использованием древовидной свертки).

Здравствуйте, igorstr, Вы писали:
I>[skip] Кстати говоря, суммирование с использованием древовидной свертки — наиболее типичный пример (а не интересная задача). В указанном пособии ННГУ приведено еще множество подобных примеров. Дополнительные примеры можно подчерпнуть в области цифровой обработки сигналов — например, параллельная реализация дискретного преобразования Фурье. А вот использование функциональных языков и модели потоков данных — это действительно интересно.

Я ошибся в названии второй задачи — не "Суммирование с использованием древовидной свертки", а "Суммирование с использованием древовидной свертки на базе асинхронных списков", возможно Вы имеено так меня и поняли. Собственно я эту задачу отнес к разряду интересных, поскольку в ней явно присутствует динамичность (зависимость от потока данных), что отличает её от стандартных типовых задач по параллельному программированию и придает оттенок задачи реального времени. Опыта у меня немного, и поэтому возможно я и ошибаюсь. Скажем тоже параллельное преобразование Фурье, оно, если говорить о не о задаче потокового преобразования Фурье, ближе к большим задачам и типовым задачам. Конечно это все непринципиально, просто решил уточнить. (вообще для меня 2-мя самыми частными премерами в параллельном программировании стали перемножение матриц и "параллельный Фурье").

Отдельное спасибо за ссылку на ННГУ — очень основательное пособие.
Re[4]: Параллельное программирование
От: igorstr  
Дата: 08.08.07 06:13
Оценка:
Здравствуйте, Didro, Вы писали:

D>Я ошибся в названии второй задачи — не "Суммирование с использованием древовидной свертки", а "Суммирование с использованием древовидной свертки на базе асинхронных списков", возможно Вы имеено так меня и поняли. Собственно я эту задачу отнес к разряду интересных, поскольку в ней явно присутствует динамичность (зависимость от потока данных), что отличает её от стандартных типовых задач по параллельному программированию и придает оттенок задачи реального времени. Опыта у меня немного, и поэтому возможно я и ошибаюсь. Скажем тоже параллельное преобразование Фурье, оно, если говорить о не о задаче потокового преобразования Фурье, ближе к большим задачам и типовым задачам. Конечно это все непринципиально, просто решил уточнить. (вообще для меня 2-мя самыми частными премерами в параллельном программировании стали перемножение матриц и "параллельный Фурье").


Вы правы, я хотел подчеркнуть, что именно зависимость от потока данных является самым интересным местом в приведенной ссылке. Дело тут даже не в близости к задачам реального времени, а в иной модели (парадигме) параллельного программирования. То, что Вы называете типовыми задачами, по всей видимости, следует отнести к императивной модели программирования или, иначе говоря, стилю Фон-Неймана. В этой модели программа представляет собой запись некоторого алгоритма, т.е. четко заданной последовательности операций. В результате, при переходе к параллельным вычислениям алгоритмы, составленные для последовательных вычислений, становятся неэффективными и приходится развивать целую теорию эквивалентных преобразований программ на основе графа алгоритма, о чем очень подробно написано в известной книге В.В. Воеводин, Вл.В. Воеводин "Параллельные вычисления". Это, так сказать, классический подход.

Альтернативой является управление вычислениями на основе потока данных. В этом случае мы выделяем некоторые блоки вычислений, связанные между собой только по данным и говорим, что любой блок можно начать выполнять тогда, когда будут готовы все исходные данные. В результате можно построить параллельный вычислитель, отличный от машины Фон-Неймана, который сам решает, когда какие действия эффективнее всего выполнять, и распараллеливание происходит естественно и практически автоматически. Это дает стимул развития моделей программирования на основе потоков данных (Data Flow), в частности, модель Synchronous Data Flow (SDF) оказалась очень удобной для задач цифровой обработки сигналов. Модель потоков данных тесно связана с функциональным программированием. Ряд функциональных языков (напр. Haskell) позволяют т.н. ленивые вычисления, что также по сути управление на основе потока данных, только "наоборот": вычисление некоторых значений может быть отложено до того момента, пока данные не понадобятся. Этой темой как раз занимался SergH в своем дипломном проекте под моим руководством. Подобный подход может быть применен не только в задачах реального времени (с динамическим поступлением данных), но и в "больших" задачах со статически заданными исходными данными.
Re[2]: Параллельное программирование
От: Didro Россия home~pages
Дата: 08.08.07 13:19
Оценка:
Здравствуйте, Gaperton, Вы писали:

Спасибо за объективную критику, у Вас, по всей видимости, сложилось впечатление, что я с шашкой на голо мчусь модернизировать преподавание программирования и т.д. Это _не так_. К тому же я не создаю курс с нуля, а базируюсь на существующем курсе, с целостной (насколько это возможно) программой обучения и списком литературы (отсутствием которой Вы меня попрекаете, как я понял)

G>Цель курса какая? Кого и чему вы хотите научить? В чем должен разбираться и что должен уметь ученик, сдавший ваш курс на 5, как он поможет ему в дальнейшем? Другими словами — в чем именно обусловлена необходимость присутствия этого курса в программе? Только ответив на эти вопросы можно приступать к составлению его плана и наполнения. "Модернизировать курс" — это не цель, это активность.


Извините. Насколько я понимаю, это слова менеджера
Автор: Gaperton
Дата: 13.02.07
, но не исследователя. По сути дела все, эти вопросы тривиальны, а значит прямые ответы на них неконструктивны. (я не говорю, что вопросы не правильные)

G>Второе. Курс должен в первую очередь давать обзор существующих в мире знаний, и открывать студенту возможность в дальнейшем обучаться теме самостоятельно. Поэтому, учебный курс не должен состоять из оригинальных мыслей автора, он должен быть на 100% подкреплен литературой. Следовательно, вы в первую очередь после постановки цели должны составить список хорошей, классической литературы по данной теме.


Об этом я уже написал выше. Кстати преподавание как субъективная передача знаний, даже на 100% подкрепленных литературой, все-равно будет оригинальным изложением преподавателем мыслей авторов.

G>Как можно давать вам советы по устройству курса, не зная ответа на вопросы первого абзаца? И ведь дают, что интересно .

Думаю, Вы не имеете в виду советы, которые приведены в этом треде.

G>При таком подходе у вас и получится все сваленно в кучу — ПЛИС, VHDL, C#, .NET, Java, DSP, суперкомпьютеры, многоядерные процы, и все-все-все. Получится очередной невнятный курс — сборная солянка, не имеющий четкого фокуса и не учащий студентов ничему из того, о чем идет речь.


Я об этом уже писал, когда говорил, что нельзя "впихнуть не впихаемое". Безусловно, параллельное программирование, в общем, почти такая же широкая тема, как и программирование, вообще. igorstr говорит
Автор: igorstr
Дата: 07.08.07
о необходимости создания отдельных факультативных курсов и я с ним согласен, правда возможности у меня такой нет.
К тому же, на мой взгляд, сейчас параллельное программирование само по себе большая солянка — нет даже единой классификации моделей параллельного программирования. О широте спектра языков\технологий и подавно говорить нечего.

Спасибо за критику.
Re[3]: Параллельное программирование
От: SergH Россия  
Дата: 08.08.07 14:01
Оценка:
Здравствуйте, Didro, Вы писали:

D>Извините. Насколько я понимаю, это слова менеджера
Автор: Gaperton
Дата: 13.02.07
, но не исследователя. По сути дела все, эти вопросы тривиальны, а значит прямые ответы на них неконструктивны. (я не говорю, что вопросы не правильные)


Почему тривиальны и неконструктивны?
Очень правильные вопросы, имхо.

Во-первых, есть как минимум два принципиально разных подхода — со стороны математика (пи-исчисление, Аноним выше по ветке советовал) и со стороны технологий. Но тут, боюсь, что с математикой не получится, потому что не неё нужно много времени. Правда, оговорюсь, что сам пи-исчислением не владею, так что может и хватит — х.з.

Во-вторых, технологии тоже бывают разные. VHDL, C#, Erlang, OpenMP — четыре _принципиально_ разных подхода к параллелизму. И это только языки программирования (OpenMP — с натяжкой, но тем не менее). Ещё есть технологии — от MPI до WebServices. А есть ещё параллелизм уровня исполнения команд — MMX/SSE, конвейеры и процессор Itanium. К счастью, процессоры у нас были в отдельном курсе.

А ещё можно затрагивать кучу интересных вопросов — когерентность кешей, доступ к памяти (SMP, NUMA), безопасность, отслеживание дедлоков (в смысле, по графу "кто кого ожидает" определить, сто мы в дедлоке и прибить лишнего), протоколы выборов и т.п..

Так что в явном виде описать, что мы хотим получить на выходе — далеко не лишнее. Иначе область не обозначить.

Имхо, было бы здорово как-нибудь явно разделить "параллелизм вообще" и "технологии". Потому что последних — море разливанное.. Это похоже на математический подход, которым я не владею и в котором немного сомневаюсь..

Можно отделить параллелизм и РВС. Типа, работаем на одной машине. Тогда уходит куча технологий (да практически все), уходят вопросы безопасности и ещё много чего.

Но, в общем, выбор надо обозначить явно. Иначе получится неизвестно что. Вполне возможно, интересное, но не целостное.
Делай что должно, и будь что будет
Re[4]: Параллельное программирование
От: Didro Россия home~pages
Дата: 08.08.07 14:32
Оценка:
Здравствуйте, SergH, Вы писали:

SH>Почему тривиальны и неконструктивны?

Потому что ответы на них имеют не большую ценность чем "Прежде чем что-то делать, нужно знать что делать и как делать", "Нужно заниматься проектированием систем", "Моейте руки перед едой" и пр.

SH>Очень правильные вопросы, имхо.

Вопросы правильные, согласен, я об этом так и написал.

SH>Во-первых, есть как минимум два принципиально разных подхода — со стороны математика (пи-исчисление, Аноним выше по ветке советовал) и со стороны технологий. Но тут, боюсь, что с математикой не получится, потому что не неё нужно много времени. Правда, оговорюсь, что сам пи-исчислением не владею, так что может и хватит — х.з.


Это не просто математический подход — это одно из стредств описания семантики языка программирования. Вообще мне известны 3-и подхода:

Более подробно эта тема описывается в книге Concepts, Techniques, and Models of Computer Programming. Ссылку на неё мне дали в этом
Автор: Didro
Дата: 21.04.07
сообщении.

SH>Во-вторых, технологии тоже бывают разные. [skip]

SH>А ещё можно затрагивать кучу интересных вопросов — [skip]
SH>Так что в явном виде описать, что мы хотим получить на выходе — далеко не лишнее. Иначе область не обозначить.
Согласен. Вам не кажется что это очевидная вещь?

SH>Можно отделить параллелизм и РВС. Типа, работаем на одной машине. Тогда уходит куча технологий (да практически все), уходят вопросы безопасности и ещё много чего.

Да факультативные\отдельные курсы это хорошо. Разделяй и влавствуй, только ресурсов иногда не хватает на реализацию этого принципа.

SH>Но, в общем, выбор надо обозначить явно. Иначе получится неизвестно что. Вполне возможно, интересное, но не целостное.

Согласен.
Re[5]: Параллельное программирование
От: SergH Россия  
Дата: 08.08.07 16:09
Оценка:
Здравствуйте, Didro, Вы писали:

D>Это не просто математический подход — это одно из стредств описания семантики языка программирования.


Угу, в данном случае — на основе модели взаимодействующих процессов. Ещё, используя всякие исчисления, можно доказывать какие-то утверждения о программах... Типа возможности/невозможности дедлока.

D>Более подробно эта тема описывается в книге Concepts, Techniques, and Models of Computer Programming.


Да да да, литературы для самообразования у меня уже на несколько лет непрерывного чтения, эта книжка в списке тоже есть

SH>>Так что в явном виде описать, что мы хотим получить на выходе — далеко не лишнее. Иначе область не обозначить.

D>Согласен. Вам не кажется что это очевидная вещь?

Очевидная. Но вы же этого пока не сделали...

SH>>Можно отделить параллелизм и РВС. Типа, работаем на одной машине. Тогда уходит куча технологий (да практически все), уходят вопросы безопасности и ещё много чего.

D>Да факультативные\отдельные курсы это хорошо. Разделяй и влавствуй, только ресурсов иногда не хватает на реализацию этого принципа.

Это другой вопрос. Можно сунуть в один курс, но разделить по времени. Можно ещё как-то... Я не знаю ваших условий, я пока даже не знаю ваших желаний То, что логичным кажется мне, не обязательно кается логичным вам.

SH>>Но, в общем, выбор надо обозначить явно. Иначе получится неизвестно что. Вполне возможно, интересное, но не целостное.

D>Согласен.

Ну и? Или в том и заключался исходный вопрос — какую область выбрать для преподавания?
Делай что должно, и будь что будет
Re[6]: Параллельное программирование
От: Didro Россия home~pages
Дата: 08.08.07 16:24
Оценка:
Здравствуйте, SergH, Вы писали:

SH>Ну и? Или в том и заключался исходный вопрос — какую область выбрать для преподавания?

Просто после нескольких месяцев варения на собственной кафедре захотелось взгляда со стороны, захотелось посмотреть, кто занимается подобной проблематикой в России, как рассматриваются вопросы преподавания организации курсов данной тематики. Это знаете, как прожить некоторое время на необитаемом острове, а потом узнать, что можно было вплавь добраться до материка Был очень рад, что работы Ли известны у нас и пр.

Возможно слишком резко писал про очевидность, тривиальность и неконструктивность извиняйте...
Re[7]: Параллельное программирование
От: SergH Россия  
Дата: 08.08.07 17:44
Оценка:
Здравствуйте, Didro, Вы писали:

D>Просто после нескольких месяцев варения на собственной кафедре захотелось взгляда со стороны, захотелось посмотреть, кто занимается подобной проблематикой в России, как рассматриваются вопросы преподавания организации курсов данной тематики. Это знаете, как прожить некоторое время на необитаемом острове, а потом узнать, что можно было вплавь добраться до материка Был очень рад, что работы Ли известны у нас и пр.




D>Возможно слишком резко писал про очевидность, тривиальность и неконструктивность извиняйте...


Да не, не резко.. Просто, из того, что это очевидно и тривиально, не следует, что это делать не надо.. Если бы я знал, чему и зачем (и почему именно этому и за этим) хочу научить студентов, непременно бы поделился.
Делай что должно, и будь что будет
Re[3]: Параллельное программирование
От: Gaperton http://gaperton.livejournal.com
Дата: 09.08.07 12:18
Оценка:
Здравствуйте, Didro, Вы писали:

D>Спасибо за объективную критику, у Вас, по всей видимости, сложилось впечатление, что я с шашкой на голо мчусь модернизировать преподавание программирования и т.д. Это _не так_. К тому же я не создаю курс с нуля, а базируюсь на существующем курсе, с целостной (насколько это возможно) программой обучения и списком литературы (отсутствием которой Вы меня попрекаете, как я понял)


G>>Цель курса какая? Кого и чему вы хотите научить? В чем должен разбираться и что должен уметь ученик, сдавший ваш курс на 5, как он поможет ему в дальнейшем? Другими словами — в чем именно обусловлена необходимость присутствия этого курса в программе? Только ответив на эти вопросы можно приступать к составлению его плана и наполнения. "Модернизировать курс" — это не цель, это активность.


D>Извините. Насколько я понимаю, это слова менеджера
Автор: Gaperton
Дата: 13.02.07
, но не исследователя. По сути дела все, эти вопросы тривиальны, а значит прямые ответы на них неконструктивны. (я не говорю, что вопросы не правильные)


А вы все-таки попробуйте ответить на эти вопросы. И напишите ответы сюда. Это не так просто, как вам кажется. Вот допустим, включать вам математический модели разного параллелизма в курс, или нет? Ответить на этот вопрос можно только имея цели, отсортированные по приоритетам. Кого вы готовите? Ученых, инженеров? Какая специальность у этих студентов? Этот курс для них профильный или вспомогательный? Если второе, то каким именно образом он соприкасается с их основной специальностью? Ответы на данные вопросы довольно однозначно влияют на программу. И ответы на них далеко не тривиальны — откуда мне знать, — этот курс читается математикам, программистам, микроэлектронщикам или строителям. Содержимое курса будет радикально разным.

Вот вы говорите — с точки зрения исследователя . Мне приходилось руководить исследовательскими работами. Все то же самое — все идет от целеполагания. Что у нас этот исследователь исследует? Цели внятные и проверяемые у его исследований есть? Сам себе он цели ставит? Конечно чтавит, и глобальные и промежуточные, сознательно или безсознательно. Ну вот, я вам предлагаю подойти к этому процессу сознательно.

G>>Второе. Курс должен в первую очередь давать обзор существующих в мире знаний, и открывать студенту возможность в дальнейшем обучаться теме самостоятельно. Поэтому, учебный курс не должен состоять из оригинальных мыслей автора, он должен быть на 100% подкреплен литературой. Следовательно, вы в первую очередь после постановки цели должны составить список хорошей, классической литературы по данной теме.


D>Об этом я уже написал выше. Кстати преподавание как субъективная передача знаний, даже на 100% подкрепленных литературой, все-равно будет оригинальным изложением преподавателем мыслей авторов.


Я думаю, вы понимаете, что я имею в виду. Я ведь не об абстрактной философии говорю.

G>>Как можно давать вам советы по устройству курса, не зная ответа на вопросы первого абзаца? И ведь дают, что интересно .

D>Думаю, Вы не имеете в виду советы, которые приведены в этом треде.

Отчего же. Именно их.

G>>При таком подходе у вас и получится все сваленно в кучу — ПЛИС, VHDL, C#, .NET, Java, DSP, суперкомпьютеры, многоядерные процы, и все-все-все. Получится очередной невнятный курс — сборная солянка, не имеющий четкого фокуса и не учащий студентов ничему из того, о чем идет речь.


D>Я об этом уже писал, когда говорил, что нельзя "впихнуть не впихаемое". Безусловно, параллельное программирование, в общем, почти такая же широкая тема, как и программирование, вообще. igorstr говорит
Автор: igorstr
Дата: 07.08.07
о необходимости создания отдельных факультативных курсов и я с ним согласен, правда возможности у меня такой нет.


Зная ответы на очевидные и тривиальные вопросы, вы без проблем выкинете из курса лишнее. Не зная ответы на эти вопросы, вы будете думать, думать, думать...

D>К тому же, на мой взгляд, сейчас параллельное программирование само по себе большая солянка — нет даже единой классификации моделей параллельного программирования. О широте спектра языков\технологий и подавно говорить нечего.


Задача преподавателя в том и состоит, чтобы найти в "сборной солянке" нечто общее, стержневое, тогда солянка и превратится в курс. А сделать этого нельзя, не определившись с целями.

D>Спасибо за критику.


Да это не критика. Я ничего не критикую, я вам помочь хочу. Чисто, как менеджер, а не как исследователь. Что такое хорошие курсы я знаю — я ВМиК МГУ закончил. Там, кстати, распределенных вычислений зависит от потока — программистам читают одно, а вычислительным математикам совершенно другое. Грубо говоря — первых учат понимать устройство и принципы построения системного параллельного софта, а вторых учат писать параллельные программы.
Re[4]: Параллельное программирование
От: Didro Россия home~pages
Дата: 09.08.07 14:14
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>>>Цель курса какая? Кого и чему вы хотите научить? В чем должен разбираться и что должен уметь ученик, сдавший ваш курс на 5, как он поможет ему в дальнейшем? Другими словами — в чем именно обусловлена необходимость присутствия этого курса в программе? Только ответив на эти вопросы можно приступать к составлению его плана и наполнения. "Модернизировать курс" — это не цель, это активность.


G>А вы все-таки попробуйте ответить на эти вопросы. И напишите ответы сюда. Это не так просто, как вам кажется.


Хорошо. Здесь лежит действующая до сих пор программа курса. Ниже выдержки из неё.

Цели и задачи курса

Предметом курса являются методы и системы параллельной обработки информации, средства спецификации параллельных процессов, языки параллельного программирования, автоматическое распараллеливание последовательных алгоритмов. В результате изучения дисциплины студенты должны:
1. Представлять:
• основные положения теории параллельных вычислительных процессов и структур;
• особенности языков параллельного программирования;
• проблемы и тенденции развития языков параллельного программирования;
• современные средства спецификации и моделирования систем параллельной обработки информации;
• перспективные направления исследований в области параллельных вычислений и параллельного программирования.
2. Знать и уметь использовать:
• формальные модели процессов и средства спецификации и моделирования механизмов взаимодействия параллельных процессов;
• модели вычислительных процессов и методы конструирования алгоритмов параллельных вычислений;
• современные методы распараллеливания алгоритмов.
3. Иметь опыт: разработки программ на языке АДА (подмножество SmallAda) и приложений для Microsoft ® WindowsTM.

Кого учим:
студентов направления: 552800 — "Информатика и вычислительная техника" и специальности 220400 — “Программное обеспечение вычислительной техники и автоматизированных систем”. Т.е. это инженеры-программисты, есть несколько магистров (я из их числа).

Краткое содержание курса
1. Архитектура параллельных систем
2. Теоретические модели параллельных алгоритмов, программ и систем
3. Принципы организации взаимодействия параллельных процессов в языке АДА

Контекст
5 курс, первый семестр. Понятно, что многие работают и понятно, что до этого было множество соприкасающихся курсов.
Существуют такие факультативные курсы: Системы реального времени, Мобильные операционные системы, Моделирование систем, Системы распознавания. К сожалению в этом году их вести никто не будет...

Мой научный руководитель, который ведет данный курс(ПаралПрог), занимается обработкой сигналов (изображения, речевые и технические одномерные и акустические сигналы), диагностика и распознование — отсюда тяга к системам реального времени, ПЛИСам и прочему. Это частично отражается на лабораторных, в частности задачки на АДА лежат в области систем управления производством (правда про SCADA ничего не говориться, да и программируются решения этих задач не под ОС реального времени, хотя АДА позволяет).

Теперь о модернизации, т.е. зачем и почему модернизировать. Все просто с формальной позиции — курс необновлялся достаточно долго (7 лет), а развитие параллельного программирования произошло достаточно существенное. С позиции субъективной — я поставил себе сверхзадачу "сделать на кафедре второй Беркли" (это все влияние профессора Эдварда Ли (писал об этом раньше)). Может кто-то скажет, что это юнешеский максимализм и неспособность оценить реальные возможности — наверное это так и есть, иначе никто бы не знал про "юнешеский максимализм" . На самом деле я не хочу потерять два года ("обучаясь" в магистратуре и возможно потом в аспиратнтуре), хочу саморазвития , а проще всего это сделать, в моем контексте и в моих условиях, при поддержке других людей, в частности из ВУЗа.

План модернизации:


Как видите особого криминала вроде как и нет

Что упущено (список конечно же не полный): lock-free структуры данных; futures и data-flow в языках программирования; почти незатрагивается вопрос влияния модели памяти на параллельное программирование; Легкие потоки (Erlang); Технологии OpenMP, MPI, PVM;
Re[5]: Параллельное программирование
От: Didro Россия home~pages
Дата: 09.08.07 19:22
Оценка:
Похоже, я опять перескочил через ответы на "тривиальные" вопросы. Т.е. те цели и задачи, которые приведены в предыдущем посте — это цели и задачи курса в его нынешнем состоянии. Попробую описать цели и задачи модифицированного курса. Отличий правда не много:

Цели и задачи

Предметом курса являются методы и системы параллельной обработки информации, модели вычислений, языки параллельного программирования. В результате изучения дисциплины студенты должны:

1. Представлять:
•[без изменений]
+
• особенности многопоточного программирования в ОС Microsoft ® .NET FW 2.0.
2. Знать и уметь использовать:
•[без изменений]
3.Иметь опыт:
• разработки программ на языке АДА (подмножество SmallAda) и приложений для Microsoft ® WindowsTM.
• разработки программ на языке MC# и приложений для Microsoft ® .NET FW 2.0.
• моделирования процессов вычислений в рамках различных моделей вычислений с использованием среды моделирования Ptolemy II.

Теперь, я надеюсь, контекст вопроса достаточно хорошо прорисован. Хотелось бы услышать критику "целей и задач", ну и критику по курсу в целом на основе его спецификации.
Re[7]: Параллельное программирование
От: Didro Россия home~pages
Дата: 10.08.07 13:44
Оценка:
Спасибо, нет слов
Буду рефакторить курс.
С частностями иногда был не согласен, но в целом думаю прочувствовал верно.
Re[4]: Параллельное программирование
От: rising_edge  
Дата: 10.08.07 14:00
Оценка:
Здравствуйте, SergH, Вы писали:

SH> VHDL, C#, Erlang, OpenMP — четыре _принципиально_ разных подхода к параллелизму. И это только языки программирования (OpenMP — с натяжкой, но тем не менее).


VHDL — тоже с натяжкой. Это не совсем язык программирования. "Программирование" на VHDL — это тонкая грань между программированием и схемотехникой. На VHDL описываются цифровые схемы, которые потом лягут в железо (FPGA или ASIC). Поэтому надо представлять, во что в железе выльется та или иная констукция языка, насколько она оптимально ляжет в архитектуру, скажем, FPGA. Т. е. надо иметь хотя бы элементарное понятие о цифровых устройствах (логические элементы, шифраторы, триггеры, счетчики и т. п.). Без этого смысла изучения VHDL нет. Если готовятся программисты, то VHDL им не нужен.

Как показывает опыт сидения на разных форумах, где собираются разработчики железа, программисты, по каким-то причинам начавшие писать на VHDL или Verilog, рассматиривают их именно как языки программирования, а не как языки описания схем. Поэтому и возникают вопросы типа "А как мне сделать, чтобы по фронту одного сигнала регистр загружался, а по фронту другого — сдвигался". И приходится каждый раз объяснять, что в FPGA нет триггеров, которые работают по фронтам двух сигналов и что такие задачи решаются другим способом. Что есть такое понятие, как синхронный дизайн, и почему именно он используется при разработке FPGA. Что есть такая штука, как синтезируемое подмножество языка. И многое другое.

Это все должен быть отдельный курс, а не часть курса "Параллельное программирование". И не для программистов.
Re[7]: Параллельное программирование
От: SergH Россия  
Дата: 10.08.07 14:06
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>3) Подумать о GPGPU, kernel-stream и потоковых можелях, транзакционной памяти, локфри-структурах.


По словосочетанию kernel stream гугл находит очень много про разработку драйверов и мало по делу.

Кусочек, показавшийся мне похожим на то, что нужно:

http://www.isis.vanderbilt.edu/publications/archive/Eames_BK_10_11_2000_Interfacin.pdf

There may be several processes allocated to a particular node. Processes can exchange data through streams. A stream represents a queue of messages, managed by the kernel, connecting a source process to a destination process. A process may send and receive messages through streams via an API provided by the kernel. The kernel is responsible for ensuring that messages enqueued into a stream reach the appropriate destination process. Many times, the destination process will reside on a different node than the source process.


Это оно? Т.е., фактически речь о data flow?
По каким словам лучше искать?
Делай что должно, и будь что будет
Re[5]: Параллельное программирование
От: SergH Россия  
Дата: 10.08.07 14:15
Оценка:
Здравствуйте, rising_edge, Вы писали:

_>VHDL — тоже с натяжкой. Это не совсем язык программирования. "Программирование" на VHDL — это тонкая грань между программированием и схемотехникой. На VHDL описываются цифровые схемы, которые потом лягут в железо (FPGA или ASIC).


Спасибо, я в курсе
Незнакомые аббревиатуры и слова стараюсь не употреблять, если же употребляю — всегда явно оговариваю. Имхо, это просто правило хорошего тона.

_> Поэтому надо представлять, во что в железе выльется та или иная констукция языка, насколько она оптимально ляжет в архитектуру, скажем, FPGA. Т. е. надо иметь хотя бы элементарное понятие о цифровых устройствах (логические элементы, шифраторы, триггеры, счетчики и т. п.). Без этого смысла изучения VHDL нет. Если готовятся программисты, то VHDL им не нужен.


Нужен-не нужен... Право слово, какой вы скучный. У нас очень смешная кафедра, они сами не знают, кого готовят Мне было интересно изучать VHDL (схемотехника перед этим, естественно, тоже была, куда же без неё).

_>Это все должен быть отдельный курс, а не часть курса "Параллельное программирование". И не для программистов.


Я просто перечислял подходы, обеспечивающие параллельность. Включать всё это в курс не надо, конечно. Но представление можно дать.
Делай что должно, и будь что будет
Re[8]: Параллельное программирование
От: Didro Россия home~pages
Дата: 10.08.07 15:01
Оценка:
Здравствуйте, SergH, Вы писали:

SH>Это оно? Т.е., фактически речь о data flow?

Как я понял, да. Аппаратная реализация data flow (как противоположность control flow и как часть message-oriented).
Предположение
зиждеться во-первых, на статье из wiki (см. также про Cell), во-вторых на Вашей цитате.
Re[7]: Параллельное программирование
От: Didro Россия home~pages
Дата: 10.08.07 15:06
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Пока — предложения:


G>1) Выкинуть Язык Ада к чертям — уже видно, что она совершенно лишняя.

Может быть, может быть. Однако, во-первых, Ada язык параллельного программирования, высокоуровневый язык параллельного программирования, во-вторых в нем взаимодействие процессов(в терминах Ada это задачи) реализовано на базе рандеву, что делает семантику взаимодействий прозрачной и интуитивно понятной. В-третьих есть такая нотация Бара для описания параллельно взаимодействующих процессов при проектировании параллельных программ. Т.е. ada обеспечивает цельную методологию. Думаю, все же это полезный базис для инженера.
Я рассматриваю вопрос о том, применять ли Ada на лабораторных или нет. Но на лекциях про неё обязательно говорить нужно, поскольку методология (а это в Ada скорее интуитивный подход, нежили формализмы) обязательна для инженера. Это конечно не сети Петри и не Параллельные асинхронные блоксхемы.

G>2) Переформулировать пункты, добиться согласованности. Наполнить их, кстати, конкретикой. Те пункты, которые не съезжают на частности, наоборот — настолько общи, что подходят под все, что угодно.

Тут не поспоришь

G>3) Подумать о GPGPU, kernel-stream и потоковых можелях, транзакционной памяти, локфри-структурах.

Пока, что из этого всего реально (с поддержкой в лабораторных) можно в наших условиях давать только локфри-структуры. Для GPGPU нужна минимальная поддержка шейдеров (т.е. хотя бы ps\vs 2.0), может быть она будет, может не будет.
Для транзакицонной памяти и streaming-a нужны эмуляторы, либо моделирование (поскольку Cell'ов нету), а транзакиционная память, как я понимаю, существует на уровне прототипов. Понимаю, что нужно крутиться и искать варианты. Пока что по третьему пункту вижу выход только в моделировании (вот тут-то как раз PtolemyII и пригодиться)\поиске эмуляторов на ПК.
Но покрайней мере, можно давать streaming\GPGPU только в теории, что будет конечно не так полезно.
Re[8]: Параллельное программирование
От: Gaperton http://gaperton.livejournal.com
Дата: 13.08.07 13:48
Оценка:
Здравствуйте, Didro, Вы писали:

D>Здравствуйте, Gaperton, Вы писали:


G>>Пока — предложения:


G>>1) Выкинуть Язык Ада к чертям — уже видно, что она совершенно лишняя.

D>Может быть, может быть. Однако, во-первых, Ada язык параллельного программирования, высокоуровневый язык параллельного программирования, во-вторых в нем взаимодействие процессов(в терминах Ada это задачи) реализовано на базе рандеву, что делает семантику взаимодействий прозрачной и интуитивно понятной. В-третьих есть такая нотация Бара для описания параллельно взаимодействующих процессов при проектировании параллельных программ. Т.е. ada обеспечивает цельную методологию. Думаю, все же это полезный базис для инженера.
D>Я рассматриваю вопрос о том, применять ли Ada на лабораторных или нет. Но на лекциях про неё обязательно говорить нужно, поскольку методология (а это в Ada скорее интуитивный подход, нежили формализмы) обязательна для инженера. Это конечно не сети Петри и не Параллельные асинхронные блоксхемы.
Да, конечно. Я имел в виду — выкинуть из практического опыта.

G>>3) Подумать о GPGPU, kernel-stream и потоковых можелях, транзакционной памяти, локфри-структурах.

D>Пока, что из этого всего реально (с поддержкой в лабораторных) можно в наших условиях давать только локфри-структуры. Для GPGPU нужна минимальная поддержка шейдеров (т.е. хотя бы ps\vs 2.0), может быть она будет, может не будет.
D>Для транзакицонной памяти и streaming-a нужны эмуляторы, либо моделирование (поскольку Cell'ов нету), а транзакиционная память, как я понимаю, существует на уровне прототипов. Понимаю, что нужно крутиться и искать варианты. Пока что по третьему пункту вижу выход только в моделировании (вот тут-то как раз PtolemyII и пригодиться)\поиске эмуляторов на ПК.
D>Но покрайней мере, можно давать streaming\GPGPU только в теории, что будет конечно не так полезно.

Все эти технологии пока в зачаточном и нестабильном состоянии — нет устоявшейся методологии, принятой индустрией, и нет обкатанных средств раработки. Вряд ли разумно требовать для них "иметь опыт" — лучше ограничиться "иметь представление" или в определенной степени "знать и уметь". Лучше наверно будет нечто среднее — "понимать" .
Re[8]: Параллельное программирование
От: Gaperton http://gaperton.livejournal.com
Дата: 13.08.07 13:53
Оценка:
Здравствуйте, Didro, Вы писали:

D>Спасибо, нет слов

D>Буду рефакторить курс.
D>С частностями иногда был не согласен, но в целом думаю прочувствовал верно.

А вообще — я хотел на самом деле важность системного подхода показать, а не картины будущего. Хотел проиллюстрировать примером, как достигается "трассировка требований" — чтобы вы сами понимали, что вы курс включаете а что нет, почему и зачем. Картинку будущего лучше будет если вы сами составите. Я ведь ошибиться могу...
Re[10]: Параллельное программирование
От: Gaperton http://gaperton.livejournal.com
Дата: 13.08.07 14:08
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Здравствуйте, Didro, Вы писали:


D>>Здравствуйте, SergH, Вы писали:


SH>>>Это оно? Т.е., фактически речь о data flow?

D>>Как я понял, да. Аппаратная реализация data flow (как противоположность control flow и как часть message-oriented).
D>>Предположение
зиждеться во-первых, на статье из wiki (см. также про Cell), во-вторых на Вашей цитате.

G>По-моему, я осторожничаю с оценкой зрелости GPGPU. Еще осенью было ясно, что наш прогноз по GPGPU сбывается вдвое более быстрыми темпами, чем мы ожидали. Вот ссылки:


Короче, вполне практикум уже можно проводить, если это автор сочтет нужным, конечно.
Re[9]: Параллельное программирование
От: Didro Россия home~pages
Дата: 13.08.07 14:25
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>А вообще — я хотел на самом деле важность системного подхода показать, а не картины будущего. Хотел проиллюстрировать примером, как достигается "трассировка требований" — чтобы вы сами понимали, что вы курс включаете а что нет, почему и зачем. Картинку будущего лучше будет если вы сами составите. Я ведь ошибиться могу...


Как бы там оно потом не было, вы мне уже сейчас помогли . Спасибо.

p.s.
Кстати, вот по Cell нашел несколько ссылок (в том числе на учебные курсы) 1, 2. (Эмулятор и материалы курса по Cell в MIT.)
Брать все это добро или не брать — вопрос пока в процессе решения
Re[10]: Параллельное программирование
От: BulatZiganshin  
Дата: 22.08.07 20:58
Оценка:
Здравствуйте, Didro, Вы писали:

однако. во-первых, вы не разделяете параллельное и конкурентное программирование. первое — это методики исподльзования мощности многих прцессоров для ускорения решения задач, второе — разюбиение потока выполнения программы на несколько одновнременно выполняющихся ветвей для упрощения самого процесса программирования

второе — ада сейчас реликт, тупиковая ветвь развития. изучать имхо стоит императивную модель (c# или java) и функциональную (erlang/haskell). начинать — с csp, который хорошо ложится на функциональную модель, а затем переходить к c# — т.е. идти от высокоуровневого, теоретического материала к низкоуровневому и более практическому. это всё относится к изучению concurrency, т.е. того, как вообще можно организовать многозадачность и взаимоде1ствие между задачами

имея в своём распоряжении этот инструмент, дальше можно переходить к параллелизму — т.е. преобразованию обычных задач в многопоточные. и тут уже вводить mapreduce, пулы потоков и тому подобные вещи

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

к этому базовому курсу ещё неплохо добавить другие теретчисекие подходы к распараллеливанию (data flow и т.д.), и STM-память как новую парадигму для приклыдного программиста (в отличие от lock-free структур, использование которых не отличается от обычных)
Люди, я люблю вас! Будьте бдительны!!!
Re[11]: Параллельное программирование
От: Didro Россия home~pages
Дата: 23.08.07 06:43
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:

BZ>однако. во-первых, вы не разделяете параллельное и конкурентное программирование. первое — это методики исподльзования мощности многих прцессоров для ускорения решения задач, второе — разюбиение потока выполнения программы на несколько одновнременно выполняющихся ветвей для упрощения самого процесса программирования

отчего же, напротив как раз этому посвящен первый пост
Автор: Didro
Дата: 07.08.07
. Потом, ну это как-то не серъезно — нет такого термина "конкурентное программирование" — это просто, как вы понимаете, калька с английского. С сутью я абсолютно согласен.

BZ>второе — ада сейчас реликт, тупиковая ветвь развития. изучать имхо стоит императивную модель (c# или java) и функциональную (erlang/haskell). начинать — с csp, который хорошо ложится на функциональную модель, а затем переходить к c# — т.е. идти от высокоуровневого, теоретического материала к низкоуровневому и более практическому. это всё относится к изучению concurrency, т.е. того, как вообще можно организовать многозадачность и взаимоде1ствие между задачами

Ада как язык действительно крайне редко используется, но как инструмент реализации параллелизма очень даже неплох:
  • совмещает модульность и параллелизм (близко к активным объектам)
  • является отличным примером, почему параллельное программирование должно быть реализовано в языке, а не в библиотеке

    так что "Ada's задачи" это одна из удобных концепций параллельного программирования.

    BZ>т.е. результатом курса должна стать способность будущего программиста использовать многпоточность для упрощения реализации программ и увеличения их производительности с использованием современных и перспективных средств программирования, а также наличие теоретической базы для освоения любых подходов, которые появятся в будущем


    Согласен, вполне себе неплохой результат для курса параллельного программирования. (кстати если Вы загляните в документацию к курсу, в его нынешнем виде
    Автор: Didro
    Дата: 09.08.07
    , то там как раз такой результат и прописан

    Вот о чем жалею, дак это о том, что не успеваю ввести паралелльное программирование в функциональных языках. В качестве примера для себя нашел MIT-овский курс, но времени видимо не хватит.
  •  
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.