12.10.2020

Маленький размер

Заболел. В перерывах постельного режима решил ускорить работу СЛАУ как раз самого маленького размера: в 3 уравнения. Все же похожие системы очень часто встречаются в реальности. Практически все трехмерные расчеты так или иначе связаны примерно с этим размером. В то время как решение очень больших СЛАУ - это скорее очень редкие исключения. По крайней мере мне так кажется.
 
Начал, естественно, с FPU (x87). У него есть 8 вещественных регистров. А коэффициентов в СЛАУ 12. Впрочем, точно хранить нужно только элементы над верхней диагональю и свободные члены, которых всего 7. Но еще нужны свободные регистры для временных операций...
Короче, программирование матричных операций на регистрах, завязанных в стек ‒ та еще радость! И самое главное, не очень ясно, велик ли выигрыш от хранения коэффициентов в регистрах.

Попутно полдня мучил свой воспаленный мозг, пытаясь понять, что же не так то!? Через несколько часов выяснил, что "не так" - это глюк в дебаггере Delphi, который по крайней мере в 64-битном режиме неверно отображает заполненный более чем на половину регистровый стек FPU!
Да, видимо придется с Delphi все же уходить, как не жаль. Тем более, что Lazarus (точнее, Free Pascal) умеет вроде даже в AVX.

Тем не менее, регистровая оптимизация, может быть местами чрезмерная, а также полный отказ от циклов, дали свои плоды: ускорение примерно в 1.5 раза.

2 комментария:

  1. Скорейшего Вам выздоровления!

    А как структуры данных организованы? Массив из указателей или СЛАУ целиком в одном массиве? Как я понимаю, на таких крохотных СЛАУ нужно постараться избежать случайного доступа памяти, так как его цена слишком велика.

    Баг в дебаггере - это жесть, и что может быть хуже...

    > ускорение примерно в 1.5 раза
    Существенно!

    ОтветитьУдалить
    Ответы
    1. Спасибо, Иван!

      > А как структуры данных организованы?
      Все СЛАУ в одном массиве плюс указатели на строки, что бы можно было быстро переставлять строки местами.

      Удалить