主要内容

arrayfun

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

描述

例子

请注意

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

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

你不能指定顺序arrayfun计算B或者依赖于它们以特定的顺序进行。

例子

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

例子

(B1,…,B米] = arrayfun(有趣的___返回多个输出数组B1,…,Bm当这个函数有趣的返回输出值。arrayfun调用有趣的每次都有和调用一样多的输出arrayfun,也就是说,次了。如果你叫arrayfun输出参数比支持的多万博1manbetx有趣的, MATLAB产生一个误差。有趣的是否可以返回具有不同数据类型的输出参数,但每次输出的数据类型必须相同有趣的被称为。

例子

全部折叠

在这个例子中,一个小函数将校正数据应用到一组测量数据中。文件中定义的函数myCal.m显示在这里。

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

函数的每个元素都应用增益因子和偏移量时,该函数只执行与元素相关的操作rawdata数组中。

创建一个标称测量值。

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

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

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

在GPU上运行校准功能。

量,修正= arrayfun (@myCal gn,关闭状态);

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

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

结果=收集(纠正);

你可以定义一个MATLAB函数如下。

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

在GPU上评估此功能。

s1 =兰德(400“gpuArray”);s2 =兰德(400“gpuArray”);s3 =兰德(400“gpuArray”);[o1、o2] = arrayfun (@aGpuFunction、s1、s2、s3);谁
Name Size Bytes Class o1 400x400 108 gpuArray o2 400x400 108 gpuArray s1 400x400 108 gpuArray s2 400x400 108 gpuArray s3 400x400 108 gpuArray使用gather从GPU中检索数据到MATLAB中

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

d =收集(o2);

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

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

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

G = 2 * 1 (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 double eps eq erf erfc erfcinv erfcx erfinv exp expm1 false fix floor gamma gamma ge gt hypot imag Inf int8 int16 int32 int64 intmax intmin isfinite isinf isnan ldivide le log . csch double eps eq erf erfc erfcinv erfcx erfinv exp expm1 false fix floor gamma gamma ge gt
log2 log10 log1p逻辑lt最大最小减去mod NaN ne不是1或pi + pow2功率randi randn rdivide real reallog realmax realmin realpow realsqrt round sec secsign
Sin single sinh SQRT tan tanh times true uint8 uint16 uint32 uint64 xor zeros + - .* ./ .\ .^ == ~= < <= > >= & | ~ && || . uint64

标量扩展版本如下:

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

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

一个=兰德;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
  • 因为支持的操作万博1manbetxarrayfun是严格的元素,每个元素的每个计算都是独立于其他元素执行的,施加了某些限制:

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

    • 数组创建函数,例如兰德不支持尺寸规格万博1manbetx。随机数数组的每个元素都有独立的流。

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

  • 更改输入或输出数组大小或形状的操作(重塑,等等)。万博1manbetx

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

  • 匿名函数不能访问其父函数工作区。

  • 不允许重载支持的函数。万博1manbetx

  • 代码不能调用脚本。

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

  • 以下语言特性不受支持:持久变量或全局变量、万博1manbetxparforspmd开关,试一试/

  • P-code文件不能包含对arrayfungpuArray数据。

介绍了R2010b