Применение функции к каждому элементу массива графического процессора
Примечание
Эта функция работает аналогично функции MATLAB ®arrayfun, за исключением того, что оценка функции выполняется на GPU, а не на CPU. Все требуемые данные, еще не находящиеся на GPU, перемещаются в память GPU. Функция MATLAB, переданная для оценки, компилируется и затем выполняется на GPU. Все выходные аргументы возвращаются как объекты 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 для выполнения определенной функции на GPU существует некоторое время на создание функции для выполнения GPU. Последующие вызовы 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) и поддерживается доступ к переменным рабочей области родительской (внешней) функции из вложенных функций. Можно проиндексировать переменные, которые существуют в функции до анализа на GPU. Назначение или subsasgn индексирование этих переменных из вложенной функции не поддерживается. Пример поддерживаемого использования см. в разделе Операции с набором элементов на графическом процессоре.
Анонимные функции не имеют доступа к родительской рабочей области.
Перегрузка поддерживаемых функций не допускается.
Код не может вызывать сценарии.
Здесь нет ans для хранения неназначенных результатов вычислений. Убедитесь в явном назначении переменным результатов всех вычислений.
Следующие языковые функции не поддерживаются: постоянные или глобальные переменные, parfor, spmd, switch, и try/catch.
Файлы P-кода не могут содержать вызов arrayfun с данными gpuArray.