Графический процессор Coder™ поддерживает многие языковые функции MATLAB ®, поддерживаемые MATLAB Coder™, см. раздел Языковые функции MATLAB, поддерживаемые для генерации кода C/C + +. Однако некоторые функции могут поддерживаться в ограниченном режиме, а другие не поддерживаются. В следующих разделах мы выделяем некоторые важные функции, влияющие на формирование кода графического процессора, а затем перечисляем функции, которые не поддерживаются кодером графического процессора.
Общим и важным соображением является поддержка матриц переменного размера. Эта функция действительно может повлиять на способ создания ядер CUDA ®, и в следующем обсуждении описываются функции и соображения по созданию кода графического процессора.
Для генерации кода измерение массива имеет фиксированный или переменный размер. Если генератор кода может определить размер массива и размер массива не изменяется во время выполнения, то размер является фиксированным. Когда все размеры массива имеют фиксированный размер, массив является массивом фиксированного размера. В следующем примере: Z является массивом фиксированного размера.
function Z = myfcn() Z = zeros(1,4); end
Если генератор кода не может определить размер массива или генератор кода определяет, что размер изменяется, то размер является переменным размером. Если хотя бы одно из его измерений имеет переменный размер, массив является массивом переменного размера.
Размер переменного размера ограничен или не ограничен. Ограниченный размер имеет фиксированный верхний размер. Неограниченный размер не имеет фиксированного верхнего размера.
В следующем примере второй размер Z имеет ограниченный переменный размер. Имеет верхнюю границу 32.
function s = myfcn(n) if (n > 0) Z = zeros(1,4); else Z = zeros(1,32); end s = length(Z);
В следующем примере, если значение n неизвестно во время компиляции, то второе измерение Z является неограниченным.
function s = myfcn(n) Z = rand(1,n); s = sum(Z); end
Массивы переменного размера можно определить следующим образом:
Использование конструкторов, таких как zeros или ones, с непостоянным значением размера
Назначение нескольких постоянных размеров одной переменной перед ее использованием
Использование циклов для увеличения размеров переменных
Объявление всех экземпляров переменной переменным размером с помощью coder.typeof или coder.varsize функции. Например, coder.typeof(1, [12,1],[true, false]) и coder.varsize(1, [Inf,1], [true, false]).
Дополнительные сведения см. в разделе Определение данных переменного размера для создания кода.
Для массивов переменного размера, которые ограничены, кодер GPU сопоставляет эти ограниченные переменные с ядрами GPU и CUDA создаются. Чтобы задать верхние границы для массивов переменного размера, см. раздел Задание верхних границ для массивов переменного размера.
Для неограниченных массивов переменного размера и массивов переменного размера, размер которых больше или равен DynamicMemoryAllocation пороговое значение, кодер GPU не сопоставляет эти переменные графическому процессору, и ядра не создаются. Генератор кода динамически распределяет память в куче ЦП. Кодер графического процессора выдает предупреждение для неограниченных переменных в журнале сборки и отчете о создании кода.
По умолчанию генератор кода настроен на использование динамического выделения памяти для массивов переменного размера, размер которых больше или равен порогу с пороговым значением 2 ГБ. Чтобы изменить эти параметры, выполните следующие действия.
В объекте конфигурации установите DynamicMemoryAllocation кому Threshold и DynamicMemoryAllocationThreshold в неотрицательное целое число.
В приложении Кодер графического процессора в разделе Параметры памяти установите значение Динамическое выделение памяти For arrays with max size at or above threshold и порог динамического выделения памяти неотрицательному целому числу.
Определить, является массив фиксированным размером или переменным размером, можно в столбце Размер (Size) вкладки Переменные (Variables) отчета о создании кода.

Двоеточие (:) указывает, что размер имеет переменный размер. Знак вопроса (?) указывает, что размер неограничен. Например, размер 1-по-:? указывает, что размер первого измерения фиксированный размер 1, а размер второго измерения неограниченный переменный размер. Звездочка (*) указывает, что генератор кода создал массив переменного размера, но размер массива не изменяется во время выполнения.

Для создания эффективного автономного кода для структур необходимо определить и использовать структуры иначе, чем обычно при выполнении кода в среде MATLAB. Для создания кода необходимо сначала создать скалярную шаблонную версию структуры, прежде чем наращивать ее в массив. Механизм вывода генерации кода использует тип этого скалярного значения в качестве базового типа массива. Для создания автономного кода для структур MATLAB доступны только следующие операции:
Определите структуры как локальные и постоянные переменные путем присвоения и использования struct функция
Индексировать поля структуры с помощью точечной нотации
Определение вводов основной или начальной функции в виде структур
Передача структур локальным функциям
Дополнительные сведения см. в разделе Определение структуры для создания кода.
Примечание
Кодер графического процессора создает более эффективный код при использовании структуры массивов вместо массива структур.
В этом примере показано, как записать функцию MATLAB, использующую массивы структуры, чтобы она подходила для генерации кода. Сначала необходимо указать базовый элемент с помощью struct функция.
tempS = struct('a',0,'b',0); numE = 2000; AofS = repmat(tempS,numE,1);
В MATLAB при построении структурного массива обычно добавляются поля. Этот «динамический» стиль строительных конструкций не поддерживается при создании кода. Одна из причин заключается в том, что в MATLAB возможно наличие различных полей структуры для двух различных элементов структурного массива, что противоречит более статичному подходу вывода типа. Поэтому сначала необходимо указать базовый скалярный элемент, а затем из этого полностью заданного элемента создать структурный массив. Этот метод гарантирует, что два элемента структурного массива всегда совместно используют тип (поля).
for ind = 1:numE AofS(ind).a = rand; AofS(ind).b = rand; end
Теперь можно определить функцию точки входа mStructSupport для этого требуется AofS в качестве входных данных. Локальная функция arrayOp удваивается AofS.b и сохраняет результат в AofS.a.
function [V] = mStructSupport(AofS) V = arrayOp(AofS); end function AofS = arrayOp(AofS) n = numel(AofS); for i = 1:n AofS(i).a = AofS(i).b * 2; end end
Для создания кода CUDA в данном примере можно использовать любой из методов, описанных в разделе Создание кода с помощью приложения кодера GPU.
Следующий список содержит функции, которые в настоящее время не поддерживаются.
Проверка целостности памяти, см. раздел Контрольные проверки времени выполнения.
Проверка границ массива и размерности.
break заявления.
Дескрипторы функций поддерживаются только в том случае, если они определены в другой функции, а не в качестве параметра точки входа.
Анонимные функции поддерживаются только в том случае, если они определены в другой функции, а не в качестве параметра точки входа.
Классы MATLAB.