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

Временные пределы на сгенерированный код

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

Общие рекомендации по написанию эффективного кода для генерации кода см. КОД MATLAB Проекта Факторов для Code Generation (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, в цикле 1000 вычислений с помощью набора входа параметров, который типичен для вашего приложения. Найдите как общее время, так и максимальное время оценки. Попробуйте параметры, которые, по вашему мнению, могут привести к тому, что решатель займет слишком много времени, и протестируйте их и другие параметры. Если приложение 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 Background или Генерацию кода для quadprog Background.

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

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

См. также

| | | (MATLAB CODER)

Похожие темы