主要内容

arrayfun

在GPU上应用函数到数组的每个元素

描述

例子

请注意

这个函数的行为类似于MATLAB®函数arrayfun,除了函数的计算发生在GPU上,而不是CPU上。任何尚未在GPU上的必需数据将被移动到GPU内存中。编译传入求值的MATLAB函数,然后在GPU上执行。所有输出参数都作为gpuArray对象返回。方法检索gpuArray数据收集函数。

B= arrayfun (有趣的一个应用函数有趣的到gpuArray的每个元素一个arrayfun然后连接来自的输出有趣的输入输出gpuArrayBB尺寸和一个而且B(i,j,…)= FUN(A(i,j,…)).输入参数有趣的是MATLAB函数的函数句柄,该函数接受一个输入参数并返回一个标量值。有趣的的元素被调用的次数是多少一个

您无法指定其中的顺序arrayfun计算的元素B或者依赖于它们以任何特定的顺序完成。

例子

B= arrayfun (有趣的A1,…)适用于有趣的到数组的元素A1,…,一个,所以B(i,j,…)= FUN(A1(i,j,…),…,An(i,j,…)).这个函数有趣的必须采取n输入参数并返回标量。输入的非单维度A1,…,一个必须全部匹配,否则输入必须是标量。任何单例维度或标量输入在被输入到函数之前都会被虚拟复制有趣的

例子

(B1,…,B米] = arrayfun(有趣的___返回多个输出数组B1,…,Bm当函数有趣的返回输出值。arrayfun调用有趣的的调用中有多少输出就有多少输出arrayfun,也就是说,次了。如果你打电话arrayfun的输出参数比支持的输出参数多金宝app有趣的, MATLAB生成一个错误。有趣的是否可以返回具有不同数据类型的输出参数,但每次输出的数据类型必须相同有趣的被称为。

例子

全部折叠

在本例中,一个小函数将校正数据应用于测量数据数组。文件中定义的函数myCal.m如图所示。

函数c = myCal(rawdata, gain, offset) c = (rawdata .* gain) + offset;结束

类的每个元素应用增益因子和偏移量时,函数仅执行按元素的操作rawdata数组中。

创建一个标称测量。

Meas = ones(1000)*3;% 1000 × 1000矩阵

该函数允许增益和偏移量为相同大小的数组rawdata,以便将唯一的修正应用于个别测量。在典型的情况下,你可以将校正数据保存在GPU上,这样你就不必为每个应用程序传输它:

Gn =兰特(1000,“gpuArray”)/100 + 0.995;off = rand(1000,“gpuArray”)/50 - 0.01;

在GPU上运行校准函数。

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

函数运行在GPU上是因为输入参数gn而且走开已经在GPU内存中了。输入数组在函数运行之前转换为gpuArray。

从GPU检索校正后的结果到MATLAB工作空间。

结果=收集(更正);

可以按如下方式定义MATLAB函数。

函数[o1,o2] = aGpuFunction(a,b,c) o1 = a + b;O2 = o1 .* c + 2;结束

在GPU上计算这个函数。

S1 =兰特(400,“gpuArray”);S2 =兰特(400,“gpuArray”);S3 =兰特(400,“gpuArray”);[o1,o2] = arrayfun(@aGpuFunction,s1,s2,s3);谁
名称大小字节类型属性o1 400x400 1280000 gpuArray o2 400x400 1280000 gpuArray s1 400x400 1280000 gpuArray s2 400x400 1280000 gpuArray s3 400x400 1280000 gpuArray

使用收集将数据从GPU检索到MATLAB工作空间。

D = gather(o2);

这个函数myfun.m生成并使用一个随机数R

函数Y = myfun(X) R = rand();Y = r .* x;结束

如果你使用arrayfun在输入变量为gpuArray的情况下运行这个函数,该函数运行在GPU上。的大小X确定要生成的随机元素的数量。下面的代码传递gpuArray矩阵GmyfunGPU。

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

因为G是一个4 × 4的gpuArray,myfun为生成16个随机值标量元素R,一个用于每个元素为的计算G

输入参数

全部折叠

函数应用于作为函数句柄指定的输入数组的元素。有趣的必须返回标量值。对于每个输出参数,有趣的每次调用时必须返回同一类的值。有趣的必须接受数字或逻辑输入数据。

有趣的必须是用MATLAB语言编写的函数句柄。你不能指定有趣的作为一个墨西哥函数的句柄。

有趣的可以包含以下内置的MATLAB函数和运算符。

Abs和acos acosh acot acth acsc acsch asec asech asin asinh atan atan2 atanh beta betaln bitand bitcmp bitget bitor bitset bitshift bitxor cast cell 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 - mod NaN ne not ones或pi + pow2 power rand randi randn rdivide real reallog realmax realmin realpow realsqrt rem round sec sech符号
Sin single sinh SQRT tan tanh times true uint8 uint16 uint32 uint64 xor zeros + - .* ./ .\ .^ == ~= < <= > >= & | ~ && ||

下面的标量展开版本:

* / \ ^
分支指令:
Break continue else else else for if return while

创建数组的函数(例如兰德兰迪randn,0)不支持大小规格作金宝app为输入参数。相反,生成的数组的大小由函数的输入变量的大小决定。生成足够的数组元素以满足输入或输出变量的需要。可以使用类和指定数据类型“喜欢”语法。下面的例子显示了数组创建函数所支持的语法:金宝app

A =兰特;B = ones();C = 0 (“喜欢”, x);d = Inf(“单身”);E = randi([0 9],“uint32”);

当你使用兰德兰迪,randn生成随机数有趣的,每个元素都是从不同的子流生成的。有关在GPU上生成随机数的更多信息,请参见GPU上的随机数流

输入数组,指定为标量、向量、矩阵或多维数组。至少有一个输入数组参数必须是gpuArray forarrayfun在GPU上运行。在计算函数之前,存储在CPU内存中的每个数组都转换为gpuArray。如果你打算打几个电话给arrayfun对于相同的数组,将该数组转换为gpuArray更有效。

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64|逻辑

输出参数

全部折叠

输出数组,作为gpuArray返回。

提示

  • 第一次打电话的时候arrayfun为了在GPU上运行一个特定的函数,有一些开销时间来为GPU执行设置函数。后续调用arrayfun用同样的函数可以运行得更快。

  • 输入数组的非单例维度必须相互匹配。换句话说,论点的相应维度A1,…,一个,必须彼此相等,或者等于1。当输入数组的维数为单例时(等于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);大小(R)
    2 5 4 3
    R1 = rand(2,2,0,4,“gpuArray”);R2 = rand(2,1,1,4,“gpuArray”);R = arrayfun(@plus,R1,R2);大小(R)
    2 2 0 4
  • 因为所支持的操作金宝apparrayfun是严格的元素,并且每个元素的每次计算都是独立于其他元素执行的,因此施加了某些限制:

    • 输入和输出数组不能改变形状或大小。

    • 数组创建函数,例如兰德不支持大小规格金宝app。随机数数组的每个元素都有独立的流。

  • 就像arrayfun在MATLAB中,矩阵指数幂,乘法和除法(/)只执行元素计算。

  • 更改输入或输出数组的大小或形状的操作(重塑,等等)不受支持。金宝app

  • 只读索引(subsref),并支持从嵌套函数中访问父(外部)函数工作区的变量。金宝app可以在GPU上对函数中存在的变量进行索引。转让或者subsasgn不支持从嵌套函数中索引这些变量。金宝app有关受支持的用法示例,请参见金宝appStencil图形处理器的操作

  • 匿名函数不能访问它们的父函数工作区。

  • 不允许重载所支持的函数。金宝app

  • 代码不能调用脚本。

  • 没有变量保存未分配的计算结果。确保将所有计算结果显式地赋值给变量。

  • 不支持以下语言特性:持久变量或全局变量,金宝appparforspmd开关,试一试/

  • P-code文件不能包含对arrayfun使用gpuArray数据。

版本历史

在R2010b中引入