Возможно кто-то преподавал параллельное программирование или готовил практические занятия\семинары по этой тематике. Перед мной встала такая задача. Точнее говоря, есть желание модернизировать курс, материал, сам подход к преподаванию параллельного программирования в своем вузе. Особо обсудить эту тему не с кем, поэтому и написал сюда.
Любые комментарии, опыт, предложения, примеры задач и методы проведения занятий будут очень кстати.
Спасибо.
Далее идут рассуждения на тему. вопрос вверху.
Я считаю, что необходимо в таком курсе подходит к параллельному программированию не тольно как к программированию супер-ЭВМ — средству решения "Больших задач" (а именно такую направленность носит фортпост параллельного программирования в России — сайт http://parallel.ru/)
В конце концов это слишком специфично с теоретический точки зрения и ещё более специфично с практической.
Поэтому хочу вдарить по всему спектру задач параллельного программирования — от Больших задач и до задач реального времени. Это так сказать крайние линии спектра, я в свое время попытался дать сравнение этих классов задач, правда получилось довольно банально:
Параметр \ Задача
Большая задача
Задача реального времени
Объем данных
Терабайты\Петабайты
Терабайты\Петабайты
Тип данных
Статичные данные
Динамические потоки данных
Реальное время
Нет
Да
Надежность
Произвольна
Критична
Число одновременно решаемых задач
Десятки крупных задач
Множество («мелкозернистых») задач
Режим работы
Пакетный (Offline)
Непрерывный (Online)
Взаимодействие с внешней средой
Почти отсутствует
Интенсивное
Требования к производительности
Пиковая производительность для данной задачи
Пиковая пропускная способность
Примеры
HPC:задачи гидро- и аэродинамики, моделирование климата, моделирование в области астрономии или ядерной физики
DSP, Embedded, телеком:задачи распознавания, планирования, задачи массового обслуживания, диагностики и контроля, задачи управления
Но все это параллельные системы и параллельное программирование. (не знаю, может быть у меня параноя, но мне кажется, что почему-то для большинства параллельное программирование<=>(потоки|суперкомпьютеры))
Понятно, что есть задачи, лежащие где-то между этими крайностями. Взять хотя бы такую прикладную задачу как отзывчивый-GUI или транзакции в распределенных системах, планирование исполнения запросов в БД и т.д. Я уж не говорю о такой теме как модели параллельного программирования, технологии и языки, языки(исчисления, calculus) формального описания семантики языков — тут вообще темный лес (в смысле очень много и неклассифицировано).
Я понимаю, что в один курс впихнуть невпихаемое не возможно, и что большинству слушателей курса может быть воообще до фени. Просто хотелось заинтересовать тех кто любит программирование, computer science, а такие есть.
Если говорить о том, чего хотелось бы достич, то в Беркли преподает процессор Эдвард А. Ли(Lee), и я бы многое отдал, чтоб посетить его курс, этот же человек возглавляет такой проект как ProlemyII (собираюсь использовать его на лабораторных) и кстати любит произведения Достоевского в оригинале . В частности у него есть такая концептуальная схемка, которая мне очень нравиться (перевод на русский мой):
, но пока я не готов к столь активному использованию аппаратуры (в планах есть использование ПЛИС и уже сделаны первые шаги в этом направлении, но к сентябрю точно не успею), да и курс не "системы реального времени" называется.
Извиняюсь за этот поток мыслей, просто наболело.
p.s.
до недавнего времени курс базировался на описании CSP-Хоара и языке Ада(Ada95). В принципе ничего плохого, но как бы не получилось как здесь
>Я помню был у нас препод молодой, [censored]. Так вот он так достал своим параллельным программированием на Ада старший курс, что >однажды вечером попал в больницу на 2 месяца.
p.p.s
еле удержался, чтоб не написать про многоядерность, которое делает(?) прикладное параллельное программирование актуальным...слишком уж много об этом сейчас говорят.
Здравствуйте, Didro, Вы писали:
D>Возможно кто-то преподавал параллельное программирование или готовил практические занятия\семинары по этой тематике. Перед мной встала такая задача. Точнее говоря, есть желание модернизировать курс, материал, сам подход к преподаванию параллельного программирования в своем вузе. Особо обсудить эту тему не с кем, поэтому и написал сюда.
D>Любые комментарии, опыт, предложения, примеры задач и методы проведения занятий будут очень кстати.
D>Спасибо.
Я кину ссылку моему научному руководителю, он ведёт курс, который называется "Распределённые вычислительные системы". С сентября я даже буду ему немного помогать Правда, направленность курса совсем другая. Лекции были про разное (одним словом не описать), а лабы — RPC, Java RMI, CORBA, Web Services (на жабе). Но общее, скорее всего, тоже есть.
Ещё у Танненбаума есть хорошая книжка на эту тему.
Здравствуйте, 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: Параллельное программирование
От:
Аноним
Дата:
07.08.07 08:44
Оценка:
Здравствуйте, Didro, Вы писали:
D>Любые комментарии, опыт, предложения, примеры задач и методы проведения занятий будут очень кстати.
Обязательно, совершенно необходимо и неизбежно надо начинать курс с рассказа о Пи-исчислении. И тогда уже не будет особой разницы между сверхпроизводительной вычислительной задачей и "отзывчивым GUI", математика за ними одна.
Здравствуйте, igorstr, Вы писали:
I>Здравствуйте, SergH, Вы писали: SH>>Я кину ссылку моему научному руководителю, он ведёт курс, который называется "Распределённые вычислительные системы". С сентября я даже буду ему немного помогать Правда, направленность курса совсем другая. Лекции были про разное (одним словом не описать), а лабы — RPC, Java RMI, CORBA, Web Services (на жабе). Но общее, скорее всего, тоже есть.
I>Да, действительно, общее есть, но направленность совсем другая Мне фактически пришлось вставить в курс "Распределенные системы" раздел про параллельное программирование поскольку больше ни в одном (!) курсе у нас об этом речь не идет. А знать об этом будущим специалистам надо. Поэтому сейчас перед нами (мной и моими коллегами) тоже стоит задача разработки курса "Параллельное программирование", но начнется он не в ближайшем семестре, так что пока есть только план курса и потребность в обмене опытом.
Огромное спасибо за подробный рассказ! Увидел, что есть общие точки соприкосновения и это, как говориться, радует
Здравствуйте, igorstr, Вы писали: I>[skip] Кстати говоря, суммирование с использованием древовидной свертки — наиболее типичный пример (а не интересная задача). В указанном пособии ННГУ приведено еще множество подобных примеров. Дополнительные примеры можно подчерпнуть в области цифровой обработки сигналов — например, параллельная реализация дискретного преобразования Фурье. А вот использование функциональных языков и модели потоков данных — это действительно интересно.
Я ошибся в названии второй задачи — не "Суммирование с использованием древовидной свертки", а "Суммирование с использованием древовидной свертки на базе асинхронных списков", возможно Вы имеено так меня и поняли. Собственно я эту задачу отнес к разряду интересных, поскольку в ней явно присутствует динамичность (зависимость от потока данных), что отличает её от стандартных типовых задач по параллельному программированию и придает оттенок задачи реального времени. Опыта у меня немного, и поэтому возможно я и ошибаюсь. Скажем тоже параллельное преобразование Фурье, оно, если говорить о не о задаче потокового преобразования Фурье, ближе к большим задачам и типовым задачам. Конечно это все непринципиально, просто решил уточнить. (вообще для меня 2-мя самыми частными премерами в параллельном программировании стали перемножение матриц и "параллельный Фурье").
Отдельное спасибо за ссылку на ННГУ — очень основательное пособие.
Здравствуйте, Didro, Вы писали:
D>Я ошибся в названии второй задачи — не "Суммирование с использованием древовидной свертки", а "Суммирование с использованием древовидной свертки на базе асинхронных списков", возможно Вы имеено так меня и поняли. Собственно я эту задачу отнес к разряду интересных, поскольку в ней явно присутствует динамичность (зависимость от потока данных), что отличает её от стандартных типовых задач по параллельному программированию и придает оттенок задачи реального времени. Опыта у меня немного, и поэтому возможно я и ошибаюсь. Скажем тоже параллельное преобразование Фурье, оно, если говорить о не о задаче потокового преобразования Фурье, ближе к большим задачам и типовым задачам. Конечно это все непринципиально, просто решил уточнить. (вообще для меня 2-мя самыми частными премерами в параллельном программировании стали перемножение матриц и "параллельный Фурье").
Вы правы, я хотел подчеркнуть, что именно зависимость от потока данных является самым интересным местом в приведенной ссылке. Дело тут даже не в близости к задачам реального времени, а в иной модели (парадигме) параллельного программирования. То, что Вы называете типовыми задачами, по всей видимости, следует отнести к императивной модели программирования или, иначе говоря, стилю Фон-Неймана. В этой модели программа представляет собой запись некоторого алгоритма, т.е. четко заданной последовательности операций. В результате, при переходе к параллельным вычислениям алгоритмы, составленные для последовательных вычислений, становятся неэффективными и приходится развивать целую теорию эквивалентных преобразований программ на основе графа алгоритма, о чем очень подробно написано в известной книге В.В. Воеводин, Вл.В. Воеводин "Параллельные вычисления". Это, так сказать, классический подход.
Альтернативой является управление вычислениями на основе потока данных. В этом случае мы выделяем некоторые блоки вычислений, связанные между собой только по данным и говорим, что любой блок можно начать выполнять тогда, когда будут готовы все исходные данные. В результате можно построить параллельный вычислитель, отличный от машины Фон-Неймана, который сам решает, когда какие действия эффективнее всего выполнять, и распараллеливание происходит естественно и практически автоматически. Это дает стимул развития моделей программирования на основе потоков данных (Data Flow), в частности, модель Synchronous Data Flow (SDF) оказалась очень удобной для задач цифровой обработки сигналов. Модель потоков данных тесно связана с функциональным программированием. Ряд функциональных языков (напр. Haskell) позволяют т.н. ленивые вычисления, что также по сути управление на основе потока данных, только "наоборот": вычисление некоторых значений может быть отложено до того момента, пока данные не понадобятся. Этой темой как раз занимался SergH в своем дипломном проекте под моим руководством. Подобный подход может быть применен не только в задачах реального времени (с динамическим поступлением данных), но и в "больших" задачах со статически заданными исходными данными.
Здравствуйте, Didro, Вы писали:
D>Возможно кто-то преподавал параллельное программирование или готовил практические занятия\семинары по этой тематике. Перед мной встала такая задача. Точнее говоря, есть желание модернизировать курс, материал, сам подход к преподаванию параллельного программирования в своем вузе. Особо обсудить эту тему не с кем, поэтому и написал сюда.
D>Любые комментарии, опыт, предложения, примеры задач и методы проведения занятий будут очень кстати.
Цель курса какая? Кого и чему вы хотите научить? В чем должен разбираться и что должен уметь ученик, сдавший ваш курс на 5, как он поможет ему в дальнейшем? Другими словами — в чем именно обусловлена необходимость присутствия этого курса в программе? Только ответив на эти вопросы можно приступать к составлению его плана и наполнения. "Модернизировать курс" — это не цель, это активность.
Второе. Курс должен в первую очередь давать обзор существующих в мире знаний, и открывать студенту возможность в дальнейшем обучаться теме самостоятельно. Поэтому, учебный курс не должен состоять из оригинальных мыслей автора, он должен быть на 100% подкреплен литературой. Следовательно, вы в первую очередь после постановки цели должны составить список хорошей, классической литературы по данной теме.
После того, как у вас есть список литературы, вам останеться выстроить свою, авторскую логику изложения, и разработать практические занятия (примеры которых будут в книгах, кстати).
Как можно давать вам советы по устройству курса, не зная ответа на вопросы первого абзаца? И ведь дают, что интересно . При таком подходе у вас и получится все сваленно в кучу — ПЛИС, VHDL, C#, .NET, Java, DSP, суперкомпьютеры, многоядерные процы, и все-все-все. Получится очередной невнятный курс — сборная солянка, не имеющий четкого фокуса и не учащий студентов ничему из того, о чем идет речь.
Спасибо за объективную критику, у Вас, по всей видимости, сложилось впечатление, что я с шашкой на голо мчусь модернизировать преподавание программирования и т.д. Это _не так_. К тому же я не создаю курс с нуля, а базируюсь на существующем курсе, с целостной (насколько это возможно) программой обучения и списком литературы (отсутствием которой Вы меня попрекаете, как я понял)
G>Цель курса какая? Кого и чему вы хотите научить? В чем должен разбираться и что должен уметь ученик, сдавший ваш курс на 5, как он поможет ему в дальнейшем? Другими словами — в чем именно обусловлена необходимость присутствия этого курса в программе? Только ответив на эти вопросы можно приступать к составлению его плана и наполнения. "Модернизировать курс" — это не цель, это активность.
, но не исследователя. По сути дела все, эти вопросы тривиальны, а значит прямые ответы на них неконструктивны. (я не говорю, что вопросы не правильные)
G>Второе. Курс должен в первую очередь давать обзор существующих в мире знаний, и открывать студенту возможность в дальнейшем обучаться теме самостоятельно. Поэтому, учебный курс не должен состоять из оригинальных мыслей автора, он должен быть на 100% подкреплен литературой. Следовательно, вы в первую очередь после постановки цели должны составить список хорошей, классической литературы по данной теме.
Об этом я уже написал выше. Кстати преподавание как субъективная передача знаний, даже на 100% подкрепленных литературой, все-равно будет оригинальным изложением преподавателем мыслей авторов.
G>Как можно давать вам советы по устройству курса, не зная ответа на вопросы первого абзаца? И ведь дают, что интересно .
Думаю, Вы не имеете в виду советы, которые приведены в этом треде.
G>При таком подходе у вас и получится все сваленно в кучу — ПЛИС, VHDL, C#, .NET, Java, DSP, суперкомпьютеры, многоядерные процы, и все-все-все. Получится очередной невнятный курс — сборная солянка, не имеющий четкого фокуса и не учащий студентов ничему из того, о чем идет речь.
Я об этом уже писал, когда говорил, что нельзя "впихнуть не впихаемое". Безусловно, параллельное программирование, в общем, почти такая же широкая тема, как и программирование, вообще. igorstr говорит
о необходимости создания отдельных факультативных курсов и я с ним согласен, правда возможности у меня такой нет.
К тому же, на мой взгляд, сейчас параллельное программирование само по себе большая солянка — нет даже единой классификации моделей параллельного программирования. О широте спектра языков\технологий и подавно говорить нечего.
, но не исследователя. По сути дела все, эти вопросы тривиальны, а значит прямые ответы на них неконструктивны. (я не говорю, что вопросы не правильные)
Почему тривиальны и неконструктивны?
Очень правильные вопросы, имхо.
Во-первых, есть как минимум два принципиально разных подхода — со стороны математика (пи-исчисление, Аноним выше по ветке советовал) и со стороны технологий. Но тут, боюсь, что с математикой не получится, потому что не неё нужно много времени. Правда, оговорюсь, что сам пи-исчислением не владею, так что может и хватит — х.з.
Во-вторых, технологии тоже бывают разные. VHDL, C#, Erlang, OpenMP — четыре _принципиально_ разных подхода к параллелизму. И это только языки программирования (OpenMP — с натяжкой, но тем не менее). Ещё есть технологии — от MPI до WebServices. А есть ещё параллелизм уровня исполнения команд — MMX/SSE, конвейеры и процессор Itanium. К счастью, процессоры у нас были в отдельном курсе.
А ещё можно затрагивать кучу интересных вопросов — когерентность кешей, доступ к памяти (SMP, NUMA), безопасность, отслеживание дедлоков (в смысле, по графу "кто кого ожидает" определить, сто мы в дедлоке и прибить лишнего), протоколы выборов и т.п..
Так что в явном виде описать, что мы хотим получить на выходе — далеко не лишнее. Иначе область не обозначить.
Имхо, было бы здорово как-нибудь явно разделить "параллелизм вообще" и "технологии". Потому что последних — море разливанное.. Это похоже на математический подход, которым я не владею и в котором немного сомневаюсь..
Можно отделить параллелизм и РВС. Типа, работаем на одной машине. Тогда уходит куча технологий (да практически все), уходят вопросы безопасности и ещё много чего.
Но, в общем, выбор надо обозначить явно. Иначе получится неизвестно что. Вполне возможно, интересное, но не целостное.
Здравствуйте, SergH, Вы писали:
SH>Почему тривиальны и неконструктивны?
Потому что ответы на них имеют не большую ценность чем "Прежде чем что-то делать, нужно знать что делать и как делать", "Нужно заниматься проектированием систем", "Моейте руки перед едой" и пр.
SH>Очень правильные вопросы, имхо.
Вопросы правильные, согласен, я об этом так и написал.
SH>Во-первых, есть как минимум два принципиально разных подхода — со стороны математика (пи-исчисление, Аноним выше по ветке советовал) и со стороны технологий. Но тут, боюсь, что с математикой не получится, потому что не неё нужно много времени. Правда, оговорюсь, что сам пи-исчислением не владею, так что может и хватит — х.з.
Это не просто математический подход — это одно из стредств описания семантики языка программирования. Вообще мне известны 3-и подхода:
Исчисления (Лябда-исчисления Черча, Пи-исчисление Милнера, CSP-исчисление Хоара, Join-исчисление и т.д.)
Абстрактные машины(Машина Тьюринга, PRAM-машина, Химическая Абстрактная машина Берри (Chemical Abstract Machine. Berry) и т.д.)
Kernel language (Базисный язык) — выбирается базис языковых конструкций, композиция которых позволяет описать стальную часть языка. Именно этот подход интуитивно наиболее близок программисту.
Более подробно эта тема описывается в книге Concepts, Techniques, and Models of Computer Programming. Ссылку на неё мне дали в этом
сообщении.
SH>Во-вторых, технологии тоже бывают разные. [skip] SH>А ещё можно затрагивать кучу интересных вопросов — [skip] SH>Так что в явном виде описать, что мы хотим получить на выходе — далеко не лишнее. Иначе область не обозначить.
Согласен. Вам не кажется что это очевидная вещь?
SH>Можно отделить параллелизм и РВС. Типа, работаем на одной машине. Тогда уходит куча технологий (да практически все), уходят вопросы безопасности и ещё много чего.
Да факультативные\отдельные курсы это хорошо. Разделяй и влавствуй, только ресурсов иногда не хватает на реализацию этого принципа.
SH>Но, в общем, выбор надо обозначить явно. Иначе получится неизвестно что. Вполне возможно, интересное, но не целостное.
Согласен.
Здравствуйте, Didro, Вы писали:
D>Это не просто математический подход — это одно из стредств описания семантики языка программирования.
Угу, в данном случае — на основе модели взаимодействующих процессов. Ещё, используя всякие исчисления, можно доказывать какие-то утверждения о программах... Типа возможности/невозможности дедлока.
D>Более подробно эта тема описывается в книге Concepts, Techniques, and Models of Computer Programming.
Да да да, литературы для самообразования у меня уже на несколько лет непрерывного чтения, эта книжка в списке тоже есть
SH>>Так что в явном виде описать, что мы хотим получить на выходе — далеко не лишнее. Иначе область не обозначить. D>Согласен. Вам не кажется что это очевидная вещь?
Очевидная. Но вы же этого пока не сделали...
SH>>Можно отделить параллелизм и РВС. Типа, работаем на одной машине. Тогда уходит куча технологий (да практически все), уходят вопросы безопасности и ещё много чего. D>Да факультативные\отдельные курсы это хорошо. Разделяй и влавствуй, только ресурсов иногда не хватает на реализацию этого принципа.
Это другой вопрос. Можно сунуть в один курс, но разделить по времени. Можно ещё как-то... Я не знаю ваших условий, я пока даже не знаю ваших желаний То, что логичным кажется мне, не обязательно кается логичным вам.
SH>>Но, в общем, выбор надо обозначить явно. Иначе получится неизвестно что. Вполне возможно, интересное, но не целостное. D>Согласен.
Ну и? Или в том и заключался исходный вопрос — какую область выбрать для преподавания?
Здравствуйте, SergH, Вы писали:
SH>Ну и? Или в том и заключался исходный вопрос — какую область выбрать для преподавания?
Просто после нескольких месяцев варения на собственной кафедре захотелось взгляда со стороны, захотелось посмотреть, кто занимается подобной проблематикой в России, как рассматриваются вопросы преподавания организации курсов данной тематики. Это знаете, как прожить некоторое время на необитаемом острове, а потом узнать, что можно было вплавь добраться до материка Был очень рад, что работы Ли известны у нас и пр.
Возможно слишком резко писал про очевидность, тривиальность и неконструктивность извиняйте...
Здравствуйте, Didro, Вы писали:
D>Просто после нескольких месяцев варения на собственной кафедре захотелось взгляда со стороны, захотелось посмотреть, кто занимается подобной проблематикой в России, как рассматриваются вопросы преподавания организации курсов данной тематики. Это знаете, как прожить некоторое время на необитаемом острове, а потом узнать, что можно было вплавь добраться до материка Был очень рад, что работы Ли известны у нас и пр.
D>Возможно слишком резко писал про очевидность, тривиальность и неконструктивность извиняйте...
Да не, не резко.. Просто, из того, что это очевидно и тривиально, не следует, что это делать не надо.. Если бы я знал, чему и зачем (и почему именно этому и за этим) хочу научить студентов, непременно бы поделился.
Здравствуйте, Didro, Вы писали:
D>Спасибо за объективную критику, у Вас, по всей видимости, сложилось впечатление, что я с шашкой на голо мчусь модернизировать преподавание программирования и т.д. Это _не так_. К тому же я не создаю курс с нуля, а базируюсь на существующем курсе, с целостной (насколько это возможно) программой обучения и списком литературы (отсутствием которой Вы меня попрекаете, как я понял)
G>>Цель курса какая? Кого и чему вы хотите научить? В чем должен разбираться и что должен уметь ученик, сдавший ваш курс на 5, как он поможет ему в дальнейшем? Другими словами — в чем именно обусловлена необходимость присутствия этого курса в программе? Только ответив на эти вопросы можно приступать к составлению его плана и наполнения. "Модернизировать курс" — это не цель, это активность.
D>Извините. Насколько я понимаю, это слова менеджера
, но не исследователя. По сути дела все, эти вопросы тривиальны, а значит прямые ответы на них неконструктивны. (я не говорю, что вопросы не правильные)
А вы все-таки попробуйте ответить на эти вопросы. И напишите ответы сюда. Это не так просто, как вам кажется. Вот допустим, включать вам математический модели разного параллелизма в курс, или нет? Ответить на этот вопрос можно только имея цели, отсортированные по приоритетам. Кого вы готовите? Ученых, инженеров? Какая специальность у этих студентов? Этот курс для них профильный или вспомогательный? Если второе, то каким именно образом он соприкасается с их основной специальностью? Ответы на данные вопросы довольно однозначно влияют на программу. И ответы на них далеко не тривиальны — откуда мне знать, — этот курс читается математикам, программистам, микроэлектронщикам или строителям. Содержимое курса будет радикально разным.
Вот вы говорите — с точки зрения исследователя . Мне приходилось руководить исследовательскими работами. Все то же самое — все идет от целеполагания. Что у нас этот исследователь исследует? Цели внятные и проверяемые у его исследований есть? Сам себе он цели ставит? Конечно чтавит, и глобальные и промежуточные, сознательно или безсознательно. Ну вот, я вам предлагаю подойти к этому процессу сознательно.
G>>Второе. Курс должен в первую очередь давать обзор существующих в мире знаний, и открывать студенту возможность в дальнейшем обучаться теме самостоятельно. Поэтому, учебный курс не должен состоять из оригинальных мыслей автора, он должен быть на 100% подкреплен литературой. Следовательно, вы в первую очередь после постановки цели должны составить список хорошей, классической литературы по данной теме.
D>Об этом я уже написал выше. Кстати преподавание как субъективная передача знаний, даже на 100% подкрепленных литературой, все-равно будет оригинальным изложением преподавателем мыслей авторов.
Я думаю, вы понимаете, что я имею в виду. Я ведь не об абстрактной философии говорю.
G>>Как можно давать вам советы по устройству курса, не зная ответа на вопросы первого абзаца? И ведь дают, что интересно . D>Думаю, Вы не имеете в виду советы, которые приведены в этом треде.
Отчего же. Именно их.
G>>При таком подходе у вас и получится все сваленно в кучу — ПЛИС, VHDL, C#, .NET, Java, DSP, суперкомпьютеры, многоядерные процы, и все-все-все. Получится очередной невнятный курс — сборная солянка, не имеющий четкого фокуса и не учащий студентов ничему из того, о чем идет речь.
D>Я об этом уже писал, когда говорил, что нельзя "впихнуть не впихаемое". Безусловно, параллельное программирование, в общем, почти такая же широкая тема, как и программирование, вообще. igorstr говорит
о необходимости создания отдельных факультативных курсов и я с ним согласен, правда возможности у меня такой нет.
Зная ответы на очевидные и тривиальные вопросы, вы без проблем выкинете из курса лишнее. Не зная ответы на эти вопросы, вы будете думать, думать, думать...
D>К тому же, на мой взгляд, сейчас параллельное программирование само по себе большая солянка — нет даже единой классификации моделей параллельного программирования. О широте спектра языков\технологий и подавно говорить нечего.
Задача преподавателя в том и состоит, чтобы найти в "сборной солянке" нечто общее, стержневое, тогда солянка и превратится в курс. А сделать этого нельзя, не определившись с целями.
D>Спасибо за критику.
Да это не критика. Я ничего не критикую, я вам помочь хочу. Чисто, как менеджер, а не как исследователь. Что такое хорошие курсы я знаю — я ВМиК МГУ закончил. Там, кстати, распределенных вычислений зависит от потока — программистам читают одно, а вычислительным математикам совершенно другое. Грубо говоря — первых учат понимать устройство и принципы построения системного параллельного софта, а вторых учат писать параллельные программы.
Здравствуйте, Gaperton, Вы писали:
G>>>Цель курса какая? Кого и чему вы хотите научить? В чем должен разбираться и что должен уметь ученик, сдавший ваш курс на 5, как он поможет ему в дальнейшем? Другими словами — в чем именно обусловлена необходимость присутствия этого курса в программе? Только ответив на эти вопросы можно приступать к составлению его плана и наполнения. "Модернизировать курс" — это не цель, это активность.
G>А вы все-таки попробуйте ответить на эти вопросы. И напишите ответы сюда. Это не так просто, как вам кажется.
Хорошо. Здесь лежит действующая до сих пор программа курса. Ниже выдержки из неё.
Цели и задачи курса
Предметом курса являются методы и системы параллельной обработки информации, средства спецификации параллельных процессов, языки параллельного программирования, автоматическое распараллеливание последовательных алгоритмов. В результате изучения дисциплины студенты должны:
1. Представлять:
• основные положения теории параллельных вычислительных процессов и структур;
• особенности языков параллельного программирования;
• проблемы и тенденции развития языков параллельного программирования;
• современные средства спецификации и моделирования систем параллельной обработки информации;
• перспективные направления исследований в области параллельных вычислений и параллельного программирования.
2. Знать и уметь использовать:
• формальные модели процессов и средства спецификации и моделирования механизмов взаимодействия параллельных процессов;
• модели вычислительных процессов и методы конструирования алгоритмов параллельных вычислений;
• современные методы распараллеливания алгоритмов.
3. Иметь опыт: разработки программ на языке АДА (подмножество SmallAda) и приложений для Microsoft ® WindowsTM.
Кого учим:
студентов направления: 552800 — "Информатика и вычислительная техника" и специальности 220400 — “Программное обеспечение вычислительной техники и автоматизированных систем”. Т.е. это инженеры-программисты, есть несколько магистров (я из их числа).
Краткое содержание курса
1. Архитектура параллельных систем
2. Теоретические модели параллельных алгоритмов, программ и систем
3. Принципы организации взаимодействия параллельных процессов в языке АДА
Контекст
5 курс, первый семестр. Понятно, что многие работают и понятно, что до этого было множество соприкасающихся курсов.
Существуют такие факультативные курсы: Системы реального времени, Мобильные операционные системы, Моделирование систем, Системы распознавания. К сожалению в этом году их вести никто не будет...
Мой научный руководитель, который ведет данный курс(ПаралПрог), занимается обработкой сигналов (изображения, речевые и технические одномерные и акустические сигналы), диагностика и распознование — отсюда тяга к системам реального времени, ПЛИСам и прочему. Это частично отражается на лабораторных, в частности задачки на АДА лежат в области систем управления производством (правда про SCADA ничего не говориться, да и программируются решения этих задач не под ОС реального времени, хотя АДА позволяет).
Теперь о модернизации, т.е. зачем и почему модернизировать. Все просто с формальной позиции — курс необновлялся достаточно долго (7 лет), а развитие параллельного программирования произошло достаточно существенное. С позиции субъективной — я поставил себе сверхзадачу "сделать на кафедре второй Беркли" (это все влияние профессора Эдварда Ли (писал об этом раньше)). Может кто-то скажет, что это юнешеский максимализм и неспособность оценить реальные возможности — наверное это так и есть, иначе никто бы не знал про "юнешеский максимализм" . На самом деле я не хочу потерять два года ("обучаясь" в магистратуре и возможно потом в аспиратнтуре), хочу саморазвития , а проще всего это сделать, в моем контексте и в моих условиях, при поддержке других людей, в частности из ВУЗа.
План модернизации:
1. Архитектура параллельных систем
Добавить про многоядерные системы, класетра (метакластера\GRID), добавить про RPU (на базе GPGPU\ПЛИС)
2. Теоретические модели параллельных алгоритмов, программ и систем
Пощупать различные модели вычислений в Ptolemy II
3. Принципы организации взаимодействия параллельных процессов в языке АДА
3.1 Дать введение в .NET (у нас об этой платформе никто не рассказывает. [шепотом] До недавнего времени вообще Delphi использовали ).
3.2 Многопоточное программирование — "OS-Level-потоки + shared-memory(lock'и) — это зло", хотя иногда и неизбежное.
3.3 Язык многопоточного и распределенного программирвования MC# (новый сайт, старый сайт) (тут каюсь, сам являюсь участником проекта MC#, поэтому выбор был несколько субъективен). MC# базируется на Join-Calculus. Рассказать, что такое calculus вообще (привести примеры Lambda-calculus и Pi-Calculus). Упомянуть, что Join-Calculus реализовано также в языках C_omega, JoCaml, Polyphonic C#, библиотеке MS CCR. Лабораторная на MC#.
Как видите особого криминала вроде как и нет
Что упущено (список конечно же не полный): lock-free структуры данных; futures и data-flow в языках программирования; почти незатрагивается вопрос влияния модели памяти на параллельное программирование; Легкие потоки (Erlang); Технологии OpenMP, MPI, PVM;
Похоже, я опять перескочил через ответы на "тривиальные" вопросы. Т.е. те цели и задачи, которые приведены в предыдущем посте — это цели и задачи курса в его нынешнем состоянии. Попробую описать цели и задачи модифицированного курса. Отличий правда не много:
Цели и задачи
Предметом курса являются методы и системы параллельной обработки информации, модели вычислений, языки параллельного программирования. В результате изучения дисциплины студенты должны:
1. Представлять:
•[без изменений]
+
• особенности многопоточного программирования в ОС Microsoft ® .NET FW 2.0.
2. Знать и уметь использовать:
•[без изменений]
3.Иметь опыт:
• разработки программ на языке АДА (подмножество SmallAda) и приложений для Microsoft ® WindowsTM.
• разработки программ на языке MC# и приложений для Microsoft ® .NET FW 2.0.
• моделирования процессов вычислений в рамках различных моделей вычислений с использованием среды моделирования Ptolemy II.
Теперь, я надеюсь, контекст вопроса достаточно хорошо прорисован. Хотелось бы услышать критику "целей и задач", ну и критику по курсу в целом на основе его спецификации.
Здравствуйте, 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 и потоковых можелях, транзакционной памяти, локфри-структурах.
Здравствуйте, SergH, Вы писали:
SH> VHDL, C#, Erlang, OpenMP — четыре _принципиально_ разных подхода к параллелизму. И это только языки программирования (OpenMP — с натяжкой, но тем не менее).
VHDL — тоже с натяжкой. Это не совсем язык программирования. "Программирование" на VHDL — это тонкая грань между программированием и схемотехникой. На VHDL описываются цифровые схемы, которые потом лягут в железо (FPGA или ASIC). Поэтому надо представлять, во что в железе выльется та или иная констукция языка, насколько она оптимально ляжет в архитектуру, скажем, FPGA. Т. е. надо иметь хотя бы элементарное понятие о цифровых устройствах (логические элементы, шифраторы, триггеры, счетчики и т. п.). Без этого смысла изучения VHDL нет. Если готовятся программисты, то VHDL им не нужен.
Как показывает опыт сидения на разных форумах, где собираются разработчики железа, программисты, по каким-то причинам начавшие писать на VHDL или Verilog, рассматиривают их именно как языки программирования, а не как языки описания схем. Поэтому и возникают вопросы типа "А как мне сделать, чтобы по фронту одного сигнала регистр загружался, а по фронту другого — сдвигался". И приходится каждый раз объяснять, что в FPGA нет триггеров, которые работают по фронтам двух сигналов и что такие задачи решаются другим способом. Что есть такое понятие, как синхронный дизайн, и почему именно он используется при разработке FPGA. Что есть такая штука, как синтезируемое подмножество языка. И многое другое.
Это все должен быть отдельный курс, а не часть курса "Параллельное программирование". И не для программистов.