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