Модель – для понта, язык – для дела?

vlubch (8 пост(а)) 15.10.2009 15:07

Перефразируя произнесенную в http://software.intel.com/ru-ru/blogs/2009/08/27/2001970/ фразу о ружьях и ножах из фильма «Карты, деньги, два ствола», давайте разберемся, действительно ли, как это часто преподносится, модель для наукообразия или, попросту, – для понта и только лишь язык программирования – для дела? На примере вычисления чисел ряда Фибоначчи мы рассмотрим параллельные идеи в рамках широко известных языков С# и С++ (подробнее см. соответственно [1] и [2]).

Имя Леонардо Фибоначчи (Леонардо Пизанского) часто упоминается в связи со следующей числовой последовательностью:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …
Данный ряд натуральных чисел, называемый рядом чисел Фибоначчи, записанный как
a0, a1, a2, a3, . . .
можно описать следующим образом:
a0 = 1, a1 = 1, и
ai = ai-1 + ai-2, для i >= 2.

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

Одна из тенденций реализации параллелизма состоит в расширении существующих языков программирования. Параллельная программа на языке MC# (он же – расширенный С#[1]), вычисляющая числа Фибоначчи, представлена листингом 1. Это известный последовательный рекурсивный алгоритм, в котором рекурсивные вызовы заменены на параллельно исполняемые. Введенный параллелизм несколько изменяет исходный последовательный алгоритм. Результат таких изменений в форме параллельной блок-схемы (БС) показан на рис. 1.

Приведенная блок-схема в явной форме отражает параллельные алгоритмические свойства решения. При этом на рис.1 переход (в терминах сети Петри), из которого исходят дуги, соответствует вызову параллельно исполняемых movable-методов MC#, а переход с входящими дугами – методу типа Get (см. листинг 1). При этом, например, у перехода с входящими дугами, их число соответствует числу каналов, по которым нужно одновременно принять данные от параллельно исполняемых методов.

Имея модель и зная процедуры ее эквивалентного преобразования, мы можем перейти к другой модели вычислений – автоматной[2]. В целях построения эквивалентного блок-схеме конечного автомата (КА) проведем процедуру разметки БС. Для этого нанесем на нее отметки внутренних состояний автомата, а элементы блок-схемы поименуем (см. рис.1). Именам функциональных блоков x1,…, xN в новой модели соответствуют методы - предикаты, возвращающие булевское значение. Им будут поставлены в соответствие входные сигналы автомата. Именам y1,…, yN соответствуют методы-действия, определяющие действия автоматной алгоритмической модели вычислений. Им соответствуют выходные сигналы автомата. Граф автомата, соответствующий разметке, показан на рис.2.

В терминах теории программ (точнее, - теории схем программ) рис.2 – это графическая форма так называемого управления программы. Но в модель программы кроме управления входит еще два множества - множество данных и множество операций (о моделях программ подробнее см. [3]). Поэтому рядом с графом управления автоматной программы приведено описание ее методов – предикатов и действий. Именно с их помощью выполняется анализ и преобразование данных в последовательности, определяемой управлением программы. Листинг 2 дает конкретное представление о выбранном подходе к реализации автоматной модели на языке С++.

Отметим, что в отличие от программ на языке MC# в автоматном С++ нет разделения на перемещаемые и неперемещаемые методы. Все методы потенциально параллельны. При этом на параллелизм предикатов ограничений нет, т.к. они не изменяют данных, а у параллельно исполняемых действий не должно быть пересечений по данным, к которым возможен одновременный доступ. Параллелизм методов отражают переходы автоматной модели, где параллелизм предикатов представляют конъюнкции входных сигналов, а параллелизм действий – набор выходных сигналов автомата.

Отвлечемся на мгновение от самого процесса вычисления чисел Фибоначчи… Можно ли утверждать, что модель вычислений определяет мышление программиста? Скорее да, чем нет. Сравнивая графы программ на рис.1 и 2, легко видеть, что автоматный язык лаконичнее языка блок-схем. Он несет больше информации, стимулирует на действия и мысли, которые вряд ли возникнут у того, кто пользуется языком блок-схем.

Внутренние состояния программы – это перекрестки, на которых программист намечает путь дальнейшего движения. Но, находясь на том или ином перекрестке-состоянии, он должен сознавать, что, переместившись, он уже вернуться к текущей ситуации просто так не сможет. Исключение – петли на графе КА, которые не содержат выходных действий. Именно в силу этого в целях упрощения модели они исключены из описания автомата. Они, задавая его переходы «по умолчанию» представляют, строго говоря, дополнение явно представленного частичного автомата до полностью определенного.

В автомате на рис.2 состояния-перекрестки программы можно трактовать следующим образом. Состояние автомата «f1» – начальное состояние алгоритма и одновременно состояние анализа текущего значения n – номера числа в ряду Фибоначчи; «f2» - состояние ожидания завершения вычисления предшествующих двух чисел ряда; «00» - заключительное состояние алгоритма, при переходе в которое мы знаем значение первого числа в ряду Фибоначчи или сумму предыдущих двух чисел ряда.
Анализируя управление автоматной программы, можно, опираясь на теорию конечных автоматов, оценить, например, его непротиворечивость и полноту. При этом в нашем случае полностью определенный автомат – это объединение его частичной формы, представленной явно (см. рис.2), и его дополнения – автоматом с теми же состояниями, что и частичный автомат, но с переходами по умолчанию - петлями, входные условия которых представлены отсутствующими на графе конъюнкциями входных сигналов.

Что толку от быстро полученного, но глупого совета!? Но, как бы там ни было, программу часто встречают «по одежке», т.е. скорости ее работы. А есть случаи – системы реального времени – когда скорость отклика имеет вообще решающее значение. Для них запоздало данный, хотя и правильный, совет не нужен. Поэтому весьма желательно, чтобы хорошему мышлению соответствовали быстрые и/или хотя бы оперативно данные правильные (!) ответы. Сравнение по скорости работы программы на MC# и автоматном С++ показало, что вычисление, например, 16-го числа на первом выполняется медленнее более чем в 20 раз, чем на втором…

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

