GPU Coder™ поддерживает многие функции языка MATLAB®, поддержанные MATLAB Coder™, смотрите Функции языка MATLAB, Поддерживавшие для Генерации кода C/C++ (MATLAB Coder). Однако некоторые функции могут поддерживаться в ограниченном режиме и других, не поддержанных. В следующих разделах мы подсвечиваем некоторые важные функции, которые влияют на генерацию кода графического процессора и затем перечисляют функции что не поддерживаемый GPU Coder.
Общее и важное соображение является поддержкой матриц переменного размера. Эта функция может действительно влиять на способ, которым создаются ядра CUDA®, и следующее обсуждение описывает функцию и факторы для генерации кода графического процессора.
Для генерации кода измерением массива является fixed-size или variable-size. Если генератор кода может определить размер массива и что размер массива не изменяется во время выполнения, то размерность является фиксированным размером. Когда все размерности массива являются фиксированным размером, массив является массивом fixed-size. В следующем примере Z
является массивом фиксированного размера.
function Z = myfcn() Z = zeros(1,4); end
Если генератор кода не может определить размер массива, или генератор кода решает, что размер изменяется, то размерность является переменным размером. Когда по крайней мере одна из его размерностей является переменным размером, массив является массивом variable-size.
Размерностью переменного размера является или bounded или unbounded. Ограниченная размерность имеет фиксированный верхний размер. Неограниченная размерность не имеет фиксированного верхнего размера.
В следующем примере второе измерение 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])
.
Для получения дополнительной информации смотрите, Задают Данные Переменного Размера для Генерации кода (MATLAB Coder).
Для массивов переменного размера, которые ограничены, GPU Coder сопоставляет эти ограниченные переменные с графическим процессором, и ядра CUDA создаются. Чтобы задать верхние границы для массивов переменного размера, смотрите, Задают Верхние границы для Массивов Переменного Размера (MATLAB Coder).
Для неограниченного, массивов переменного размера и массивов переменного размера, размер которых больше, чем или равен порогу DynamicMemoryAllocation
, GPU Coder не сопоставляет эти переменные с графическим процессором, и ядра не создаются. Генератор кода выделяет память динамически на куче центрального процессора. GPU Coder выдает предупреждение для неограниченных переменных в журнале сборки и отчете генерации кода.
По умолчанию генератор кода собирается использовать динамическое выделение памяти для массивов переменного размера, размер которых больше, чем или равен порогу с пороговым значением 2 Гбайт. Изменить эти настройки:
В объекте настройки, набор DynamicMemoryAllocation
к Threshold
и DynamicMemoryAllocationThreshold
к неотрицательному целому числу.
В приложении GPU Coder, в настройках Memory, устанавливает Dynamic memory allocation на For arrays with max size at or above threshold
и Dynamic memory allocation threshold к неотрицательному целому числу.
Можно сказать, является ли массив фиксированным размером или переменным размером путем рассмотрения столбца Size вкладки Variables в отчете генерации кода.
Двоеточие (:) указывает, что размерность является переменным размером. Вопросительный знак (?) указывает, что размер неограничен. Например, размер 1 на:? указывает, что размер первой размерности является фиксированным размером 1, и размер второго измерения неограничен, переменный размер. Звездочка (*) указывает, что генератор кода произвел массив переменного размера, но размер массива не изменяется во время выполнения.
Чтобы сгенерировать эффективный автономный код для структур, необходимо задать и использовать структуры по-другому, чем вы обычно были бы при выполнении кода в среде MATLAB. Для генерации кода необходимо сначала создать скалярную версию шаблона структуры прежде, чем вырастить его в массив. Механизм логического вывода генерации кода использует тип этого скалярного значения как базовый тип массива. Чтобы сгенерировать автономный код для структур MATLAB, вы ограничиваетесь следующими операциями:
Задайте структуры как локальные и персистентные переменные присвоением и использованием функции struct
Индексируйте поля структуры с помощью записи через точку
Задайте входные параметры функции первичной или точки входа как структуры
Передайте структуры локальным функциям
Для получения дополнительной информации см. Определение Структуры для Генерации кода (MATLAB Coder).
GPU Coder генерирует более эффективный код, когда вы используете 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
Можно использовать любой из методов, описанных в Генерации кода при помощи Приложения GPU Coder, чтобы сгенерировать код CUDA для этого примера.
Следующий список содержит функции, которые в настоящее время не поддерживаются.
Проверки целостности памяти, смотрите Проверки на этапе выполнения Управления (MATLAB Coder).
Массив связан и проверки размерности.
Операторы break
.
Указатели на функцию поддерживаются только, когда задано в другой функции и не как параметр точки входа.
Анонимные функции поддерживаются только, когда задано в другой функции и не как параметр точки входа.
Классы MATLAB.