Применить функцию к каждому элементу массива на графическом процессоре
Примечание
Эта функция ведет себя аналогично MATLAB® функция arrayfun
, за исключением того, что оценка функции происходит на графическом процессоре, а не на центральном процессоре. Все необходимые данные, еще не установленные на графическом процессоре, перемещаются в память GPU. Функция MATLAB, переданная для оценки, компилируется и затем выполняется на графическом процессоре. Все выходные аргументы возвращаются как объекты gpuArray. Вы можете получить данные gpuArray, используя gather
функция.
применяет функцию B
= arrayfun(FUN
,A
)FUN
каждому элементу gpuArray A
. arrayfun
затем конкатенирует выходы FUN
в выходы gpuArray B
. B
- тот же размер, что и A
и B(i,j,...) = FUN(A(i,j,...))
. Входной параметр FUN
- указатель на функцию в функцию MATLAB, которая принимает один входной параметр и возвращает скалярное значение. FUN
вызывается столько раз, сколько есть элементов A
.
Вы не можете задать порядок, в котором arrayfun
вычисляет элементы B
или полагаться на то, что они выполняются в любом конкретном порядке.
применяется B
= arrayfun(FUN
,A1,...,An)FUN
элементам массивов A1,...,An
, так что B(i,j,...) = FUN(A1(i,j,...),...,An(i,j,...))
. Функция FUN
должен взять n
введите аргументы и верните скаляр. Несовпадающие размерности входов A1,...,An
все должны совпадать, или входы должны быть скалярными. Любые синглтонные размерности или скалярные входы виртуально тиражируются перед входом в функцию FUN
.
[B1,...,Bm] = arrayfun(
возвращает несколько выходных массивов FUN
,___)B1,...,Bm
когда функция FUN
возвращает m
выходные значения. arrayfun
вызывает FUN
каждый раз с таким количеством выходов, сколько есть в вызове, чтобы arrayfun
, то есть m
времени. Если вы звоните arrayfun
с большим количеством выходных аргументов, чем поддерживается FUN
MATLAB генерирует ошибку. FUN
может возвращать выходные аргументы с различными типами данных, но тип данных каждого выхода должен быть одинаковым каждый раз FUN
вызывается.
Первый звонок arrayfun
чтобы запустить конкретную функцию на графическом процессоре, существует некоторое служебное время для настройки функции для выполнения графического процессора. Последующие вызовы arrayfun
с той же функцией может запускаться быстрее.
Несовпадающие размерности входа массивов должны совпадать. Другими словами, соответствующие размерности аргументов A1,...,An
, должны быть равны друг другу или равны единице. Всякий раз, когда размерность входного массива является синглтоном (равно 1
), arrayfun
использует расширение синглтона. Массив виртуально реплицируется вдоль синглтонного измерения, чтобы соответствовать самому большому из других массивов в этой размерности. Когда размерность входного массива является синглтоном, и соответствующая размерность в другом массиве аргументов равняется нулю, arrayfun
фактически уменьшает размерность в одиночном тоне до 0
.
Каждая размерность массива выхода B
является таким же размером, как и самый большой из входных массивов в этой размерности для ненулевого размера или нули в противном случае. Следующий код показывает, как размерности размера 1
масштабируются вверх или вниз, чтобы соответствовать размеру соответствующей размерности в других аргументах.
R1 = rand(2,5,4,'gpuArray'); R2 = rand(2,1,4,3,'gpuArray'); R3 = rand(1,5,4,3,'gpuArray'); R = arrayfun(@(x,y,z)(x+y.*z),R1,R2,R3); size(R)
2 5 4 3
R1 = rand(2,2,0,4,'gpuArray'); R2 = rand(2,1,1,4,'gpuArray'); R = arrayfun(@plus,R1,R2); size(R)
2 2 0 4
Потому что операции, поддерживаемые arrayfun
являются строго элементарными, и каждый расчет каждого элемента выполняется независимо от других, накладываются определенные ограничения:
Входной и выходной массивы не могут изменить форму или размер.
Функции создания массивов, такие как rand
не поддерживает спецификации размеров. Массивы случайных чисел имеют независимые потоки для каждого элемента.
Как arrayfun
в MATLAB, матричная экспоненциальная степень, умножение и деление (^
, *
, /
, \
) выполняйте только поэлементные вычисления.
Операции, которые изменяют размер или форму входных или выходных массивов (cat
, reshape
, и так далее) не поддерживаются.
Индексация только для чтения (subsref
) и поддерживается доступ к переменным рабочей рабочей области родительской (внешней) функции из вложенных функций. Можно индексировать переменные, которые существуют в функции перед вычислением на графическом процессоре. Назначение или subsasgn
индексация этих переменных из вложенной функции не поддерживается. Пример поддерживаемого использования см. в разделе Операции Stencil на графическом процессоре.
Анонимные функции не имеют доступа к своей родительской рабочей области функции.
Перегрузка поддерживаемых функций не допускается.
Код не может вызвать скрипты.
Нет ans
переменная для хранения неназначенных результатов расчетов. Убедитесь, что явно присвойте переменным результаты всех вычислений.
Не поддерживаются следующие языковые функции: постоянные или глобальные переменные, parfor
, spmd
, switch
, и try
/ catch
.
Pcode-файлы не могут содержать вызов на arrayfun
с данными gpuArray.