Замечание. Можно впасть в крайность и вообще игнорировать общепризнанные этапы проектирования программ. Именно такое ощущение возникает от работы некоторых программ, когда возникает подозрение, что пропущен даже этап тестирования?!

Автоматный подход обладает гибкостью, которая позволяет реализовать почти любой стиль «мышления» программиста. Появление новых «надежных» языков пока не очень повысило надежность программирования, да и нынешние параллельные решения все еще не оправдывают возлагавшихся на них надежд (и не только в отношении скорости). Поневоле задашься вопросами – может, не так и не то «повышаем», не то и не так «параллелим»? И как с этим разобраться, если не исследовать модели «программистского мышления»?

И напоследок. Без ущерба для дела мы могли бы вообще не рассматривать программный код. Модель – основное, реализация – дело техники. Безусловно, качества программы зависят от языка программирования. Но это уже больше проблема выбора средства реализации, чем самой модели. Понимания пользы модели позволяет преодолеть любые сложности на пути ее эффективной реализации. Вплоть до создания языка программирования и аппаратной архитектуры для ее поддержки.
Литература
1. Гузев В., Сердюк Ю. Введение в параллельное программирование на языке MC#. Переславль Залесский/Москва. 2007. http://u.pereslavl.ru/~vadim/MCSharp/docs/pguide/pguide.doc
2. Любченко В.С. Конечно-автоматная технология программирования. http://www.softcraft.ru/design/katech.shtml
3. Наумов Н.А. О некоторых подходах к расширению языков программирования. http://eidos.kiam.ru/group/pod.html.

Листинг 1:

Листинг 2:

Категории: Параллельное программирование, Разработка софта

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

Комментарии (30)

15.10.2009 07:20

Dmitry Oganezov (Intel)
Dmitry Oganezov (Intel)Всего баллов:
25,473
Community Manager
Welcome to ISN Blog, Вячеслав! С почином!

Надеюсь, читатели воспримут Ваш пост правильно - как аргументированную защиту модели конечных автоматов, а не как противопостввление C++ MC#. Мы же не маленькие дети, в конце концов :)

Лично от себя - в коде на C++ за 10 минут разобраться не смог. Возможно, мыслю устаревшими категориями :)

На будущее: пожалуйста, оформляйте программный код тегами pre. Как у коллеги Карпова в его постах. А то с картинок читать неудобно. Если появятся вопросы к оформлению постов - с удовольствием помогу.



15.10.2009 21:31

ksili
ksiliВсего баллов:
7,570
коричневый пояс
> пожалуйста, оформляйте программный код тегами pre.

Можно вот про это небольшой пример? Хотя бы несколько строк с разными отступами - и как это выглядит в тексте статьи. А-то в блогах и на форуме есть какой-то механизм для вставки кода, но я что-то не смог его осилить. Может этот тег можно и в комментариях использовать?
16.10.2009 14:15

vlubch
vlubchВсего баллов:
3,435
коричневый пояс
>Welcome to ISN Blog, Вячеслав! С почином!
Спасибо, Дмитрий! :)
>Надеюсь, читатели воспримут Ваш пост правильно - как аргументированную защиту модели конечных автоматов, а не как противопостввление C++ MC#. Мы же не маленькие дети, в конце концов :)
Безусловно! ;)
Более того, конечные автоматы, уверен, в чьей-либо защите не нуждаются. Они давно доказали свою "профпригодность";) Речь должна идти о более широком их применении в программировании. Т.е. не в какой-то ограниченной или специфической области, например, как проектирование компиляторов, а фактически для любых задач, любого уровня сложности.
Но это, так сказать, глобальная задача. Более конкретная, - показать это на простых и известных примерах. Сейчас - числа Фибоначчи. Потом в планах - сортировки, далее, как я надеюсь, дойдем до триггера ;) На простых задачах, отражающих те или иные проблемы проектирования алгоритмов, пройти путь, который проходят все - от TBB до MC# ;)
>Лично от себя - в коде на C++ за 10 минут разобраться не смог.
А, если не секрет, что этому помешало?
18.10.2009 16:23

mt2
mt2Всего баллов:
13,459
Зарегистрированный пользователь
Sorry, но я, пожалуй, это комментировать никак не буду. Чем задавать вопросы повторно: и так и в форуме и в предыдущих блогах слишком много про ету теорию сказал, я лучше возьму задачку типа "2 умножить на 2", "факториал" или даже про башни в Ханое и напишу отдельный блог и буду эту супер-задачу обсуждать во всех деталях с блок-схемами, сетями и т.д. и т.д. Может? тоже до 1 (одного) целого триггера дозрею ;) И пройду Путь - прямо слышится: "Feel the Force, Luke!" ;))) Sorry again!
19.10.2009 04:50

