Генерация кода оптимизации для приложений реального времени

Ограничения по времени на сгенерированном коде

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

Для общих рекомендаций по записи эффективного кода для генерации кода смотрите Конструктивные соображения кода MATLAB для Генерации кода (MATLAB Coder).

Совпадайте с целевым окружением

Чтобы оценить время выполнения сгенерированного кода перед генерацией кода, установите свою среду MATLAB® совпадать с целевым окружением максимально тесно.

Установите настройку кодера

Чтобы установить настройку для генерации кода, вызовите 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.

Глобальный минимум

Вы можете хотеть глобальный минимум, не только локальный минимум, как решение. Поиск глобального минимума может занять много времени и, как гарантируют, не будет работать. Для предложений смотрите Поиск Меньшего Минимума.

Смотрите также

| | |

Похожие темы