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