当前位置:首页 > > AdriftCoreFPGA芯研社

1简介

MATLAB 提供了强大的 GPU 加速功能,允许用户利用图形处理单元(GPU)来加速计算密集型任务。通过 GPU 加速,许多数值计算和数据处理任务可以显著提升性能,尤其是在处理大型数据集和复杂的数学运算时。

2Parallel Computing Toolbox

MATLAB 的 GPU 加速依赖于 Parallel Computing Toolbox ,该工具箱提供了多种函数和工具,用于在 GPU 上运行 MATLAB 代码。主要特点包括:

  • 高性能计算:利用 GPU 的并行处理能力,显著加速数值计算。

  • 易于使用:只需对现有代码进行少量修改即可利用 GPU 加速。

  • 支持多种操作:线性代数、FFT、插值、图像处理等。

关于GPU加速可以在MATLAB官网查阅 Parallel Computing Toolbox 文档中的GPU Computing 来了解更多详细的内容。

3查看主机GPU设备

使用 gpuDevice 函数确认系统是否有兼容的 GPU,并安装了合适的驱动程序。目前 Parallel Computing Toolbox 只支持N卡(英伟达)。如果你的MATLAB GPU库没有被编译的话,可能需要等待几分钟直至编译完成,才能显示GPU的信息。

以下是对于GPU设备信息的一些解释:

Name: 'NVIDIA GeForce RTX 3060 Ti' GPU 的名称或型号。

Index: 1 ,设备索引号,用于标识当前选择的 GPU 设备。在多 GPU 系统中,每个 GPU 都有一个唯一的索引号。

ComputeCapability: '8.6,计算能力,表示 GPU 的架构版本。不同的计算能力支持不同的功能和性能特性。CUDA 计算能力 8.6 对应 Ampere 架构。

SupportsDouble: 1,是否支持双精度浮点运算。1 表示支持,0 表示不支持。

DriverVersion: 12.2000,安装的 CUDA 驱动程序版本。

ToolkitVersion: 10,安装的 CUDA 工具包版本。

MaxThreadsPerBlock: 1024,每个块(block)最大允许的线程数。

MaxShmemPerBlock: 49152,每个块可用的最大共享内存(以字节为单位)。

MaxThreadBlockSize: [1024 1024 64],一个线程块的最大尺寸(X, Y, Z 方向)

MaxGridSize: [2.1475e+09 65535 65535],网格(grid)在各个维度的最大尺寸(X, Y, Z 方向)。

SIMDWidth: 32,每个线程束(warp)的宽度(即每个束中的线程数)。

TotalMemory: 8.5894e+09,GPU 上的总内存(以字节为单位)。8.5894e+09 字节约等于 8 GB。

AvailableMemory: 7.3321e+09,前可用的内存(以字节为单位)。表示在当前使用状态下可用的 GPU 内存量。

MultiprocessorCount: 38,GPU 上的多处理器数量。多处理器的数量影响并行处理能力。

ClockRateKHz: 1755000,GPU 的时钟速率(以千赫兹为单位)。1755000 千赫兹即 1.755 GHz。

ComputeMode: 'Default',GPU 的计算模式。常见的计算模式有默认模式(Default)、独占模式(Exclusive)、并行模式(Prohibited)等。

GPUOverlapsTransfers: 1,是否支持 GPU 计算与数据传输的重叠执行。1 表示支持,0 表示不支持。

KernelExecutionTimeout: 1,内核执行超时设置。1 表示启用超时,0 表示禁用。

CanMapHostMemory: 1,是否支持映射主机内存到设备。1 表示支持,0 表示不支持。

DeviceSupported: 1,MATLAB 是否支持该设备。1 表示支持,0 表示不支持。

DeviceSelected: 1,该设备是否被 MATLAB 选择为当前 GPU 设备。1 表示已选择,0 表示未选择。

4GPU基本操作方法

使用 gpuArray 函数将数据从 CPU 内存传输到 GPU 内存。

A = rand(1000, 'single'); % 创建一个单精度的随机矩阵A_gpu = gpuArray(A); % 将矩阵传输到 GPU 

使用支持 GPU 计算的 MATLAB 函数进行运算。这些函数在后台自动使用 GPU 资源。使用 fft 函数进行快速傅里叶变换。

B_gpu = fft(A_gpu); % 在 GPU 上进行快速傅里叶变换

大多数情况下,MATLAB 的图形和显示功能、文件 I/O 操作以及某些特定的函数只支持在 CPU 上运行。因此,即使计算在 GPU 上进行,结果通常需要传回 CPU 以进行进一步处理或显示。使用 gather 函数将数据从 GPU 传回 CPU。

B = gather(B_gpu); % 将结果传回 CPU

5GPU计算与CPU计算对比

gpu计算FFT:

clearT = tic();%添加计时点A_gpu = gpuArray.rand(1000, 'single');%生成1000x1000随机单精度浮点矩阵B_gpu = fft(A_gpu); % 在 GPU 上进行快速傅里叶变换toc(T);%显示时间

