GPU Coder™ поддерживает многий из MATLAB® функции языка, поддерживавшие MATLAB Coder™, смотрите Функции языка MATLAB, Поддерживавшие для Генерации кода C/C++. Однако некоторые функции могут поддерживаться в ограниченном режиме и других, не поддержанных. В следующих разделах мы подсвечиваем некоторые важные функции, которые влияют на генерацию кода графического процессора и затем перечисляют функции что не поддерживаемый 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])
.
Для получения дополнительной информации смотрите, Задают Данные Переменного Размера для Генерации кода.
Для массивов переменного размера, которые ограничены, GPU Coder сопоставляет эти ограниченные переменные с графическим процессором, и ядра CUDA создаются. Чтобы задать верхние границы для массивов переменного размера, смотрите, Задают Верхние границы для Массивов Переменного Размера.
Для неограниченного, массивов переменного размера и массивов переменного размера, размер которых больше или равен 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
функция
Индексируйте поля структуры с помощью записи через точку
Задайте входные параметры функции первичной или точки входа как структуры
Передайте структуры локальным функциям
Для получения дополнительной информации см. Определение Структуры для Генерации кода.
Примечание
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 для этого примера.
Следующий список содержит функции, которые в настоящее время не поддерживаются.
Проверки целостности памяти, смотрите Проверки на этапе выполнения Управления.
Массив связан и проверки размерности.
break
операторы.
Указатели на функцию поддерживаются только, когда задано в другой функции и не как параметр точки входа.
Анонимные функции поддерживаются только, когда задано в другой функции и не как параметр точки входа.
Классы MATLAB.