主要内容

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(magic(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 确定输入是否稀疏
下垫式 确定输入是否指定了基础数据类型
最大数组维数的长度
ndims 数组维数
大小 数组大小
下垫式 决定数组行为的基础数据类型

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

例子

全部崩溃

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

gpuDevice
ans=CUDADevice with properties:Name:'GeForce GTX 1080'索引:1计算能力:'6.1'支持双:1驱动服务器版本:10.1000工具套件版金宝app本:10.1000 MaxThreadsPerBlock:1024 MaxShmemPerBlock:49152 MaxThreadBlockSize:[1024 1024 64]MaxGridSize:[2.1475e+09 65535 65535]SIMDWidth:32总内存:8.5899e+09可用内存:6.9012e+09多处理器计数:20时钟频率kHz:1733500计算模式:“默认”GPUOverlapsTransfers:1内核执行时间:1 CanMapHostMemory:1设备支持:1设备选择:1

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

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

要使用GPU,请使用任何启用GPU的MATLAB函数。MATLAB会自动在GPU上运行计算。有关更多信息,请参阅在GPU上运行MATLAB函数。例如,使用以下组合:诊断矩阵指数函数摩登派青年圆形的腹肌fliplr

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

策划的结果。

彩色贴图(翻转(灰色));

如果需要将数据从GPU传输回来,请使用收集。收集回CPU的成本可能很高,通常不需要,除非您需要将结果与不支持gpuArray的函数一起使用。金宝app

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

一般来说,如果在CPU上运行代码,结果可能会有所不同,这是由于GPU和CPU之间的数值精度和算法差异造成的。CPU和GPU上的答案都是与真实分析结果同等有效的浮点近似值,在计算过程中经过了不同的舍入。在本例中,CPU和GPU上的答案都是对真实分析结果的有效浮点近似值结果是整数和圆形的消除舍入误差。

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

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

n=1e6;x=2*rand(n,1,“gpuArray”)-1、 y=2*rand(n,1,“gpuArray”) 1;

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

f=x.^2+y.^2<=1;结果=4*1/n*f'*个(n,1,“gpuArray”
结果= 3.1403

这个例子展示了如何使用支持GPU的MATLAB函数来计算一个著名的数学结构:Mandelbrot集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
名称大小字节类属性x 1x1000 4 gpuArray y 1x1000 4 gpuArray

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

[xGrid,yGrid]=网格网格(x,y);z0=复合体(xGrid,yGrid);计数=个(大小(z0),“gpuArray”);

以下代码使用启用GPU的函数实现Mandelbrot算法。由于代码使用GPuarray,因此计算在GPU上进行。

z=z0;n=0:maxz=z.*z+z0;内部=abs(z)<=2;计数=计数+内部;终止数=日志(数);

计算完成后,绘制结果。

imagesc(x,y,count)颜色映射([jet();flipud(jet());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。日志空间
gpuArray。speye

有关函数的类特定帮助,请参见gpuArray前缀,类型

帮助gpuArray。函数名

在哪里函数名方法的名称。例如,获取冒号类型

帮助gpuArray.colon
R2010b中引入