cpu计算FFT:

clearT = tic();%添加计时点A_cpu = rand(1000, 'single');%生成1000x1000随机单精度浮点矩阵B_cpu = fft(A_cpu); % 在 CPU 上进行快速傅里叶变换toc(T);%显示时间

可以看到GPU计算FFT远远快于CPU。通常情况下GPU计算更快,但是也有例外情况,如:小规模数据或简单计算,GPU 的并行处理能力在处理大量数据和复杂计算时才能显现其优势。如果数据规模较小或计算非常简单,启动 GPU 所需的开销(如数据传输和内核启动时间)可能会使整体计算时间比在 CPU 上更长。数据传输开销,将数据从 CPU 内存传输到 GPU 内存,以及将结果传回 CPU,这些数据传输操作本身可能需要显著的时间,特别是当数据量较大时。如果计算时间相对较短,数据传输时间可能会占主导地位,导致总体性能下降。内存限制,GPU 通常具有较少的内存资源,与 CPU 相比,GPU 内存可能不足以处理非常大的数据集。如果 GPU 内存不足,程序需要进行内存交换或分块处理,这会显著降低性能。适合并行计算的任务,某些任务天生不适合并行计算,比如高度串行化的任务、具有强依赖性的计算、或者需要频繁同步的操作。在这些情况下,CPU 的串行执行可能比 GPU 的并行执行更有效。 带宽限制 ,虽然 GPU 在计算能力方面比 CPU 更强,但它们的内存带宽可能成为瓶颈,尤其是在需要频繁访问内存的任务中。GPU 的内存访问延迟较高,因此在频繁的内存读写操作下,GPU 性能可能会下降。

6GPU计算函数介绍

基本数组操作

  • 创建和转换

gpuArray: 将数据从 CPU 转换到 GPU 上。

gather: 将数据从 GPU 转回 CPU。

ones, zeros, rand, randn, eye: 在 GPU 上创建数组。

A = gpuArray(rand(1000)); % 在 GPU 上创建一个随机数组B = gather(A); % 将数组从 GPU 转回 CPU

数学运算

  • 基本算术运算

plus, minus, times, rdivide, power: 基本的加减乘除和幂运算。

C = A + B; % 在 GPU 上进行数组相加
  • 线性代数

mtimes, mldivide, mrdivide, inv, pinv, svd, eig: 矩阵乘法、矩阵求逆、特征值分解、奇异值分解等。

D = A * B; % 在 GPU 上进行矩阵乘法
  • 求和与统计

sum, mean, std, var, median, mode, max, min: 统计运算。

total = sum(A(:)); % 计算 GPU 上数组元素的总和
  • 傅里叶变换

fft, ifft, fft2, ifft2, fftn, ifftn: 快速傅里叶变换及其逆变换。

F = fft(A); % 在 GPU 上进行快速傅里叶变换

插值与拟合

  • 插值

interp1, interp2, interp3, interpn: 一维、二维、三维和多维插值。

x = gpuArray(linspace(0, 10, 100));y = sin(x);xi = gpuArray(linspace(0, 10, 200));yi = interp1(x, y, xi, 'spline'); % 在 GPU 上进行插值
  • 多项式拟合

polyfit, polyval: 多项式拟合和评估。

p = polyfit(x, y, 3); % 在 GPU 上进行三次多项式拟合y_fit = polyval(p, x); % 评估拟合的多项式

图像处理

  • 基本操作

imresize, imrotate, imcrop, rgb2gray, gray2rgb: 图像缩放、旋转、裁剪和颜色空间转换。

I = gpuArray(imread('peppers.png'));I_gray = rgb2gray(I); % 在 GPU 上将彩色图像转换为灰度图像
  • 滤波

imfilter, conv2: 图像滤波和卷积。

h = gpuArray(fspecial('gaussian', [11, 11], 4));I_blurred = imfilter(I, h); % 在 GPU 上进行高斯滤波

其他操作

  • 排序和索引

sort, find, unique, diff: 排序、查找、唯一值和差分。

sorted_A = sort(A); % 在 GPU 上对数组排序
  • 逻辑运算

and, or, not, xor: 逻辑操作。

mask = A > 0.5;

7举例


% 矩阵运算示例n = 1000;A = gpuArray(rand(n)); % 在 GPU 上创建一个随机矩阵B = gpuArray(rand(n));C = A * B; % 在 GPU 上进行矩阵乘法C_cpu = gather(C); % 将结果从 GPU 转回 CPU % 图像处理示例I = gpuArray(imread('peppers.png')); % 将图像读取到 GPUI_gray = rgb2gray(I); % 在 GPU 上进行灰度转换h = gpuArray(fspecial('gaussian', [11, 11], 4));I_blurred = imfilter(I_gray, h); % 在 GPU 上进行高斯滤波I_result = gather(I_blurred); % 将处理后的图像传回 CPUimshow(I_result); % 显示结果图像


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
关闭