Tags: matlab

cat with many words

Скорость вычислений pdetool в matlab

Интересна зависимость скорости решения уравнений в частных производных от подробности сетки в matlab (пакет pdetool). Уравнения решаются численном методом конечных элементов, сетка треугольная.
Несмотря на то, что сетка генерируется средствами матлаба автоматически, есть метод заставить ее добавить в сетку узлы с нужными координатами – для этого нужно просто добавить еще одну область, граница которой будет проходить по нужным точкам, и это позволяет делать сетку неравномерной, повышая точность вычислений в той области, где это необходимо.

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

Функция refinemesh переразбивает текущую сетку, деля каждый выбранный треугольник на четыре. Провел тестовые вычисления с разным объемом оперативной памяти на машине. Получились следующие результаты:

Количество вызовов refinemesh Количество треугольников Среднее время вычислений при 1gb RAM, c Среднее время вычислений при 4gb RAM, c
0 1274 0.35 0.36
1 5096 0.75 0.83
2 20384 3 3.5
3 81536 17 17.3
4 326144 800 100

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


Оригинал: http://blog.dpetroff.ru/tech/pdetool_speed_matlab
cat with many words

Оптимизация вычислений в Matlab

В следствие своей деятельности написал программу работы с изображениями для среды matlab. Суть не в программе, а в последующей оптимизации, которая привела к некоторым выводам, очевидным и не очень. Спасибо за чудесный профилировщик!

  1. Время выполнения скрипта гуляет в пределах до двух секунд. На больших файлах это может быть и не заметно, но факт есть.
  2. Вызов самописных функций в цикле замедляет программу. То же самое с работой с массивами.  Чем присвоений меньше, тем лучше. Если вызываемая функция небольшая, то имеет смысл на последнем шаге оптимизаций вставить ее прямо в код.
  3. Размер массива лучше заранее задать, впрочем матлаб сам об этом предупреждает
  4. isequal и == в разных случаях показывают разную скорость, то один быстрее, то другой. Есть мнение, что это связано с (не)приведением типов
  5. Любой ввод-вывод в цикле вреден
  6. Счетчики в цикле нужно избегать
  7. удаление членов в больших массивов (связке с find) не так уж и быстро. Лучше не заполнять, чем удалять =)

Может, конечно, детский сад, но тем не менее


Оригинал: http://blog.dpetroff.ru/tech/matlab-optimization