arrayfun

Применить функцию к каждому элементу массива на графическом процессоре

Описание

пример

Примечание

Эта функция ведет себя аналогично 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 с большим количеством выходных аргументов, чем поддерживается FUNMATLAB генерирует ошибку. FUN может возвращать выходные аргументы с различными типами данных, но тип данных каждого выхода должен быть одинаковым каждый раз FUN вызывается.

Примеры

свернуть все

В этом примере небольшая функция применяет данные коррекции к массиву данных измерений. Функция, заданная в файле myCal.m показан здесь.

function c = myCal(rawdata, gain, offset)
    c = (rawdata .* gain) + offset;
end

Функция выполняет только поэлементные операции при применении коэффициента усиления и смещения к каждому элементу rawdata массив.

Создайте номинальное измерение.

meas = ones(1000)*3; % 1000-by-1000 matrix

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

gn   = rand(1000,'gpuArray')/100 + 0.995; 
offs = rand(1000,'gpuArray')/50  - 0.01;

Запустите функцию калибровки на графическом процессоре.

corrected = arrayfun(@myCal,meas,gn,offs);

Функция запускается на графическом процессоре, потому что входные параметры gn и offs уже находятся в памяти графический процессор. Массив входа meas преобразуется в gpuArray перед запусками функции.

Извлеките исправленные результаты из графического процессора в рабочее пространство MATLAB.

results = gather(corrected);

Вы можете задать функцию MATLAB следующим образом.

function [o1,o2] = aGpuFunction(a,b,c)
    o1 = a + b;
    o2 = o1 .* c + 2;
end

Оцените эту функцию на графическом процессоре.

s1 = rand(400,'gpuArray');
s2 = rand(400,'gpuArray');
s3 = rand(400,'gpuArray');
[o1,o2] = arrayfun(@aGpuFunction,s1,s2,s3);
whos
 Name        Size         Bytes  Class

  o1        400x400          108  gpuArray
  o2        400x400          108  gpuArray
  s1        400x400          108  gpuArray
  s2        400x400          108  gpuArray
  s3        400x400          108  gpuArray
Use gather to retrieve the data from the GPU to the MATLAB

Использование gather для извлечения данных из графического процессора в рабочее пространство MATLAB.

d = gather(o2);

Функция myfun.m генерирует и использует случайное число R.

function Y = myfun(X)
    R = rand();
    Y = R.*X;
end

Если вы используете arrayfun чтобы запустить эту функцию с входной переменной, которая является gpuArray, функция запускается на графическом процессоре. Размер X определяет количество генерируемых случайных элементов. Следующий код проходит матрицу gpuArray G на myfun на графическом процессоре.

G = 2*ones(4,4,'gpuArray')
H = arrayfun(@myfun, G)

Потому что G является gpuArray 4 на 4, myfun генерирует 16 элементов скаляра случайных значений для R, по одному для каждого вычисления с элементом G.

Входные параметры

свернуть все

Функция для применения к элементам входных массивов, заданная как указатель на функцию. FUN должен возвращать скалярные значения. Для каждого выходного аргумента, FUN должен возвращать значения одного и того же класса каждый раз, когда он вызывается. FUN должен принимать числовые или логические входные данные.

FUN должен быть указателем на функцию, записанную на языке MATLAB. Вы не можете задать FUN как указатель на MEX-функцию.

FUN может содержать следующие встроенные функции и операторы MATLAB.

abs
and
acos
acosh
acot
acoth
acsc
acsch
asec
asech
asin
asinh
atan
atan2
atanh
beta
betaln
bitand
bitcmp
bitget
bitor
bitset
bitshift
bitxor
cast
ceil
complex
conj
cos
cosh
cot
coth
csc
csch
double
eps
eq
erf
erfc
erfcinv
erfcx
erfinv
exp
expm1
false
fix
floor
gamma
gammaln
ge
gt
hypot
imag
Inf
int8
int16
int32
int64
intmax
intmin
isfinite
isinf
isnan
ldivide
le
log
log2
log10
log1p
logical
lt
max
min
minus
mod
NaN
ne
not
ones
or
pi
plus
pow2
power
rand
randi
randn
rdivide
real
reallog
realmax
realmin
realpow
realsqrt
rem
round
sec
sech
sign
sin
single
sinh
sqrt
tan
tanh
times
true
uint8
uint16
uint32
uint64
xor
zeros

+
-
.*
./
.\
.^
==
~=
<
<=
>
>=
&
|
~
&&
||

Скалярные версии расширения:

*
/
\
^
Инструкции по разветвлению:
break
continue
else
elseif
for
if
return
while

Функции, которые создают массивы (такие как Inf, NaN, ones, rand, randi, randn, и zeros) не поддерживает спецификации размера в качестве входных параметров. Вместо этого размер сгенерированного массива определяется размером входных переменных в ваши функции. Достаточно элементов массива сгенерированы, чтобы удовлетворить потребности ваших входных или выходных переменных. Тип данных можно задать, используя как класс, так и "like" синтаксисы. В следующих примерах показаны поддерживаемые синтаксисы для функций создания массивов:

a = rand;
b = ones();
c = zeros("like", x);
d = Inf("single");
e = randi([0 9], "uint32");

Когда вы используете rand, randi, и randn чтобы сгенерировать случайные числа в FUNкаждый элемент генерируется из другого субпотока. Для получения дополнительной информации о генерации случайных чисел на графическом процессоре, смотрите Потоки случайных чисел на графическом процессоре.

Входной массив, заданный как скаляры, векторы, матрицы или многомерные массивы. По крайней мере один входной аргумент массива должен быть gpuArray для arrayfun для запуска на графическом процессоре. Каждый массив, который хранится в памяти центральный процессор, преобразуется в gpuArray перед оценкой функции. Если вы планируете совершить несколько вызовов в arrayfun с тем же массивом эффективнее преобразовать этот массив в gpuArray.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

Выходные аргументы

свернуть все

Выходной массив, возвращенный как gpuArray.

Совет

  • Первый звонок 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.

Введенный в R2010b