Re: Re[3]: параллельный РЕФА


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