Subject: Re: Re[3]: параллельный РЕФА
From: Sergei M. Abramov (abram@botik.ru)
Date: Sun Apr 04 2004 - 17:56:58 MSD
> Нет ли у вас чего-нибудь на буржуинском языке по Т++ ?
Дмитрий, переслал запрос на группу товарищей. Возможно они дадут ссылки
хотя бы на старые стьтьи или статьи прикладников (Чижонков...). Ваш вопрос
актуальный--это то, что спрашивают в последнее время часто (контакты с
забугорьем растут...)
А на русском языке собрал все в разумную кучку:
http://www.botik.ru/~abram/temp-T-system/
> Совершенно верно. По большому счет есть два семантически различных (!)
> варианта: 1 и 2. Вариант 2 семантически равносилен стандартному
последовательному.
> Вариант 1 - нет.
Если во время предстартовой подготовки не делать ортпгонализацию левых
частей.
> ... Более того, вариант 1 вносит в семантику недериминизм.
...
> (Кстати, важно, чтобы автор кода мог указать, какие ветвления могут
> так параллелиться. По умолчанию, чтобы все было по-стандартному.)
Так точно.
> И все же, возвращаюсь к исходному вопросу - этого ли мы хотим?
Ответ зависит от того, как мы понимаем слово "мы" (пардон за замкнытый
круг).
Я описал, что я хочу (для первого раза): паралелизм в духе Т-системы, на
уровне -- одна функция == одна гранула, и не всякая рефал-фция есть
Т-функция.
Тем самым, я бы не стал эксплуатировать кажущийся параллелизм в якобы
параллельных ветках (паралельизм в различных предложениях) -- это мелко (в
смысле гранул и лоад-балансинга), бо;ьше потеряется на пересылках и
переключениях контекста.
И последнее (всеми пропущенное):
> >(3) Parallel subexpressions inside one pattern, e.g. (P1)(P2), as well as
> > various orders of matching.
Как написано в статье (давал ссылку на PDF), я не склонен перестройку
(Ое1)(Ое2):(P1)(P2)
двумя паралельными перестройками. Это СИСТЕМА перестроек, и в каком порядке
оно будет выполняться--зависит от многого. Например:
(еOld1)(eOld2) : (e1 eX) (eX eX eX)
я бы компилировал бы вот в такой последовательный код:
L = length(eOld2);
if !(L mod 3 == 0) then goto fail;
еX = subexpr(eOld2, 0, L/3);
if (еX != subexpr(eOld2, L/3, L/3)) then goto fail;
if (еX != subexpr(eOld2, 2*L/3, L/3)) then goto fail;
L1 = length(eOld1);
if !(L1 >= L2) then goto fail;
if (еX != subexpr(eOld1, L1-L/3, L/3)) then goto fail;
е1 = subexpr(eOld1, 0, L1-L/3);
Не вижу здесь никаких основаниой для параллелизма...
Удачи
С.
This archive was generated by hypermail 2b25 : Mon Oct 25 2004 - 21:25:00 MSD