Встраиваемые приложения могут иметь требования, которые ограничивают, сколько времени код может запуститься прежде, чем дать ответ. Такие требования могут быть проблематичными, потому что решатели не дают гарантий времени оптимизации. Эта тема обрисовывает в общих чертах методы для оценки, сколько времени ваш встроенный код запустится прежде, чем возвратить результат и описывает изменения, которые можно внести в код, чтобы сократить требование времени.
Для общих рекомендаций по записи эффективного кода для генерации кода смотрите Конструктивные соображения кода MATLAB для Генерации кода (MATLAB Coder).
Чтобы оценить время выполнения сгенерированного кода перед генерацией кода, установите свой MATLAB® среда, чтобы совпадать с целевым окружением максимально тесно.
Проверяйте тактовые частоты своего целевого компьютера и своего компьютера. Масштабируйтесь ваше сравнительное тестирование заканчивается соответственно.
Установите maxNumCompThreads
в MATLAB к 1, потому что библиотеки LAPACK и BLAS по умолчанию, сгенерированные MATLAB Coder™, являются однопоточными.
lastN = maxNumCompThreads(1);
После того, как вы закончили тестировать в сравнении с эталоном, сбрасываете maxNumCompThreads
значение:
N = maxNumCompThreads(lastN); % Alternatively, % N = maxNumCompThreads('automatic');
Примечание
Если ваш целевой компьютер имеет несколько ядер, и вы пользуетесь пользовательскими многопоточными библиотеками LAPACK и BLAS, то установленный maxNumCompThreads
к количеству потоков на целевом компьютере. Смотрите Ускоряют Линейную алгебру в Сгенерированном Автономном Коде при помощи Вызовов LAPACK (MATLAB Coder).
Если у вас есть Embedded Coder® лицензия, смотрите эти темы для получения дополнительной информации о надежных способах оценить получившуюся эффективность вашего встроенного кода: Ускорьте Линейную алгебру в Коде, Сгенерированном от блока MATLAB function (Embedded Coder), Ускорьте Матричные операции в Коде, Сгенерированном от блока MATLAB function (Embedded Coder), Верификация (Embedded Coder) и Эффективность (Embedded Coder).
Чтобы установить настройку для генерации кода, вызовите coder.config
.
cfg = coder.config('mex');
Чтобы сэкономить время в сгенерированном коде, выключите проверки целостности и проверки на целочисленное насыщение. Решатели не используют эти проверки, чтобы функционировать правильно, принимая, что целевая функция и нелинейная ограничительная функция не требуют их. Для получения дополнительной информации смотрите Проверки на этапе выполнения Управления (MATLAB Coder).
cfg.IntegrityChecks = false; cfg.SaturateOnIntegerOverflow = false;
Как правило, сгенерированный код запускается быстрее при использовании выделения статического ЗУ, несмотря на то, что это выделение может увеличить сумму сгенерированного кода. Кроме того, некоторое оборудование не поддерживает динамическое выделение памяти. Чтобы использовать выделение статического ЗУ, задайте эту установку.
cfg.DynamicMemoryAllocation = 'Off';
Можно улучшать производительность кода путем выбора различных типов BLAS, базовых подпрограмм линейной алгебры. Чтобы изучить, как установить BLAS для вашего сгенерированного кода, смотрите, Ускоряют Матричные операции в Сгенерированном Автономном Коде при помощи Вызовов BLAS (MATLAB Coder). Если вы хотите, чтобы встраиваемое приложение запустилось параллельно, необходимо предоставить библиотеки BLAS или LAPACK, которые поддерживают параллельный расчет в системе. Точно так же, когда у вас есть параллельное оборудование, можно улучшать производительность кода путем установки пользовательских вызовов LAPACK. Смотрите Ускоряют Линейную алгебру в Сгенерированном Автономном Коде при помощи Вызовов LAPACK (MATLAB Coder).
Запустите свой сгенерированный код MEX в цикле 1 000 оценок с помощью набора входных параметров, который типичен для приложения. Найдите и общее время и максимум времен оценки. Попробуйте параметры, что вы думаете, может заставить решатель занимать слишком много времени, и тестировать их и другие параметры. Если приложение MEX возвратит удовлетворительные результаты в соответствующее время, то можно ожидать, что развертываемое приложение сделает то же самое.
Одним из наиболее важных факторов, влияющих и на время выполнения и на качество решения, является начальная точка для оптимизации x0
. Когда параметры медленно изменяются между вызовами решателя, решение от предыдущего вызова обычно является хорошей начальной точкой для следующего вызова. Смотрите Следуют за Решением для уравнения как за параметром Изменения, который также показывает, как скачок во время решения может произойти, потому что решение переключает Области притяжения.
Если ваша задача оптимизации не имеет параметров, изменяющихся медленно, и включает только несколько контрольных переменных, то попытка оценить ответ из предыдущих решений может стоить. Создайте модель решения в зависимости от параметров, или как квадратичное в параметрах или как низко-размерная интерполяция, и используйте предсказанную точку решения в качестве начальной точки для решателя.
Можно иногда ускорять решение путем корректировки параметров. Если вы устанавливаете MaxIterations
опция, чтобы позволить только несколько итераций, затем решатель останавливается быстро. Например, если решатель fmincon
, введите этот код.
opts = optimoptions('fmincon','Algorithm','sqp','MaxIterations',50); [x,fval,exitflag] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
Однако результат может быть далек от оптимума. Убедитесь, что неточный результат не чрезмерно воздействует на вашу систему. Установите MaxIterations
как можно больше, все еще соответствуя вашему ограничению времени. Можно оценить это значение путем измерения, сколько времени итерация берет, или путем измерения, сколько времени вычисление функции берет, и затем любая установка MaxFunctionEvaluations
опция или MaxIterations
опция. Для примера смотрите Генерацию кода для Основ Оптимизации.
Для дальнейших предложений на настройках, которые могут ускорить решатель, смотрите, что Решатель Занимает слишком много времени. Обратите внимание на то, что некоторые предложения в этой теме не применяются из-за ограничений в генерации кода. Смотрите Генерацию кода в fmincon Фоне или Генерацию кода для quadprog Фона.
Вы можете хотеть глобальный минимум, не только локальный минимум, как решение. Поиск глобального минимума может занять много времени и, как гарантируют, не будет работать. Для предложений смотрите Поиск Меньшего Минимума.
fmincon
| codegen
(MATLAB Coder) | optimoptions
| quadprog