Эксперимент
Как один час машинного времени превратить в одну секунду
index.htm - English text
eksperiment.zip - архивированная директория
Постановка задачи. Здесь происходит комбинация двух предыдущих примеров: solve и scp2int.
1. Программа scp3int.java - решает систему линейных уравнений. Специализация происходит по матрице коэффициентов. В данном примере рассматриваем конкретный пример - обобщенная последовательность Фибоначчи. Если размер матрицы dim=n, то каждый последующий элемент равен сумме n предыдущих. Например, при dim=3 матрица такова
( 1 1 1) ( 1 0 0) ( 0 1 0)
При умножении ее на столбец
( a ) ( b ) ( c )
получается столбец
( a + b + c ) ( a ) ( b )
Программа scp3int.java по заданному второму столбцу находит неизвестный первый столбец.
2. В программе scp3int.java обычные арифметические операции add, sub, mul, div заменены на операции addKorl, subKorl, mulKorl, divKorl, каждая из которых превращает свои действительные аргументы в комплексные числа и обращается к соответствующей функции пакета Complex, а затем оставляет лишь действительную часть результата.
3. Пакет Complex превращен в пакет ComplexKorl - там при выполнении арифметических действий над комплексными числами сначала аргументы преобразуются в матрицы 2 на 2, затем происходит обращение к соответствующей функции пакета Jama, матрица результата преобразуется в комплексное число.
Данный пример носит экспериментальный характер. Конечно, никто именно так делать не станет. Я пытаюсь моделировать вполне реальную ситуацию при использовании готовых Ява-пакетов, когда одни пакеты обращаются при своей работе к другим пакетам.
Сейчас провожу эксперимент поэтапной суперкомпиляции этой задачи. Непосредственная суперкомпиляции проходила успешно, но занимала больше времени.
Полагаем dim=10.
Исходная программе scp3int в головной директории, dim=10. iters=1000, время счета - 18.4 секунды.
Суперкомпилирую метод addKorl и заменяю его в исходной программе,
Суперкомпилирую метод subKorl и заменяю его в исходной программе,
Суперкомпилирую метод mulKorl и заменяю его в исходной программе,
Суперкомпилирую метод divKorl и заменяю его в исходной программе,
Полученная программа scp3int находится в поддиректории Result.
Добавляю нулик в iters, время счета - 0.57 секунды (значит - 0.057 секунды). Ускорение - 263 раза.
Теперь суперкомпилирую полученную программу в директории Result (метод test) и помещаю ее в поддиректорию Result2. Добавляю еще два нулика в iters (всего три нулика), время счета - 0.9 секунды (значит - 0.0009 секунды).
Если теперь разделить 18.4 секунды на 0.0009 секунды, то получится ускорение 20440 раз (20 тысяч).
Первые четыре суперкомпиляции шли быстро и занимали доли секунды. Последняя суперкомпиляции заняла 19 секунд.
Приведем остаточную программу для dim=5
//-------------------------------------- 2 sec - postprocessing... public static void test () { final double scp3Int_b_0_22 = Scp3Int.b[0]; final double bb_1_312 = Scp3Int.b[1] - scp3Int_b_0_22; final double bb_2_550 = Scp3Int.b[2] - -1D * bb_1_312; final double bb_3_787 = Scp3Int.b[3] - -1D * bb_2_550; final double bb_4_1024 = Scp3Int.b[4] - -1D * bb_3_787; final double bb_1_1243 = (bb_1_312 - bb_2_550) * -1D; final double bb_2_1249 = (bb_2_550 - bb_3_787) * -1D; final double bb_3_1255 = (bb_3_787 - bb_4_1024) * -1D; final double bb_4_1261 = bb_4_1024 * -1D; Scp3Int.b[0] = scp3Int_b_0_22 - -1D * bb_1_312; Scp3Int.b[1] = bb_1_1243; Scp3Int.b[2] = bb_2_1249; Scp3Int.b[3] = bb_3_1255; Scp3Int.b[4] = bb_4_1261; return; } //-------------------------------------- 3 sec - JScp version 0.0.77