vlubch
vlubchВсего баллов:
3,435
коричневый пояс
>Sorry, но я, пожалуй, это комментировать никак не буду. Чем задавать вопросы повторно: и так и в форуме и в предыдущих блогах слишком много про ету теорию сказал, я лучше возьму задачку типа "2 умножить на 2", "факториал" или даже про башни в Ханое и напишу отдельный блог и буду эту супер-задачу обсуждать во всех деталях с блок-схемами, сетями и т.д. и т.д. Может? тоже до 1 (одного) целого триггера дозрею ;) И пройду Путь - прямо слышится: "Feel the Force, Luke!" ;))) Sorry again!
Михаил, я упростил вам задачу. В моей статье “О борьбе с рекурсией.” (http://www.osp.ru/pcworld/2002/11/164417/) «факториал» рассмотрен, а для «Башен» приведена их реализация. Вам остается только «2х2» :) Хотя если бы Вы дали свою трактовку решения этих задач – было бы интересно.
Чем интересна рекурсия? Тем, что почти любая подобная задача в параллельном варианте – это 1) проверка «чего-то» на способность создавать вообще рекурсию 2) тестирование аппаратуры на предмет порождения нужного числа параллельных процессов 3) тестирование эффективности реализации параллельных процессов.
Например. Насколько припоминаю, MPI в первых версиях рекурсию не поддерживал. Тестирование программы Фибоначчи для MC# вырубает ее на 16-17 числе. Не хватает, видимо, ресурсов. Сравнив по времени работы программы на MC# и автоматном С++ мы можем оценить эффективность реализации параллельных процессов.
Безусловно, MC# - это косвенная оценка многопоточности (тут – в надежде на комментарий Юрия Сердюка) . Вот потому-то мне и интересно посмотреть на многопоточность в чистом виде. Пока вот – тоже жду… :( В том числе и от Вас :( Все же Вашу проблему пусть и для очень маленького компилятора я сделал , факториал и Башни –еще раньше. Может, – очень маленькие «числа Фибоначчи» на потоках вместо «2х2»?
Теперь – к теме. Параллелизм автоматов на уровне отдельного автомата фактически позволяет отказаться от конструкций типа fork-join. Если глянуть на приведенную параллельную блок-схему, то что-то подобное нужно для синхронизации двух параллельных методов Compute. В программе на MC# fork реализуется записью, порождающей параллельные процессы, а «собирает» их метод Get (см. Листинг 1). Вот и было бы интересно посмотреть как будет в этом случае выглядеть комбинация С++ и TBB (но достучусь ли я до Алексея (или до автора реализации Фибоначчи для TBB)?).
Рекурсивные задачи – очень «тяжеловесные» задачи для компов с обычной архитектурой (см. в статье о функции Аккермана). Они подчеркивают насколько важно время вообще, а для параллельных процессов в особенности. Пример уже моей «глупости» :) В тестовом примере на MC# время вычисления не засекается. Я решил его засечь, окружив метод fib.Compute( n, cf.c ); в тестовом примере функциями зачечки времени. Создал в функции main что-то типа (см. код в поставке MC#):
DateTime dt1 = DateTime.Now;
fib.Compute( n, cf.c );
DateTime dt2 = DateTime.Now;
Запускаю – ноль и все тут. Уже собрался написать письмо. Но лишь когда дошло, что нужно засечь время не сразу после вызова Compute, а после Get все пошло. Т.е. так:
DateTime dt1 = DateTime.Now;
fib.Compute( n, cf.c );
Console.WriteLine( "For n = " + n + " value is " + cf.Get?() );
DateTime dt2 = DateTime.Now;
Console.WriteLine ( "time is: " + (dt2-dt1).TotalSeconds + " sec." );
Просто поначалу я метод Get вообще пропустил, наивно полагая, что все должно учитываться само-собой после головного вызова функции :). Собственно в последовательном варианте это так бы и было. В параллельном C# - это «мговенный вызов»/создание процессса, завершения выполнения которого еще нужно дождаться (в данном случе в методе Get).
19.10.2009 06:50

mt2
mt2Всего баллов:
13,459
Зарегистрированный пользователь
www.osp.ru который день настолько тормозит, что на него даже зайти не удается! Про факториал и рекурсию я тоже 20 лет назад опубликовал статейку в J. of Pascal, Ada & Modula-2. А сложный трудоемкий алгоритм рекурсивного вычисления индекса Хосойа я оптимизировал в статье в J. of Mathematical Chemistry: в мире неизвестно неэкспоненциального алгоритма для вычисления этого индекса (инварианта графа) - никакого сравнения с факториалом. Вольфрамовская Математика справедливо хвастается, что 100! в ней вычисляется (не знаю, используют ли там рекурсию) мгновенно ;) В общем случае дело в вычислительной сложности алгоритма, а не в том рекурсивный, он или нет. Например, мой алгоритм для установления изоморфизма молекулярных графов (Изв. Академии Наук, Сер.хим, 2005, 2166-2176) формально является рекурсивным алгоритмом с бэк-трекингом, но на деле для 95 миллионов химически интересных графов он затрачивает полиномиальное время от числа вершин графа. Так что я не стал бы утверждать, что "Рекурсивные задачи – очень «тяжеловесные» задачи", особенно в отношении факториала ;)

>Console.WriteLine( "For n = " + n + " value is " + cf.Get?() );
>DateTime dt2 = DateTime.Now;

А нельзя написать просто cf.Get?() без вывода на консоль Console.WriteLine? А то для коротких задач время вывода может стать определяющим;)

И как же я люблю Си во всех модификациях! Написал внутри фразы "?()" и думаешь: как же ее читатель прочитать сумеет ;)

21.10.2009 12:17

vlubch
vlubchВсего баллов:
3,435
коричневый пояс
>...В общем случае дело в вычислительной сложности алгоритма, а не в том рекурсивный, он или нет.
Говоря о параллелизме, нас в общем случае интересует параллельный он или нет. С этого надо начинать. Далее идут уточнения. Сколько параллельных процессов? Взаимодействуют ли они? Динамические или статические? Ну и т.д. и т.п. В этом смысле рекурсия интересна тем, что она ... нужна ;) Без нее можно теоретически, но практически - сложно. Если модель не позволяет создавать вложенную иерархию с ней будет сложно работать. Рекурсивный алгоритм позволяет это проверить. Т.е. большой плюс модели, имеющей вложенную иерархию. Рекурсивный алгоритм Фибоначчи интересен тем, что порождает большое число параллельных процессов (об этом я уже говорил), но процессы эти фактически не взаимодействуют между собой...
Короче, нас должны интересевовать не любые алгоритмы, а алгоритмы, отражающие те или иные стороны параллельных вычислений. В этом смысле рекурсивный алгоритм вычисления чисел Фибоначчи интереснее рекурсивного вычисления факториала. Да и Вольфрамовская Математика нас будет и должна интересовать не "мгновенными" вычислениями, а своими способностями к отражению свойств параллелизма. Есть такое - интересна, нет - пусть ею интересуются те, кого интересуют "мгновенные вычисления". И если вычисление индекса Хосойа или вычисление "пи" что-то добавляет нового в понимание параллелизма - они интересны, если нет - интересны тем, кому нужен этот индекс или точное значение числа пи или ... изоморфизм графов

>А нельзя написать просто cf.Get?() без вывода на консоль Console.WriteLine?
А неужели не понятно, что можно? Хотя это больше вопрос к Юрию ;) С другой стороны, именно эта строчка порождает варианты, которые важны при параллельном исполнении процессов. Для последовательных же вычислений это, скорее, вопрос стиля, чем корректности записи, когда, как ни читай, результат будет один! ;)
22.10.2009 08:59

