主要内容

gpuArray

阵列存储在GPU上

描述

一个gpuArray对象表示存储在GPU上的数组。一起工作gpuArray对象,使用任何支持gpu的MATLAB®函数。你可以在GPU上执行的CUDA内核中直接使用数组进行计算。有关更多信息,请参见在GPU上运行MATLAB函数

如果需要从GPU中检索阵列,例如使用不支持的函数时金宝appgpuArray对象,使用收集函数。

请注意

当GPU不可用时,可以将包含gpuArray数据的MAT文件加载为内存阵列。没有GPU加载的gpuArray是有限的,你不能使用它进行计算。要使用没有GPU加载的gpuArray,请使用收集

创建

使用gpuArray将MATLAB工作空间中的数组转换为gpuArray对象。许多MATLAB函数也允许您创建gpuArray直接对象。有关更多信息,请参见在GPU上建立阵列

描述

例子

G = gpuArray (X复制数组X并返回agpuArray对象。

输入参数

全部展开

传输到GPU的数组,指定为数字或逻辑阵列。GPU设备必须具有足够的自由内存来存储数据。如果X已经是一个gpuArray目的,gpuArray输出X不变。

您还可以将稀疏阵列转移到GPU。gpuArray金宝app仅支持双精度稀疏阵列。

例子:G = gpuArray(魔法(3));

数据类型:||int8|INT16|int32|int64|uint8|uint16|uint32|uint64|逻辑
复数的支持:金宝app是的

对象的功能

arrayfun 对GPU上阵列的每个元素应用函数
收集 将分布式数组或gpuArray转移到本地工作区
pagefun 对分布式阵列或gpuArray的每个页面应用函数

有几种方法可以检验a的特性gpuArray对象。大多数函数的行为类似于同名的MATLAB函数。

existsOnGPU 确定GPU上是否有gpuArray或CUDAKernel
isequal 确定数组平等
isnumeric 确定输入是否为数字数组
issparse 确定输入是否稀疏
IsunderLyingtype. 确定输入是否指定了基础数据类型
长度 最大阵列维度的长度
ndims 数组维数
大小 数组大小
underlyingType 决定数组行为的基础数据类型

其他的方法gpuArray对象太多,无法在这里列出。最类似和行为相同的MATLAB函数相同的名字。看到在GPU上运行MATLAB函数

例子

全部折叠

这个例子展示了如何使用支持gpu的MATLAB函数来操作gpuArrays。您可以检查您的GPU属性使用gpuDevice函数。

gpuDevice
ans = CUDADevice属性:名称:“GeForce 1080 GTX公司”指数:1 ComputeCapability:“6.1”SupportsDouble: 1 Drive金宝apprVersion: 10.1000 ToolkitVersion: 10.1000 MaxThreadsPerBlock: 1024 MaxShmemPerBlock: 49152 MaxThreadBlockSize: [1024 1024 64] MaxGridSize: [2.1475 e + 09年65535 65535]SIMDWidth: 32 TotalMemory: 8.5899 e + 09 AvailableMemory:6.9012e+09 MultiprocessorCount: 20 ClockRateKHz: 1733500 ComputeMode: 'Default' GPUOverlapsTransfers: 1 KernelExecutionTimeout: 1 CanMapHostMemory: 1 Device金宝appSupported: 1 DeviceSelected: 1

创建一个行向量,重复从-15到15的值。要将其转移到GPU并创建gpuArray,请使用gpuArray函数。

X = [-15:15 0 -15:15 0 -15:15];gpuX = gpuArray (X);谁gpuX
名称大小字节类属性GPUX 1x95 4 GPUARRAY

要使用GPUARRASE进行操作,请使用启用任何GPU的MATLAB函数。MATLAB会自动在GPU上运行计算。有关更多信息,请参见在GPU上运行MATLAB函数。例如,使用组合诊断接头EXPM.国防部圆形的腹肌,fliplr

gpuE = expm(diag(gpuX,-1)) * expm(diag(gpuX,1));gpuM =国防部(圆(abs (gpuE)), 2);gpuF = gpuM + fliplr(gpuM);

策划的结果。

ImageC(GPUF);Colormap(翻转(灰色));

如果需要将数据从GPU传输回来,请使用收集。收集回CPU可能是昂贵的,并且通常没有必要,除非您需要使用不支持GPUARRAY的函数来使用结果。金宝app

结果=聚集(GPUF);谁结果
Name Size Bytes Class Attributes result 96x96 73728 double

一般来说,如果你在CPU上运行代码,结果可能会有所不同,这是由于数值精度和GPU和CPU之间的算法差异。在CPU和GPU上的答案都是有效的浮点逼近的真实分析结果,在计算过程中受到了不同的舍入。在这个例子中,结果是整数和圆形的消除四舍五入错误。

这个例子展示了如何使用MATLAB函数和运算符与gpuArrays计算一个函数的积分,使用蒙特卡罗积分方法。

定义样本的点数。函数域中的采样点,间隔[1]在这两个xy坐标,通过创建随机的点兰德函数。要直接在GPU上创建随机数组,请使用兰德功能和指定'gpuarray'。有关更多信息,请参见在GPU上建立阵列

n = 1 e6;x = 2 *兰德(n, 1,'gpuarray') 1;y = 2 * rand(n,1,'gpuarray') 1;

定义要积分的函数,并用蒙特卡罗积分公式对其进行积分。这个函数近似于 π. 通过对单位圆内的点进行采样。由于代码使用了gpuArrays上启用了GPU的函数和操作符,计算将自动在GPU上运行。您可以使用与MATLAB数组相同的语法执行二进制运算,例如按元素进行乘法。要了解更多关于启用gpu的功能,请参见在GPU上运行MATLAB函数

f = x。^ 2 + y。^ 2 <= 1;结果= 4 * 1 / n * f'*(n,1,'gpuarray'
结果= 3.1403

这个例子展示了如何使用支持gpu的MATLAB函数来计算一个著名的数学结构:Mandelbrot集合。检查您的GPU使用gpuDevice函数。

定义参数。Mandelbrot算法在实部和虚部组成的网格上迭代。下面的代码定义了迭代次数、网格大小和网格限制。

maxIterations = 500;gridSize = 1000;Xlim = [-0.748766713922161, -0.748766707771757];Ylim = [0.123640844894862, 0.123640851045266];

你可以使用gpuArray功能,将数据传输到GPUgpuArray,也可以直接在GPU上创建阵列。gpuArray提供GPU版本的许多功能,您可以使用这些功能创建数据阵列,例如linspace。有关更多信息,请参见直接创建GPU阵列

xlim x = gpuArray.linspace (xlim (1), (2), gridSize);ylim y = gpuArray.linspace (ylim (1), (2), gridSize);谁xy
Name Size Bytes Class Attributes x 1x1000 4 gpuArray y 1x1000 4 gpuArray

许多MATLAB函数支持gpuArrays。金宝app当您为任何启用了GPU的函数提供gpuArray参数时,该函数将在GPU上自动运行。有关更多信息,请参见在GPU上运行MATLAB函数。为算法创建一个复杂的网格,并创建数组的结果。要在GPU上直接创建该阵列,请使用函数,并指定'gpuarray'

[xGrid,ygrid] = meshgrid(x,y);z0 =复合物(Xgrid,Ygrid);count = =(大小(z0),'gpuarray');

下面的代码使用使能gpu的函数实现了Mandelbrot算法。因为代码使用了gpuArrays,所以计算发生在GPU上。

z = z0;n = 0:maxIterations z = z。* z + z0;内部= abs(z)<= 2;count =内部计数+;结束数=日志(数);

完成计算时,请绘制结果。

Imagesc (x,y,count) colormap([jet();flipud(jet());0 0 0]);轴

提示

  • 如果你需要提高性能,或者某个功能对GPU不可用,gpuArray金宝app支持以下选项:

    • 预编译并运行纯元素代码gpuArray对象,使用arrayfun函数。

    • 运行包含CUDA的C ++代码®设备代码或库调用时,使用mex函数。有关更多信息,请参见运行包含CUDA代码的mex函数

    • 要运行用CUDA c++编写的现有GPU内核,请使用MATLAB CUDAKernel接口。有关更多信息,请参见在GPU上运行CUDA或PTX代码

    • 要从MATLAB代码生成CUDA代码,使用GPU Coder™。有关更多信息,请参见开始使用GPU编码器(GPU编码器)

  • 可以通过控制图形处理器上的随机数流gpurng

  • 下列各项不能超过intmax(“int32”)

    • 密集数组的元素数。

    • 稀疏数组中非零元素的个数。

    • 任意给定维度的大小。例如,0 (0 3 e9 gpuArray)是不允许的。

选择

你也可以创建一个gpuArray使用MATLAB函数,通过指定gpuArray输出。下表列出了可以创建的MATLAB函数gpuArray直接对象。

眼睛(___ gpuArray) 兰德(___ gpuArray)
(___ gpuArray) 兰迪(___ gpuArray)
inf(___ gpuArray) randn(___ gpuArray)
(___ gpuArray) gpuArray。结肠
(___ gpuArray) gpuArray。freqspace
真的(___ gpuArray) gpuArray。linspace
0(___ gpuArray) gpuArray。logspace
gpuArray。speye

的函数的类特定帮助gpuArray前缀,类型

帮助gpuArray。functionname

在哪里functionname是该方法的名称。例如,获得帮助结肠、类型

帮助gpuArray.colon
介绍了R2010b