exponenta event banner

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

Временные ограничения для сгенерированного кода

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

Общие рекомендации по написанию эффективного кода для генерации кода см. в документе MATLAB «Рекомендации по разработке кода для генерации кода» (MATLAB Coder).

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

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

Установка конфигурации кодера

Для установки конфигурации для генерации кода вызовите coder.config.

cfg = coder.config('mex');

Чтобы сэкономить время в созданном коде, отключите проверки целостности и проверьте целочисленную насыщенность. Решатели не полагаются на эти проверки для правильной работы, предполагая, что целевая функция и нелинейная функция ограничения не требуют их. Дополнительные сведения см. в разделе Контрольные проверки времени выполнения (кодер MATLAB).

cfg.IntegrityChecks = false;
cfg.SaturateOnIntegerOverflow = false;

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

cfg.DynamicMemoryAllocation = 'Off';

Можно повысить производительность кода, выбрав различные типы подпрограмм BLAS, лежащих в основе линейной алгебры. Сведения о настройке BLAS для сгенерированного кода см. в разделе Ускорение операций матрицы в сгенерированном автономном коде с помощью вызовов BLAS (MATLAB Coder). Если необходимо, чтобы встроенное приложение работало параллельно, необходимо предоставить библиотеки BLAS или LAPACK, поддерживающие параллельные вычисления в системе. Аналогично, при наличии параллельного аппаратного обеспечения можно повысить производительность кода путем настройки пользовательских вызовов LAPACK. См. раздел Ускорение линейной алгебры в сгенерированном автономном коде с помощью вызовов LAPACK (кодер MATLAB).

Сравнительный анализ решателя

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

Задать начальную точку

Одним из наиболее важных факторов, влияющих как на время выполнения, так и на качество решения, является начальная точка оптимизации. x0. Когда параметры медленно изменяются между вызовами решателя, решение из предыдущего вызова обычно является хорошей отправной точкой для следующего вызова. См. раздел Follow Equation Solution as a Parameter Changes, который также показывает, как может произойти скачок времени решения, поскольку решение переключает бассейны притяжения.

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

Задать опции соответствующим образом

Иногда можно ускорить решение, настроив параметры. Если установить 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.

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

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

См. также

| | | (кодер MATLAB)

Связанные темы