mt2
mt2Всего баллов:
13,459
Зарегистрированный пользователь
>И если вычисление индекса Хосойа или вычисление "пи" что-то добавляет нового в понимание параллелизма - они интересны, если нет - интересны тем, кому нужен этот индекс или точное значение числа пи или ... изоморфизм графов

Ну вот! и года не прошло, как все выяснилось ;)
Ранее я цитировал шутку, что математики решают задачи, которые решаются, а программисты - которые нужно решить. У Вас "математический" подход - Вы выбираете те и только те задачи, на которых Ваш метод будет выглядеть наиболее привлекательным. Я же решаю задачи, нужные предметным областям, в которых я работаю. Что же, на вкус и цвет товарищей нет - каждому свое ;)
23.10.2009 02:06

vlubch
vlubchВсего баллов:
3,435
коричневый пояс
>Ранее я цитировал шутку, что математики решают задачи, которые решаются, а программисты - которые нужно решить. У Вас "математический" подход - Вы выбираете те и только те задачи, на которых Ваш метод будет выглядеть наиболее привлекательным. Я же решаю задачи, нужные предметным областям, в которых я работаю. Что же, на вкус и цвет товарищей нет - каждому свое ;)

Не надо шутить, превращая шутку в … диагноз :) Исходя из Вашей шутки, некоторые твердолобые практики до сих пор бы бегали в лучшем случае с дротиками, а уровень их математики ограничивался перекладыванием камешков ;)
Есть более правильная «шутка» - «если выводы, которые следуют из теории, не подтверждаются, то (если предположить, что эксперимент безупречен) теория должна быть пересмотрена». Это «шутка» М.Минского из его книги «Вычисления и автоматы».
Вы – узкий предметник, а параллельные вычисления – универсальная область. То, что Вы не можете или не знаете, как применить у себя автоматы, не говорит о их ограниченности. Из эквивалентности машин Поста и Тьюринга следует эквивалентность моделей блок-схем и конечных автоматов. Уж коли Вы используете модель БС, то нет принципиальных проблем с использованием у Вас и КА. Типичнейший пример в последовательных вычислениях – SWITCH-технология. В ее рамках рассказано и показано, как это делать один в один. Проблема тут одна – именно в Вашем «вкусе» и в понимании принципов технологии проектирования. Автоматы – это более высокий и качественный уровень проектирования. Если хотите, - и более «математический» ;)
Если Вы используете потоки, поместив в них модель БС, то опять же, ничто не мешает заменить БС на КА. Собственно так и поступают в SWITCH-технологии, вводя параллелизм. Но… в такой теории параллельных блок-схем (на практике это и есть потоки+БС) и таких «параллельных автоматов» (потоки + КА) возникают проблемы: «выводы», сделанные в их рамках, не всегда «подтверждаются». И тут достаточно даже одного «не подтверждения», чтобы в соответствии с «шуткой» Минского задуматься о правильности подобных «теорий».
Тут можно процитировать только Ли: «Почему параллельное программирование является трудным? Физический мир в высшей степени параллелен, и наша способность к выживанию зависит от способности воспринимать одновременно происходящее физические явления. Однако эта способность не распространяется на параллельные программы, поскольку абстракции, на которых основывается параллельное программирование, даже отдаленно не напоминают параллельность физического мира. Мы завязли в этих вычислительных абстракциях и забыли, что они не являются непреложными.» (Эдвард Ли. Проблемы использования потоков управления. IEEE Computer Society, Vol. 39, No. 5, May 2006 http://www.osp.ru/text/302/2449761/ )
Математические теории это не то, что можно … пробовать на зуб - вкус и оценивать на глаз – цвет. Если следовать подобной «первобытной оценке», то параллельное программирование, несмотря на наличие тех или иных его теорий, как было, так и будет «пещерным». Но это уже только моя оценка, но только не на … зуб и не на глаз ;)
Исходя их сказанного. Я выбираю те задачи, которые тестируют ту или иную теорию параллельных вычислений на адекватность параллелизму физического мира.
23.10.2009 02:52

ksili
ksiliВсего баллов:
7,570
коричневый пояс
Говоря про математиков и программистов можно дать более правильные названия этим подходам: прикладная наука и фундаментальная наука. Но так или иначе их результаты когда-нибудь пересекаются, и то и другое нужно для прогресса. Так что можно стать уважаемым специалистом будучи приверженцем любого из этих подходов. Вот только когда они пересекутся - при нашей жизни или нет - как повезёт.
23.10.2009 13:26

mt2
mt2Всего баллов:
13,459
Зарегистрированный пользователь
> Уж коли Вы используете модель БС

С каких пор блок-схемы стали моделью? Это способ представления и не более того! Одно и то же можно нарисовать и написать. Написанное (по сравнению с БС) обычно полнее и более верифицируемо, но и только. Можно производную обозначать штрихом вслед за Лейбницем, а можно точкой как Ньютон - и какая разница?

>Вы – узкий предметник

Ага! Я "узкий", решающий неограниченный круг задач, а Вы "широкий" - сфокусированный всего на нескольких задачах школьного уровня сложности ;)

>Исходя из Вашей шутки, некоторые твердолобые практики до сих пор бы бегали в лучшем случае с дротиками

Исходя из всего, что Вы тут написали, все практики - твердолобые и все они до сих пор бегают с дротиками, не желая применять Вашу теорию. Но поскольку вся эта теория сведена к минимуму простеньких задач, то всем практикам, чтобы не быть твердолобыми, следует срочно бросить свои дела и заняться исследованием рекурсивных методов решения величайшей задачи вселенной - чисел Фибоначчи!

>Автоматы – это более высокий и качественный уровень проектирования. Если хотите, - и более «математический» ;)

Ага! Хочу! -хочу наконец получить мат. доказательство этого утверждения! Пока что слово «математический» я, как и в предыдущем посте, вынужден ставить в кавычки. Потому как за такую голословную "математику" даже в школе ставят неуд :(

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

Может, Вам только кажется, что числа Фибоначчи отражают все многообразие Мира? ;) Думаю, что доказать мат.полноту набора Ваших задач будет еще трудней, чем многие другие Ваши утверждения.

