Apply function to each page of array on GPU


A = pagefun(FUN,B)
A = pagefun(FUN,B,C,...)
[A,B,...] = pagefun(FUN,C,...)


pagefun iterates over the pages of a gpuArray, applying the same function to each page.

A = pagefun(FUN,B) applies the function specified by FUN to each page of the gpuArray B, and returns the results in gpuArray A, such that A(:,:,I,J,...) = FUN(B(:,:,I,J,...)). FUN is a handle to a function that takes a two-dimensional input argument.

You can use gather to retrieve the array from the GPU back to the MATLAB workspace.

A = pagefun(FUN,B,C,...) evaluates FUN using pages of the arrays B, C, etc., as input arguments with scalar expansion enabled. Any of the input page dimensions that are scalar are virtually replicated to match the size of the other arrays in that dimension so that A(:,:,I,J,...) = FUN(B(:,:,I,J,...), C(:,:,I,J,...),...). At least one of the inputs B, C, etc. must be a gpuArray. Any other inputs held in CPU memory are converted to a gpuArray before calling the function on the GPU. If an array is to be used in several different pagefun calls, it is more efficient to convert that array to a gpuArray before your series of pagefun calls. The input pages B(:,:,I, J, ...), C(:,:,I, J, ...), etc., must satisfy all of the input and output requirements of FUN.

[A,B,...] = pagefun(FUN,C,...), where FUN is a handle to a function that returns multiple outputs, returns gpuArrays A, B, etc., each corresponding to one of the output arguments of FUN. pagefun invokes FUN with as many outputs as there are in the call to pagefun. All elements of A must be the same class; B can be a different class from A, but all elements of B must be of the same class; etc.

FUN must return values of the same class each time it is called. The order in which pagefun computes pages is not specified and should not be relied on.

FUN must be a handle to a function that is written in the MATLAB language (i.e., not a built-in function or a MEX-function).

Currently the supported values for FUN are:

  • Most element-wise gpuArray functions and the following functions:

  • @ctranspose

  • @fliplr

  • @flipud

  • @inv

  • @mldivide

  • @mrdivide

  • @mtimes

  • @rot90

  • @transpose

  • @tril

  • @triu


M = 3;         % output number of rows
K = 6;         % matrix multiply inner dimension
N = 2;         % output number of columns
P1 = 10;       % size of first page dimension
P2 = 17;       % size of second page dimension
P3 = 4;        % size of third page dimension
P4 = 12;       % size of fourth page dimension
A = rand(M,K,P1,1,P3,'gpuArray');
B = rand(K,N,1,P2,P3,P4,'gpuArray');
C = pagefun(@mtimes,A,B);
s = size(C)    % M-by-N-by-P1-by-P2-by-P3-by-P4
s =
    3     2    10    17     4    12
M = 300;       % output number of rows
K = 500;       % matrix multiply inner dimension
N = 1000;      % output number of columns
P = 200;       % number of pages
A = rand(M,K,'gpuArray');   
B = rand(K,N,P,'gpuArray');
C = pagefun(@mtimes,A,B);
s = size(C)    % returns M-by-N-by-P 
s =
    300        1000         200

Introduced in R2013b