主要内容

arrayfun

对GPU上阵列的每个元素应用函数

描述

例子

笔记

这个函数的行为类似于MATLAB®函数arrayfun,除了函数的计算发生在GPU上,而不是在CPU上。GPU上没有的所有数据都被移到GPU内存中。传递给评估的MATLAB函数被编译,然后在GPU上执行。所有输出参数都作为gpuArray对象返回。属性可以检索gpuArray数据收集功能。

B.= arrayfun (乐趣一种应用函数乐趣指向gpuArray的每个元素一种arrayfun然后连接来自的输出乐趣到输出gpuArrayB.B.大小是一样的吗一种B (i, j,…)=乐趣((i, j,…))。输入参数乐趣是一个函数句柄到Matlab函数,它采用一个输入参数并返回标量值。乐趣被调用的次数是多少一种

你不能指定顺序arrayfun计算B.或者依靠他们以任何特定的顺序完成。

例子

B.= arrayfun (乐趣,a1,...,a)适用乐趣到数组的元素A1,......,一个,所以B(i,j,...)=有趣(a1(i,j,...),...,一个(i,j,...))。功能乐趣必须采取N输入参数并返回标量。输入的非单例维度A1,......,一个必须全部匹配,否则输入必须是标量。任何单维度或标量输入在输入到函数之前实际上都是复制的乐趣

例子

(B1,…那B.m] = arrayfun(乐趣___返回多个输出阵列B1,...,BM当这个函数乐趣回报m输出值。arrayfun呼叫乐趣每次都有和调用一样多的输出arrayfun,也就是说,m次了。如果你叫arrayfun输出参数比支持的多金宝app乐趣, MATLAB产生一个误差。乐趣是否可以返回具有不同数据类型的输出参数,但每次输出的数据类型必须相同乐趣被称为。

例子

全部收缩

在该示例中,小功能将校正数据应用于测量数据阵列。文件中定义的函数mycal.m.显示在这里。

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

函数的每个元素都应用增益因子和偏移量时,该函数只执行与元素相关的操作原始数据大批。

创建一个标称测量值。

量= 1 (1000)* 3;%1000×1000矩阵

该函数允许增益和偏移量为大小相同的数组原始数据,使得可以应用于各个测量来应用唯一的校正。在典型的情况下,您可以将校正数据保留在GPU上,以便您不必为每个应用程序传输它:

gn =兰德(1000“gpuarray”) / 100 + 0.995;偏移=兰德(1000“gpuarray”)/ 50  -  0.01;

在GPU上运行校准功能。

纠正= arrayfun(@ mycal,meas,gn,offs);

由于输入参数,该函数在GPU上运行GN.关税已经在GPU内存中了。输入数组在函数运行之前转换为gpuArray。

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

结果=聚集(纠正);

您可以定义MATLAB函数,如下所示。

函数[o1,o2] = aGpuFunction(a,b,c);c = 0;结尾

在GPU上评估此功能。

s1 =兰德(400“gpuarray”);s2 = rand(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 =收集(o2);

功能myfun.m生成并使用随机数R.

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

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

g = 2 *那些(4,4,“gpuarray”) H = arrayfun(@myfun, G)

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

输入参数

全部收缩

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

乐趣必须是用MATLAB语言编写的函数的句柄。你不能指定乐趣作为mex函数的句柄。

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

Abs and acos acsh acot acoth acsc acsch asec asech asin asinh atan atan2 atanh beta betaln bitand bitcmp bitget bitset bitshift bitxor cast cell complex conj cos cosh cot coth CSC
CSCH双EPS EQ ERF ERFC ERFCINV ERFCX ERFINV expm1假修订楼层Gamma Gammax GE GT次hyp IM INT8 INT16 INT32 INT64 INTMAX INTMIN ISFINITE ISINF ISNAN LDIVIDE LE LOG
LOG2日志10 log1p逻辑LT最大最小负模的NaN NE不者或pi加POW2功率兰特兰迪randn rdivide真实reallog realmax realmin realpow realsqrt REM轮秒双曲正割符号
Sin single sinh SQRT tan tanh times true uint8 uint16 uint32 uint64 xor zeros + - .* ./ .\ .^ == ~= < <= > >= & | ~ && || . uint64

标量扩展版本如下:

* / \ ^
分支指令:
如果返回的话,休息别的别的人

创建数组的函数(例如兰特兰迪randn,Zeros.)不支持大小规格作金宝app为输入参数。相反,生成阵列的大小由输入变量的大小确定为您的功能。生成足够的数组元素以满足输入或输出变量的需求。您可以使用两个类指定数据类型“喜欢”语法。下面的示例显示了数组创建函数所支持的语法:金宝app

一个=兰德;b =的();c = 0 (“喜欢”, x);d =正(“单身”);E = randi([0 9],“uint32”);

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

输入数组,指定为标量,向量,矩阵或多维数组。至少一个输入阵列参数必须是GPUARRAYarrayfun在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 =兰德(2、5、4、“gpuarray”);R2 =兰德(2,1,4,3,“gpuarray”);R3 =兰特(1,5,4,3,“gpuarray”);R = arrayfun (@ (x, y, z) (x + y。* z), R1, R2, R3);大小(R)
    2 5 4 3
    R1 =兰德(2 2 0 4“gpuarray”);R2 =兰德(2,1,1,4,“gpuarray”);R = arrayfun (@plus、R1、R2);大小(R)
    2 2 0 4
  • 因为支持的操作金宝apparrayfun是严格的元素,每个元素的每个计算都是独立于其他元素执行的,施加了某些限制:

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

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

  • 就像arrayfun在MATLAB中,矩阵指数幂、乘、除(^*/\)仅执行元素 - 明智的计算。

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

  • 只读索引(子反馈),并支持从嵌套函数内部访问父(外部)函数工作区的变量。金宝app您可以在对GPU进行评估之前对函数中存在的变量进行索引。转让或者subsasgn.不支持在嵌套函数中对这些变量进行索引。金宝app有关支持的用法的示例,请参见金宝appGPU上的模板操作

  • 匿名函数无法访问其父函数工作区。

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

  • 代码无法调用脚本。

  • 没有变量以保持未分配的计算结果。确保显式分配以变量所有计算的结果。

  • 不支持以下语言功能:持久或全局变量,金宝app议案SPMD.开关,试一试/

  • p代码文件不能包含呼叫arrayfungpuArray数据。

介绍在R2010B.