>«если выводы, которые следуют из теории, не подтверждаются, то (если предположить, что эксперимент безупречен) теория должна быть пересмотрена». Это «шутка» М.Минского из его книги «Вычисления и автоматы».

Именно так! Пока факт в том, что выводы Вашей теории (а не SWITCH или каких-либо других теорий) Вами не подтверждены. Эмоциональные эпитеты типа "узкий", "твердолобый" за подтверждения считаться не моЖут. Так что поступайте по Минскому ;)
23.10.2009 13:45

mt2
mt2Всего баллов:
13,459
Зарегистрированный пользователь
>Говоря про математиков и программистов можно дать более правильные названия этим подходам: прикладная наука и фундаментальная наука.

Нет же! Речь идет ТОЛЬКО о фундаментальной науке! Разве открытая проблема изоморфизма графов не фундаментальная проблема современной математики? А разве проблема зависимостей структура-свойство не фундаментальная проблема химии? Дело в том, что для математиков "гораздо легче придумывать свои собственные задачи и решать то, что возможно решить" Morris Kline ( http://software.intel.com/ru-ru/blogs/2009/05/22/computer-science -1/ ) В данном случае Вячеслав специально подбирает задачки для своей теории, но при этом обижается, что все остальные "твердолобые" не хотят применять его теорию тотально :(
25.10.2009 01:22

vlubch
vlubchВсего баллов:
3,435
коричневый пояс
>В данном случае Вячеслав специально подбирает задачки для своей теории, но при этом обижается, что все остальные "твердолобые" не хотят применять его теорию тотально :(
Давайте как-то определимся - чем заниматься. Теорией и практикой параллельных процессов или решением проблем теории графов, химии и т.п....
Из рассмотренных мною задач лишь одна - триггер - "подобрана" мною. Остальные - фактически типовые для области параллельных вычислений. "Подбирали" их другие, чтобы рассмотреть/изучить те или иные свойства параллельных вычислений. Так что тут Вы, Михаил, явно передергиваете. С другой стороны, Вы тоже можете предложить свою задачу/задачи, но именно с точки зрения изучения/тестирования свойств параллельных вычислений. Так что - огласите список! ;) И, конечно, с указанием того, что полезного мы получим/узнаем от реализации данных задач (с точки зрения, конечно, паралелизма).
25.10.2009 01:59

vlubch
vlubchВсего баллов:
3,435
коричневый пояс
Для примера. Что мы проверяем с помощью алгоритма вычисления чисел Фибоначчи? Подчеркнем - рекурсивного. Смотрим на рис.1.
1. Создание двух параллельных процессов.
2. Синхронизацию завершения работы параллельных процессов.
3. Рекурсивное порождение процессов.
Из сравниния графических (рис.1 и рис.2) и текстовых (листинг 1 и листинг 2) форм представления алгоритма, реализованных в рамках двух разных моделей параллельных вычислений, мы можем сравнить данные модели. И не только их описательные свойства на языке программирования, но и в той или иной мере эффективность реализации рассматриваемых моделей.
При этом вопрос реализации вопрос достаточно зависимый от того как и на чем реализуем. Это даже вопрос больше практики, чем теории. Хотя, безусловно, сложность модели будет влиять на сложность реализации и на ее эффективность. Например, те же сети Петри не только сложны сами по себе, но я что-то не могу припомнить и их практически эффективную реализацию. Но даже эффективная реализация модели не влечет за собой ее тотального практического применения. Пример - машины клеточных автоматов. Ну и т.д. и т.п.
25.10.2009 02:19

vlubch
vlubchВсего баллов:
3,435
коричневый пояс
>...Вот только когда они пересекутся - при нашей жизни или нет - как повезёт.
Не хотелось бы рассчитывать на авось. Нужен для начала хотя бы какой-нибудь критерий. Для меня это формальное доказательство свойств RS-триггера в рамках какой-либо модели. Пока автоматам тут конкурентов неи или почти нет. Это - при моей жизни. Что будет дальше зависит от того появится ли другое доказательство. Пока даже о том, которое есть, знают, думаю, единицы. Именно из-за этой ситуации и существует миф о запрещенных состояниях триггера ;)
26.10.2009 09:29

mt2
mt2Всего баллов:
13,459
Зарегистрированный пользователь
>Давайте как-то определимся - чем заниматься. Теорией и практикой параллельных процессов или решением проблем теории графов, химии и т.п....
Из рассмотренных мною задач лишь одна - триггер - "подобрана" мною. Остальные - фактически типовые для области параллельных вычислений. "Подбирали" их другие, чтобы рассмотреть/изучить те или иные свойства параллельных вычислений. Так что тут Вы, Михаил, явно передергиваете. С другой стороны, Вы тоже можете предложить свою задачу/задачи, но именно с точки зрения изучения/тестирования свойств параллельных вычислений. Так что - огласите список! ;) И, конечно, с указанием того, что полезного мы получим/узнаем от реализации данных задач (с точки зрения, конечно, паралелизма).

Так Вы, Вячеслав, никак и не определитесь, о чем, собственно, речь. То мы говорили о Вашем методе, как о методе, позволяющем уже сейчас всем решать любые ПРАКТИЧЕСКИЕ задачи, то Вы настаиваете на сугубо абстрактном, теоретическом подходе! - Так что это Вы передергиваете. Теория может быть любой: герои Свифта, например, теоретизировали, с какого конца разбивть вареное яйцо - с острого или с тупого. Наверное, их последователь мог бы утверждать, что все задачи сопромата сводятся к этой теории, однако без доказательства наврядли ему кто поверил бы;) В отношении чисто абстрактной теории ранее я уже сказал, что в Вашем подходе для меня привлекательного (в частности, таблицы истиности), а что не привлекательно (в частности, модель с разделением времени). Но больше того, чем было сказано, меня теория не волнует! Мне прежде всего интересно, что практически она сейчас может дать для решения практических задач. И я их уже называл. Так, недавно на этом форуме проходил конкурс по параллельному вычислению Пи. Не я, а уважаемые специалисты по параллельным вычислениям Интела выбрали эту задачу в качестве конкурсной. Значит, они считали ее полезной для оценки различных подходов к параллельным вычислениям. Не я, а Вы тут говорили, что существующее сейчас программирование является пещерным. Но на практике Ваш метод использует компиляторы С++, котрые также сделаны по пещерной технологии. Покажите, что Ваша технология способна хотя бы обеспечить саму себя правильно сделанным компилятором языка высокого уровня. Пусть не С++, но хоть PL/0 сделайте ;) Вот тогда и будет о чем говорить. А с какого конца нужно бить яйцо, я обсуждать отказываюсь.
27.10.2009 02:23

