主要内容

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
Name Size Bytes Class Attributes gpuX 1x95 4 gpuArray . Name Size Bytes Class Attributes

要使用gpuArrays,请使用任何支持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);

策划的结果。

显示亮度图像(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 *兰特(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);数= 1(大小(z0),“gpuArray”);

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

z = z0;n = 0:maxIterations z = z.*z + z0;内部= abs(z) <= 2;Count = 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)
(___ gpuArray) randn(___ gpuArray)
(___ gpuArray) gpuArray。结肠
(___ gpuArray) gpuArray。freqspace
真正的(___ gpuArray) gpuArray。linspace
0(___ gpuArray) gpuArray。logspace
gpuArray。speye

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

帮助gpuArray。functionname

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

帮助gpuArray.colon
介绍了R2010b