У встраиваемых приложений могут быть требования, которые ограничивают продолжительность выполнения кода перед возвращением ответа. Такие требования могут быть проблематичными, потому что решатели не дают временных гарантий для оптимизации. В этой теме описываются методы оценки того, как долго ваш встроенный код будет запускаться перед возвращением результата, и описываются изменения, которые вы можете внести в ваш код, чтобы сократить временные требования.
Общие рекомендации по написанию эффективного кода для генерации кода см. КОД MATLAB Проекта Факторов для Code Generation (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, в цикле 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.
В качестве решения может потребоваться глобальный минимум, а не только локальный минимум. Поиск глобального минимума может занять много времени, и не гарантировано работать. Предложения см. в разделе Поиск меньшего минимума.
fmincon
| optimoptions
| quadprog
| codegen
(MATLAB CODER)