vlubch
vlubchВсего баллов:
3,435
коричневый пояс
>Так Вы, Вячеслав, никак и не определитесь, о чем, собственно, речь. То мы говорили о Вашем методе, как о методе, позволяющем уже сейчас всем решать любые ПРАКТИЧЕСКИЕ задачи, то Вы настаиваете на сугубо абстрактном, теоретическом подходе! - Так что это Вы передергиваете.
Вчера в Москве купил книгу: Кип Р.Ирвин Язык ассемблера для процессоров Intel. Поначалу были сомнения, но, увидев в ней материал по применению теории конечных автоматов, отбросил их :) Да и книга по ассемблеру должна все-таки быть. А то уж я совсем его забыл ;)
Далее. Открываю по приезде книгу Пауэрс, Снелл Microsoft Visual Studio 2008 и натыкаюсь на главу «Встраивание рабочих процессов в ваши приложения». А в ней - на «Рабочий процесс типа конечного автомата». Читаем. «Хорошая новость состоит в том, что рабочие процессы типа конечного автомата работают во многом подобно своим последовательным собратьям». Чуть ниже - «Основная разница между последовательным процессом и процессом типа конечного автомата носит концептуальный характер» ну и т.д. (не буду переписывать книжку :) ).
Особенно мне понравилось ПРИМЕЧАНИЕ. Цитирую его:
«В этом разделе мы намеренно сосредоточились на специфичных для конечного автомата элементах. Если вы не можете понять эту концепцию, вернитесь к последовательному примеру и перечитайте в нем все подробности»
Можно это же адресовать и Вам ;) Может, как советовал классик, пора уже сделать шаг назад, что потом сделать два шага вперед. Автоматы использовали, используют и будут использовать. Вопрос – какие, где и как? Мои ответы на них:
На вопрос - какие? Сетевая модель на базе автоматов Мили.
Где? Везде! Поскольку сетевая модель охватывает и параллельные процессы.
Как? Тут может быть множество вариантов. И чем долго объяснять, проще это показать на примерах ;) На уровне языка программирования и в рамках ООП числа Фибоначчи - один из таких простых примеров.
>Теория может быть любой:… Но больше того, чем было сказано, меня теория не волнует!
Если хочешь с чем-то разобраться, то нужно начинать с теории. Так, таблицы истинности – частный случай КА. Это автомат с одним состоянием. Отсюда и ограничения в их применении. Разделение времени – не имеет ни какого-то отношения к теории. Это один из подходов к реализации концепции параллельных процессов. Нужно все же как-то отделять «котлеты» от «мух».
>Мне прежде всего интересно, что практически она сейчас может дать для решения практических задач. И я их уже называл.
И я назвал ;) И рассказал, где можно почитать о методике, которая показывает и доказывает как можно реализовать ЛЮБЫЕ задачи (это если Вы не верите на слово :) ).
>Так, недавно на этом форуме проходил конкурс по параллельному вычислению Пи. Не я, а уважаемые специалисты по параллельным вычислениям Интела выбрали эту задачу в качестве конкурсной. Значит, они считали ее полезной для оценки различных подходов к параллельным вычислениям.
Так кто ж против? Предположим, что я не прав, не понимая какое свойство параллелизма мы отражаем, изучаем и т.п., решая эту задачу. Простейший путь – взять параллельных алгоритм победителя, используя известную процедуру перевести его в автоматную форму и … наслаждаться автоматным решением, сравнивая его с исходным. Это как раз то, что показано на примере чисел Фибоначчи. Собственно это я предлагал, чтобы не заниматься поиском своего решения. И даже – о наглость! - хотелось бы, чтобы и подобную конвертацию сделал кто-нибудь другой ;)
>Не я, а Вы тут говорили, что существующее сейчас программирование является пещерным.
Спасибо, хоть теперь этот термин будет за мной ;)
>Но на практике Ваш метод использует компиляторы С++, котрые также сделаны по пещерной технологии.
Так что ж тут плохого. Не все появляется сразу и не всегда нужное под рукой. До сих пор иногда и булыжник – инструмент ;) Я не сторонних стерильности подхода. В конце концов с позиции «черного ящика» мне не важно по какой технологии сделан С++. Достаточно того, что он меня устраивает в отличие от других языков. И, слава Богу (в лице Страуструпа, конечно), что есть «пещерный С++»! :)
>Покажите, что Ваша технология способна хотя бы обеспечить саму себя правильно сделанным компилятором языка высокого уровня. Пусть не С++, но хоть PL/0 сделайте ;) Вот тогда и будет о чем говорить. А с какого конца нужно бить яйцо, я обсуждать отказываюсь.
А с какой цель по-вашему я написал статью о числах Фибоначчи? Чтобы на их примере и показать. Здесь нет только одного – синхронизации процессов через состояния. Дойдем до триггера или уже и в сортировках – увидим и этот механизм. Так что давайте пока на яйца не отвлекаться ;) Есть теория автоматов и от нее и надо «плясать». А для начала нужно хотя бы уяснить место этой теории в теории программ. И на это тоже есть ответь. Модель конечного автомата – это модель управления ЛЮБОЙ программы. Т.е. у обычной программы управление блок-схемное, у автоматной – автоматное (см. на примере Фибоначчи) ;)
27.10.2009 09:08

mt2
mt2Всего баллов:
13,459
Зарегистрированный пользователь
Вячеслав,

ранее мы пытались обсудить Ваш оригинальный подход, сейчас Вы подменяете это обсуждение обсуждением ВСЕХ известных подходов, где употребляются или упоминаются конечные автоматы. Не вижу смысла для такого обсуждения, уж слишком оно неконкретно. Думаю, что в литературе можно найти обзорные статьи по этому вопросу, но не думаю, что в этих статьях утверждается, что все остальное программирование пещерное :)
29.10.2009 03:06

