В этом примере показано, как использовать упорядоченные по строкам алгоритмы, чтобы сгенерировать эффективный код. Можно позволить алгоритмам Использования, оптимизированным для упорядоченного по строкам параметра конфигурации размещения массивов включить эффективные упорядоченные по строкам алгоритмы, которые оптимизированы для упорядоченного по строкам размещения массивов. Код, который вы генерируете при помощи упорядоченных по строкам алгоритмов, выполняет с лучшей скоростью и эффективным использованием памяти при работе с данными с упорядоченным по строкам размещением массивов.
В этом примере вы работаете с упорядоченными по строкам данными первым использованием упорядоченных по столбцам алгоритмов по умолчанию и затем использованием упорядоченных по строкам алгоритмов. Это сравнение помогает в идентификации соответствующих настроек алгоритма достигнуть различных требований.
Откройте модель ex_rowmajor_algorithm
в качестве примера.
model = 'ex_rowmajor_algorithm';
open_system(model);
Модель содержит блок Sum of Elements, и вход блока является массивом. По умолчанию Simulink конфигурирует модель с упорядоченными по столбцам алгоритмами и упорядоченным по столбцам размещением массивов. В этом примере вы конфигурируете размещение массивов этой модели как упорядоченное по строкам. Чтобы задать размещение массивов, откройте приложение Embedded Coder, и затем откройте диалоговое окно Configuration Parameters. На Генерации кода> Интерфейсная панель, набор размещение параметра конфигурации Массивов к Row-Major
опция. В качестве альтернативы в командном окне MATLAB, введите:
set_param(model,'ArrayLayout','Row-major');
Измените свою текущую папку в MATLAB к перезаписываемой папке. Затем сгенерируйте код из модели при помощи slbuild
функционируйте или путем нажатия Ctrl+B.
currentDir = pwd; [~,cgDir] = rtwdemodir(); % Generate code and capture the code generation information to Value Value=evalc('slbuild(''ex_rowmajor_algorithm'')');
Смотрите сгенерированный ex_rowmajor_algorithm_step
ступенчатая функция в ex_rowmajor_algorithm.c
.
file = fullfile('ex_rowmajor_algorithm_ert_rtw','ex_rowmajor_algorithm.c'); rtwdemodbtype(file,'/* Model step function */','/* Model initialize function',1,1);
/* Model step function */ void ex_rowmajor_algorithm_step(void) { int32_T i; int32_T i_0; int32_T tmp; /* Sum: '<Root>/Sum of Elements Dim1' incorporates: * Constant: '<Root>/Constant1' */ ex_rowmajor_algorithm_Y.Out2 = -0.0F; for (i = 0; i < 2; i++) { for (i_0 = 0; i_0 < 3; i_0++) { tmp = (i_0 << 1) + i; ex_rowmajor_algorithm_Y.Out2 = (((ex_rowmajor_algorithm_ConstP.Constant1_Value[tmp] + ex_rowmajor_algorithm_Y.Out2) + ex_rowmajor_algorithm_ConstP.Constant1_Value[tmp + 6]) + ex_rowmajor_algorithm_ConstP.Constant1_Value[tmp + 12]) + ex_rowmajor_algorithm_ConstP.Constant1_Value[tmp + 18]; } } /* End of Sum: '<Root>/Sum of Elements Dim1' */ }
Когда размещение Массивов установлено в Row-major
и алгоритмы Использования, оптимизированные для упорядоченного по строкам параметра конфигурации размещения массивов, установлены в off
, генератор кода использует упорядоченные по столбцам алгоритмы. Алгоритмы пересекают данные в порядке развертывания по столбцам, хотя данные находятся в упорядоченном по строкам порядке. Этот процесс требует некоторых дополнительных операций в сгенерированном коде, который делает код менее эффективным, но в то же время приводит к более высокой точности числовых результатов. Если вам нужна более высокая точность числовых результатов, где менее эффективный код не является беспокойством, рекомендуется, чтобы вы использовали упорядоченные по столбцам алгоритмы для упорядоченного по строкам размещения массивов.
Чтобы включить упорядоченные по строкам алгоритмы, на панели Math & Data Types, выбирают алгоритмы Использования параметра конфигурации, оптимизированные для упорядоченного по строкам флажка размещения массивов. Этот параметр включает алгоритмы, которые оптимизированы для упорядоченного по строкам размещения массивов. В качестве альтернативы в командном окне MATLAB, введите:
set_param(model,'UseRowMajorAlgorithm','on');
После включения упорядоченных по строкам алгоритмов сгенерируйте код.
Value=evalc('slbuild(''ex_rowmajor_algorithm'')');
Смотрите сгенерированный ex_rowmajor_algorithm_step
ступенчатая функция в ex_rowmajor_algorithm.c
.
file = fullfile('ex_rowmajor_algorithm_ert_rtw','ex_rowmajor_algorithm.c'); rtwdemodbtype(file,'/* Model step function */','/* Model initialize function',1,1);
/* Model step function */ void ex_rowmajor_algorithm_step(void) { int32_T i; /* Sum: '<Root>/Sum of Elements Dim1' incorporates: * Constant: '<Root>/Constant1' */ ex_rowmajor_algorithm_Y.Out2 = -0.0F; for (i = 0; i < 24; i++) { ex_rowmajor_algorithm_Y.Out2 += ex_rowmajor_algorithm_ConstP.Constant1_Value[i]; } /* End of Sum: '<Root>/Sum of Elements Dim1' */ }
По сравнению с предыдущим кодом, когда размещение Массивов установлено в Row-major
и алгоритмы Использования, оптимизированные для упорядоченного по строкам параметра конфигурации размещения массивов, установлены в on
, генератор кода генерирует эффективный код. Генератор кода использует упорядоченные по строкам алгоритмы, которые пересекают данные в упорядоченном по строкам порядке, который сокращает количество операций в сгенерированном коде. Но точность числовых результатов не может быть настолько же высокой как предыдущий пример. Так, вы можете испытать незначительные числовые различия в выходе упорядоченных по столбцам и упорядоченных по строкам алгоритмов. Если вам нужен эффективный код, где числовая точность не является беспокойством, рекомендуется, чтобы вы использовали упорядоченные по строкам алгоритмы для упорядоченного по строкам размещения массивов.