exponenta event banner

Отключить нефинитные проверки или вложение для математических функций

Когда генератор кода создает код для математических функций:

  • Если выбрана опция Модель (model) Поддерживать неграничные числа (Support non-finite number), проверка нефиксированных чисел генерируется равномерно для математических функций без возможности указать, что проверка нефиксированных чисел должна создаваться для одних функций, но не для других.

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

Записи настройки библиотеки замены кода (CRL) можно использовать для:

  • Выборочно отключать нефинитные проверки математических функций. Это может повысить скорость выполнения сгенерированного кода.

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

К функциям, для которых поддерживаются эти настройки, относятся следующие:

  • Только с плавающей запятой: atan2, copysign, fix, hypot, log, log10, round, sincos, и sqrt

  • Плавающая точка и целое число: abs, max, min, mod, rem, saturate, и sign

Общий рабочий процесс для отключения проверки и/или встраивания нефиксированных номеров выглядит следующим образом:

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

    function hTable = crl_table_customization
        
    % Create an instance of the Code Replacement Library table for controlling
    % function intrinsic inlining and nonfinite support
    
    hTable = RTW.TflTable;
    
    % Inline - true (if function needs to be inline)
    %          false (if function should not be inlined)
    % SNF (support nonfinite) - ENABLE (if non-finite checking should be performed)
    %                           DISABLE (if non-finite checking should NOT be performed)
    %                           UNSPECIFIED (Default behavior)
    
    % registerCustomizationEntry(hTable, ...
    %       Priority, numInputs, key, inType, outType, Inline, SNF);
    
    registerCustomizationEntry(hTable, ...
            100, 2, 'atan2', 'double', 'double', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'atan2', 'single', 'single', false, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'sincos', 'double', 'double', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sincos', 'single', 'single', false, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'abs', 'double', 'double', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'abs', 'single', 'single', true, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'abs', 'int32',  'int32',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'abs', 'int16',  'int16',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'abs', 'int8',   'int8',   true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'abs', 'integer','integer',true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'abs', 'uint32', 'uint32', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'abs', 'uint16', 'uint16', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'abs', 'uint8',  'uint8',  true, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 2, 'hypot', 'double', 'double', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'hypot', 'single', 'single', false, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'log', 'double', 'double', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'log', 'single', 'double', false, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'log10', 'double', 'double', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'log10', 'single', 'double', false, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 2, 'min', 'double', 'double', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'min', 'single', 'single', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'min', 'int32',  'int32',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'min', 'int16',  'int16',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'min', 'int8',   'int8',   true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'min', 'uint32', 'uint32', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'min', 'uint16', 'uint16', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'min', 'uint8',  'uint8',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'min', 'integer','integer',true, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 2, 'max', 'double', 'double', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'max', 'single', 'single', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'max', 'int32',  'int32',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'max', 'int16',  'int16',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'max', 'int8',   'int8',   true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'max', 'uint32', 'uint32', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'max', 'uint16', 'uint16', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'max', 'uint8',  'uint8',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'max', 'integer','integer',true, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 2, 'mod', 'double', 'double', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'mod', 'single', 'single', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'mod', 'int32',  'int32',  false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'mod', 'int16',  'int16',  false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'mod', 'int8',   'int8',   false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'mod', 'uint32', 'uint32', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'mod', 'uint16', 'uint16', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'mod', 'uint8',  'uint8',  false, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 2, 'rem', 'double', 'double', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'rem', 'single', 'single', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'rem', 'int32',  'int32',  false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'rem', 'int16',  'int16',  false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'rem', 'int8',   'int8',   false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'rem', 'uint32', 'uint32', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'rem', 'uint16', 'uint16', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'rem', 'uint8',  'uint8',  false, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'round', 'double', 'double', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'round', 'single', 'single', false, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 3, 'saturate', 'double', 'double', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 3, 'saturate', 'single', 'single', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 3, 'saturate', 'int32',  'int32',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 3, 'saturate', 'int16',  'int16',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 3, 'saturate', 'int8',   'int8',   true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 3, 'saturate', 'uint32', 'uint32', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 3, 'saturate', 'uint16', 'uint16', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 3, 'saturate', 'uint8',  'uint8',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 3, 'saturate', 'integer','integer',true, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'sign', 'double', 'double',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sign', 'single', 'single',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sign', 'int32',  'integer', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sign', 'int16',  'integer', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sign', 'int8',   'integer', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sign', 'uint32', 'uint32',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sign', 'uint16', 'uint16',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sign', 'uint8',  'uint8',   true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sign', 'integer','integer', true, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'sqrt', 'double', 'double', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sqrt', 'single', 'single', true, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'fix', 'double', 'double', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'fix', 'single', 'single', false, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'copysign', 'double', 'double', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'copysign', 'single', 'single', true, 'UNSPECIFIED');
  2. Чтобы уменьшить размер файла, можно удалить registerCustomizationEntry строки для функций, для которых допустимо поведение по умолчанию при проверке и вложении нефинитных номеров.

  3. Для каждой оставшейся записи,

    • Установите Inline аргумент для true если функция должна быть встроена или false если он не должен быть встроен.

    • Установите SNF аргумент для ENABLE если должна быть сформирована нефинитная проверка, DISABLE если не должна быть создана проверка нефинитов, или UNSPECIFIED принятие поведения по умолчанию на основе настроек опций модели.

    Сохраните файл.

  4. При необходимости выполните быструю проверку синтаксической достоверности записей таблицы настройки путем вызова файла определения таблицы в командной строке MATLAB (>> tbl = crl_table_customization). Исправьте отмеченные синтаксические ошибки.

  5. При необходимости просмотрите записи таблицы настройки в средстве просмотра замены кода (>> crviewer(crl_table_customization)). Дополнительные сведения о просмотре таблиц замены кода см. в разделе Выбор библиотеки замены кода.

  6. Чтобы зарегистрировать эти изменения и сделать их доступными в раскрывающемся списке Библиотека замены кода (Code replacement library), расположенном на панели Создание кода (Code Generation) > Интерфейс (Interface) диалогового окна Параметры конфигурации (Configuration Parameters), сначала скопируйте следующий код функции MATLAB в экземпляр файла. rtwTargetInfo.m.

    Примечание

    В приведенном ниже примере укажите аргумент 'RTW' если для модели выбран целевой объект GRT, в противном случае опустите аргумент.

    function rtwTargetInfo(cm)
    % rtwTargetInfo function to register a code replacement library (CRL)
    
      % Register the CRL defined in local function locCrlRegFcn
      cm.registerTargetInfo(@locCrlRegFcn);
    
    end % End of RTWTARGETINFO
    
    
    % Local function to define a CRL containing crl_table_customization
    function thisCrl = locCrlRegFcn
    
      % Instantiate a CRL registry entry - specify 'RTW' for GRT
      thisCrl = RTW.TflRegistry('RTW');
    
      % Define the CRL properties
      thisCrl.Name = 'CRL Customization Example';
      thisCrl.Description = 'Example  of CRL Customization';
      thisCrl.TableList = {'crl_table_customization'};
      thisCrl.TargetHWDeviceType = {'*'};
      
    end % End of LOCCRLREGFCN

    Вы можете редактировать Name для указания имени библиотеки, которое отображается в раскрывающемся списке Библиотека замены кода. Кроме того, имя файла в TableList поле должно соответствовать имени файла, созданного на шаге 1.

    Для регистрации изменений в обоих созданных файлах MATLAB введите следующую команду в командной строке MATLAB:

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

  8. Откройте диалоговое окно Configuration Parameters, перейдите на панель Code Generation > Interface и используйте раскрывающийся список Code replacement library для выбора записи замены кода, зарегистрированной на шаге 6, например: CRL Customization Example.

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