ksili
ksiliВсего баллов:
7,570
коричневый пояс
> ... рабочие процессы типа конечного автомата работают во многом подобно своим последовательным собратьям.

А хотелось бы наоборот перехода к параллельным вычислениям...
30.10.2009 03:54

vlubch
vlubchВсего баллов:
3,435
коричневый пояс
>А хотелось бы наоборот перехода к параллельным вычислениям...
А уж как мне этого хочется! :)
Но поначалу я грешным делом подумал, что это меня процитировали. Неужели я такое говорил? :) Хотя в чем-то и согласен :)… Однако, - не я :) А потому уточняю свою позицию в отношении «похожести» или «подобности» последовательных и параллельных процессов…
Если посмотреть на них с позиций «черного ящика», то вообще отличий нет! Откуда и как можно понять по какой технологии сделан «черный ящик»? Отвечаю же сам – ниоткуда!
Копнем чуть глубже внутрь. Если программу структурно представить как тройку S = <M,A,G>, где M – ее память (множество ячеек памяти/переменных), A- множество операторов/действий, G - управление, то последовательный процесс от параллельного отличается только управлением. У первого управление последовательное, у второго – параллельное. Т.е. данные и операции можно оставить в покое, а заняться только управлением.
Смотрим на управление, т.е. конкретизируем процесс сравнения дальше. Собственно исполняем пожелание – переходим к параллельным процессам :) Чем с точки зрения отражения параллелизма процессов отличается последовательный процесс вычисления чисел Фибоначчи от параллельного же их вычисления.
Сравним сначала последовательное блок-схемное управление с параллельным блок-схемным же. Последовательная блок-схема не приведена, но, надеюсь, она очевидна. Параллельная блок-схема приведена на рис.1. В чем их отличие? В том что в последовательном варианте рекурсивные вызовы выполняются последовательно, в параллельном (см. рис.1) – параллельно. Отсюда видны и похожесть и отличия. Очень похожи, но есть и небольшое отличие. Сумеем мы их как-то узреть, глядя на «черный ящик» Фибоначчи. Нет. По скорости? А кто сказал, что она будет выше? А если выше, то не потому ли что, условно говоря, процессоры «ящиков» разные по своим скоростным качествам?
Теперь сравним параллельное блок-схемное управление с параллельным автоматным (уж не будем отвлекаться на последовательные их варианты). Есть похожесть? Есть. Последовательность выполняемых операции, например, один в один. Есть отличия? Их не увидит только слепой! :) В автомате в явном виде фиксируются состояния процесса, которые в блок-схемном варианте управления никак не зафиксированы. Хотя, безусловно, есть, но только в неявной форме.
Увидим ли мы состояния, глядя на «черный ящик»? И нет и да. Нет, т.к. информация о «программных состояниях» никак не выводится в наружу. Но их можно почувствовать, наблюдая за той же последовательность изменения данных, за последовательностью выполнения операций. Кстати, в этом случае лучше смотреть уже на управление, как на «черный ящик».
Так может нам достаточно модели «параллельных блок-схем»? Если оценивать лишь один процесс, то может сложиться впечатление, что как бы да – достаточно! Но если глянуть на два процесса, выполняющихся параллельно, то – нет! Почему? Об этом отдельный разговор. Пока же, сравнивая блок-схемную модель управления с автоматной можно сказать, что в последнем случае процессы могут обмениваться между собой информацией о своих «внутренних состояния». А это важно. Это та информация, которой нет у модели управления, основанной на понятии блок-схема...
30.10.2009 08:24

mt2
mt2Всего баллов:
13,459
Зарегистрированный пользователь
> Если программу структурно представить как тройку S = <M,A,G>, где M – ее память (множество ячеек памяти/переменных), A- множество операторов/действий, G - управление, то последовательный процесс от параллельного отличается только управлением.

1) "M – ее память (множество ячеек памяти/переменных)" и стек? и экземпляры объектов? (в том числе объектов-потоков?) Если "да", то утверждение "последовательный процесс от параллельного отличается только управлением" не верно.

2) оператор не есть управление? А что такое это "управление"? ОС? Пользователь?
31.10.2009 10:31

vlubch
vlubchВсего баллов:
3,435
коричневый пояс
Цитирую: «В языках программирования можно выделить три взаимодействующих уровня: уровень управления вычислениями, уровень операций над данными и уровень структур данных (или памяти)…
Элементы памяти являются абстракциями ячеек, очередей, стеков и т.п. Операторы схемы моделируют операторы обработки данных (типа операторов присваивания)… Для параллельных языков характерен более развитый, чем в последовательных языках, уровень управления. Соответственно в моделях параллельных программ основное внимание уделено этому уровню. Управление – наиболее принципиальная часть любой параллельной схемы.»
Это из сборника «Алгоритмы, математическое обеспечение и архитектура многопроцессорных вычислительных систем» (стр.105-106). Замечу, что аж 1982 г. ;)
Я снял Ваши вопросы, Михаил? (Точнее, - авторы сборника).
Дополню. Чуть дальше (стр. 110). «Схемы Карпа-Миллера являются доворльно общей моделью параллельных вычислений, и эта общность – результат того, что управление представлено в «абстрактной» форме, как автомат.»
На примере чисел Фибоначчи я конретизировал ""абстрактную" форму" (см. начало темы - листинг 2 и рис.2), показав каким может быть автоматное управление в форме автомата Мили.
02.11.2009 09:07

mt2
mt2Всего баллов:
13,459
Зарегистрированный пользователь
Если я правильно понял цитату, то получается, что "x:=0" - это оператор, а "if x>0 then..." - это уже управление? Не знаю, зачем понадобилась столь странная классификация авторам цитированного текста, но каждый имеет право на свою классификацию, даже и очень странную. Например, по алфавитному принципу: операторы, название которых начинается на букву в первой половине алфавита, отнесем к первому уровню (if и т.д.), а остальные - ко второму (while и т.д.) И так тоже можно, только непонятно зачем ;)
02.11.2009 11:12

