У встраиваемых приложений могут быть требования, ограничивающие продолжительность выполнения кода перед возвратом ответа. Такие требования могут быть проблематичны, потому что решатели не дают временных гарантий оптимизации. В этом разделе описываются методы оценки продолжительности выполнения внедренного кода перед возвращением результата, а также изменения, которые можно внести в код для сокращения времени.
Общие рекомендации по написанию эффективного кода для генерации кода см. в документе MATLAB «Рекомендации по разработке кода для генерации кода» (MATLAB Coder).
Чтобы оценить время выполнения сгенерированного кода перед созданием кода, настройте среду MATLAB ® так, чтобы она максимально соответствовала целевой среде.
Проверьте тактовую частоту целевого оборудования и компьютера. Выполните соответствующее масштабирование результатов бенчмаркинга.
Набор maxNumCompThreads в MATLAB to 1, поскольку библиотеки LAPACK и BLAS по умолчанию, созданные Coder™ MATLAB, являются однопоточными.
lastN = maxNumCompThreads(1);
После завершения бенчмаркинга сбросьте maxNumCompThreads значение:
N = maxNumCompThreads(lastN); % Alternatively, % N = maxNumCompThreads('automatic');
Примечание
Если целевое оборудование имеет несколько ядер и используются пользовательские многопоточные библиотеки LAPACK и BLAS, установите maxNumCompThreads к числу потоков на целевом оборудовании. См. раздел Ускорение линейной алгебры в сгенерированном автономном коде с помощью вызовов LAPACK (кодер MATLAB).
Если у вас есть лицензия Embedded Coder ®, см. эти разделы для получения подробной информации о надежных способах оценки результирующей производительности встроенного кода: Ускорение линейной алгебры в коде, сгенерированном из функционального блока MATLAB (Embedded Coder), Ускорение операций матрицы в коде, сгенерированном из функционального блока MATLAB (Embedded Coder),
Для установки конфигурации для генерации кода вызовите 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.
В качестве решения может потребоваться глобальный минимум, а не только локальный минимум. Поиск глобального минимума может занять много времени и не гарантированно работать. Рекомендации см. в разделе Поиск минимального размера.
fmincon | optimoptions | quadprog | codegen (кодер MATLAB)