vlubch
vlubchВсего баллов:
3,435
коричневый пояс
>Если я правильно понял цитату, то получается, что "x:=0" - это оператор, а "if x>0 then..." - это уже управление?
Правильно.
> Не знаю, зачем понадобилась столь странная классификация авторам цитированного текста,
Разберемся … ;)
> но каждый имеет право на свою классификацию, даже и очень странную. Например, по алфавитному принципу: операторы, название которых начинается на букву в первой половине алфавита, отнесем к первому уровню (if и т.д.), а остальные - ко второму (while и т.д.) И так тоже можно, только непонятно зачем ;)
Алфавитная - непонятная ;) А вот приведенная - понятная и полезная. Отделяя «котлеты» от «мух», мы можем разобраться с ними по отдельности. Сейчас серьезный аппаратный кризис (про программный – отдельно). Как его можно преодолеть?
1) Изменить данные. Например, вместо двоичного кодирования использовать троичное, десятичное и т.д. Пока мы отдаем предпочтение двоичному и другого что-то не предвидится.
2) Совершенствовать операции обработки данных. Думаю, здесь мало что изменится, т.к. почти все опробовано.
3) Ввести более совершенное управление.
Можно действовать по всем трем направлениям, но пока, как можно видеть, мы сосредоточили свои усилия на третьем – управлении… Отсюда – многопоточность, многоядерность, семафоры, мьютексы, сети Петри, всякие «хаскели», «лиспы» и … автоматы. Хлопот - море, результат – пока спорный ;)
И еще. Когда кто-то, где-то в очередной раз обещает чудо, то нужно прежде чем во все это поверить дать ответ, какие программные компоненты – память, операторы, управление - будут подвергнуты влиянию. И в этом тоже один из ответов на вопрос – «зачем» ;)
05.11.2009 09:04

mt2
mt2Всего баллов:
13,459
Зарегистрированный пользователь
> Сейчас серьезный аппаратный кризис (про программный – отдельно). Как его можно преодолеть?

Впервые слышу! И в чем кризис? Что Интел многоядерные процессоры по привлекательным отношениям цена/производительность делает? Или что емкости винчестеров далеко перевалили за психологический рубеж в 1000 Гб? ;)

> Например, вместо двоичного кодирования использовать троичное, десятичное и т.д. Пока мы отдаем предпочтение двоичному и другого что-то не предвидится.

Была советская ЭВМ Сетунь, троичная. После этого попыток не было ;)


06.11.2009 00:30

vlubch
vlubchВсего баллов:
3,435
коричневый пояс
>Впервые слышу!
И здрасьте Вам! :)
>И в чем кризис?
Уже забыли, от какой такой плесени появилась многоядерность? Или Вы не ощущаете на себе всей прелести многоядерного программирования? Или у Вас есть сведения о колоссальных успехах автоматического распараллеливания? Или Вы не в курсе, сколько лет всем тем идеям, которые сегодня реинкарнируются в железе и в софте? ;)
>Что Интел многоядерные процессоры по привлекательным отношениям цена/производительность делает?
Меня привлекает не цена/производительность, а … реальный прогресс. Его нет. Я не ощущаю, как раньше, серьезного прироста производительности, хотя и поменял не так давно «старенький» PIV на двухядерный. Цена, между прочим, мало изменилась.
А программирование? Многопоточное стало только много сложнее и несравненно менее надежно. Про его пещерность я уже писал. Да и не мое это только открытие :)
Так что уже можно было бы и услышать…
>Или что емкости винчестеров далеко перевалили за психологический рубеж в 1000 Гб? ;)
А какое это отношение имеет к теме параллельного программирования? Да и не пугают лично меня подобные «рубежи»? Скорее радуют. :)
>Была советская ЭВМ Сетунь, троичная. После этого попыток не было ;)
Так и я об этом же – зачем? Хотя … изменив скорость операций с данными, мы можем реально повысить производительность процессора. Но, видимо, и тут «затык», если … пошли по пути многоядерности ;) Но опять же – обработка данных к теме параллельности имеет лишь косвенное отношение. Т.е. нам важно не что получить, а как это сделать. Или, говоря другими словами, нам сейчас должно быть важно не число знаков в числе «пи», а свойства алгоритма (управления) их нахождения, не значение числа Фибоначчи, а свойства алгоритма их вычисления :)
Так что слышали Вы или нет, хотите ли Вы слышать или не хотите, но кризис есть. Даже, несмотря на привлекательность параметра цена/производительность. Об этом, еще раз, глаголю не я один. :)

06.11.2009 00:42

vlubch
vlubchВсего баллов:
3,435
коричневый пояс
Да, - склероз! :( Все забываю сказать... Нашел сам "ядреный" алгоритм вычисления чисел Фибоначчи :) Оказывается он был в Tutorial-е к TBB. Хоть один бы ... "хороший человек" об этом сказал! Результаты его исследования не в пользу прогресса. Скорее в подтверждение кризиса. Но об этом в блоге - "33 шага назад". Уже отправил на утверждение. Слушайте и постарайтесь ... услышать. :)
06.11.2009 01:15

vlubch
vlubchВсего баллов:
3,435
коричневый пояс
Спешу поделиться... Наконец-то сделал обещанный в новом блоге сравнительный тест многопоточной версии Фибоначчи с реализацией на MC#. Поразительно, но все тик в тик! :) И опять все не в пользу прогресса. И все объективно - поскольку математика!
Хотя... конечно ошибаются и математики. Расстроюсь, если вдруг выяснится подобное, т.к. больно уж красиво получается. Так что - спешите меня расстроить :)
06.11.2009 06:13

mt2
mt2Всего баллов:
13,459
Зарегистрированный пользователь
> Меня привлекает не цена/производительность, а … реальный прогресс.

прогресс ради прогресса ;)

> Или Вы не ощущаете на себе всей прелести многоядерного программирования?

Причем тут аппаратный кризис?

> Так что слышали Вы или нет, хотите ли Вы слышать или не хотите, но кризис есть

очень доказательно :)
11.12.2010 01:28

1108935
1108935Всего баллов:
10
Зарегистрированный пользователь
Хорошая тема

Обратная ссылка (1)


Оставить комментарий  

Для получения технической помощи посетите сайт службы поддержки.
Имя (обязательно)*

Электронная почта (обязательно; не будет отображено на этой странице)*

Ваш URL-адрес (необязательно)


Комментарий*