主要内容

测量和改进GPU性能

测量GPU的性能

在GPU上测量代码性能

衡量代码性能的一个重要指标是它运行所需的时间。为在GPU上运行的代码计时的最佳方法是使用gputimeit函数,该函数多次运行一个函数以平均变化并补偿开销。的gputimeit功能还可以保证在记录时间之前对GPU的所有操作都是完成的。

例如,测量时间函数的值来计算随机矩阵的LU分解一个的大小N——- - - - - -N.方法的函数句柄来执行此度量函数,并将函数句柄传递给gputimeit

N = 1000;兰德(N =“gpuArray”);f = @() lu(A);numOutputs = 2;numOutputs gputimeit (f)

您还可以使用抽搐而且toc.然而,要获得在GPU上运行的代码的准确计时信息,必须在调用之前等待操作完成抽搐而且toc.要做到这一点,可以使用等待函数与一个gpuDevice对象作为其输入。例如,测量计算矩阵的LU分解所花费的时间一个使用抽搐toc,等待

D = gpuDevice;wait(D) tic [L,U] = lu(A);等待(D) toc

您可以使用MATLAB查看代码的每个部分花了多长时间®分析器。有关分析代码的更多信息,请参见配置文件而且分析代码以提高性能.Profiler对于识别代码中的性能瓶颈非常有用,但不能准确计算GPU代码的时间,因为它没有考虑到重叠执行,这在使用GPU时很常见。

使用这个表可以帮助您决定使用哪种计时方法。

计时方法 合适的任务 限制
gputimeit 个人时间函数
  • 因为gputimeit函数需要函数句柄作为参数,因此只能使用此方法对单个函数进行计时。但是,您所计时的函数可以包含对其他函数的调用。

  • 因为gputimeit函数多次执行函数以考虑初始化开销,此方法通常不适合为长时间运行的函数计时。

抽搐而且toc 计时多行代码或整个工作流
  • 为了确保所有的GPU计算都完成,你必须调用等待在调用之前toc.类似地,如果前面的代码运行在GPU上,调用等待在调用之前抽搐

  • 你不能使用抽搐而且toc的执行时间gputimeit

MATLAB分析器 发现性能瓶颈

Profiler独立地运行每一行代码,不考虑重叠执行,这在使用GPU时很常见。你不能使用Profiler作为一种精确计算GPU代码时间的方法。

GPU基准测试

基准测试对于识别GPU的优缺点以及比较不同GPU的性能非常有用。使用以下基准测试来测量GPU的性能:

  • 运行测量GPU的性能示例获取关于您的GPU的详细信息,包括PCI总线速度,GPU内存读写,以及双精度矩阵计算的峰值计算性能。

  • 使用gpuBench测试内存和计算密集型任务的单精度和双精度。gpuBench可以从Add-On Explorer或MATLAB中央文件交换下载。有关更多信息,请参见//www.ru-cchi.com/matlabcentral/fileexchange/34080-gpubench

提高GPU性能

在MATLAB中GPU计算的目的是加速你的代码。通过实现编写代码和配置GPU硬件的最佳实践,您可以在GPU上获得更好的性能。下面将讨论各种提高性能的方法,首先从最容易实现的方法开始。

使用这个表可以帮助您决定使用哪些方法。

性能改进方法 我什么时候应该使用这种方法? 限制

使用GPU数组-将GPU数组传递给支持的函数以在GPU上运行你的代码

普遍适用的

您的函数必须支持gpuArray输入。以获取支持的MATLAB函数列表gpuArray输入,看到在图形处理器上运行MATLAB函数

分析和改进您的MATLAB代码-分析你的代码以识别瓶颈

普遍适用的

剖析器不能用于准确的时间代码运行在GPU上描述在GPU上测量代码性能部分。

Vectorize计算-用矩阵和向量操作替换for循环

当运行for循环中对向量或矩阵进行操作的代码时

有关更多信息,请参见使用向量化

执行单精度计算-通过使用较低精度的数据减少计算

当可以接受较小的值范围和较低的精度

某些类型的计算,例如线性代数问题,可能需要双精度处理。

使用arrayfun-使用自定义CUDA执行元素类函数®内核

  • 当使用执行许多元素相关操作的函数时

  • 当嵌套函数需要访问父函数中声明的变量时

  • 改变输入或输出数组的大小或形状的操作(重塑,等等)不受支持。

  • 并不是所有的内置MATLAB函数都被支持。

有关支持的功能和其他限制的信息,请参见arrayfun

使用pagefun-在一次调用中执行大量矩阵运算

当使用对大量小矩阵执行独立矩阵运算的函数时

并不是所有的内置MATLAB函数都被支持。有关支持的功能和其他限制的信息,请参见pagefun

写MEX文件包含CUDA代码-访问额外的GPU函数库

当你想访问NVIDIA®库或高级CUDA功能 需要使用CUDA c++框架编写的代码。

为GPU性能配置硬件-充分利用你的硬件

普遍适用的
  • 并非所有NVIDIA GPU设备都支持TCC模式。

  • TCC模式的GPU设备仅用于计算,不提供显示输出。

使用GPU数组

如果您的代码使用的所有函数都在GPU上得到支持,那么惟一必要的修改就是通过调用将输入数据传输到GPUgpuArray.以获取支持的MATLAB函数列表gpuArray输入,看到在图形处理器上运行MATLAB函数

一个gpuArray对象将数据存储在GPU内存中。因为大多数数值函数在MATLAB和许多其他工具箱中都支持gpuArray对象,你通常可以通过做最小的更改在GPU上运行你的代码。这些功能需要gpuArray在GPU上执行计算,然后返回gpuArray输出。通常,这些函数支持与在CPU上运行的标准MATLAB函数相同的参数和数据类型。

提示

为了减少开销,请限制在主机内存和GPU之间传输数据的次数。在可能的情况下直接在GPU上创建数组。更多信息请参见,直接创建GPU阵列.类似地,仅将数据从GPU传输回主机内存使用收集如果数据需要在不支持的代码中显示、保存或使用gpuArray对象。

简介和改进你的MATLAB代码

当将MATLAB代码转换为在GPU上运行时,最好从已经运行良好的MATLAB代码开始。编写在CPU上运行良好的代码的许多指导原则也将提高在GPU上运行的代码的性能。您可以使用MATLAB分析器分析您的CPU代码。在CPU上花费最多时间的代码行可能是你应该改进或考虑转移到GPU上使用的代码行gpuArray对象。有关分析代码的更多信息,请参见分析代码以提高性能

因为MATLAB Profiler独立地运行每一行代码,它不考虑重叠执行,这在使用GPU时很常见。来计算整个算法的使用时间抽搐而且tocgputimeit正如在在GPU上测量代码性能部分。

Vectorize计算

向量、矩阵和高维运算在GPU上的性能通常比标量运算好得多,因为GPU通过并行计算许多结果来实现高性能。您可以通过重写循环来使用高维操作来获得更好的性能。修改基于循环的、面向标量的代码以使用MATLAB矩阵和向量运算的过程被称为向量化.有关向量化的信息,请参见使用向量化而且使用GPU和向量化计算提高性能.这幅图来自使用GPU和向量化计算提高性能示例显示了通过向量化在CPU和GPU上执行的函数所实现的性能提升。

条形图显示,通过向量化计算,CPU和GPU的执行都显著减少了函数执行时间。

执行单精度计算

你可以通过单精度计算而不是双精度计算来提高运行在你的GPU上的代码的性能。当CPU计算从双精度切换到单精度时,就不能提供这种改进,因为大多数GPU卡是为图形显示设计的,这要求较高的单精度性能。有关将数据转换为单精度数据和在单精度数据上执行算术运算的详细信息,请参见浮点数

适合在GPU上进行单精度计算的工作流的典型例子包括图像处理和机器学习。然而,其他类型的计算,如线性代数问题,通常需要双精度处理。默认情况下,深度学习工具箱™在单一精度下执行许多操作。有关更多信息,请参见深度学习精度(深度学习工具箱)

具体性能提升取决于GPU卡和总核数。高端计算卡通常表现出较小的改进。有关NVIDIA GPU卡的全面性能概述,包括单精度和双精度处理能力,请参阅https://en.wikipedia.org/wiki/List_of_Nvidia_graphics_processing_units

改进基于元素的函数的性能

如果您有一个基于元素的函数,您通常可以通过用来调用它来提高它的性能arrayfun.的arrayfun函数在GPU上将一个基于元素的MATLAB函数转换为自定义CUDA内核,从而减少了执行操作的开销。你可以经常使用arrayfun即使你的代码的一个子集arrayfun不支持您的整个代码。各种各样的基于元素的函数的性能可以通过使用arrayfun,包括在循环或分支代码中执行许多基于元素的操作的函数,以及在其中嵌套函数访问父函数中声明的变量的嵌套函数。

利用arrayfun提高基于元素的MATLAB函数在GPU上的性能的一个基本应用实例arrayfun.的使用GPU arrayfun进行蒙特卡罗模拟示例显示了arrayfun用于提高在循环中执行按元素操作的函数的性能。的Stencil图形处理器的操作示例显示了arrayfun用于调用访问父函数中声明的变量的嵌套函数。

提高小矩阵运算的性能

如果您有一个函数,它对大量小矩阵执行独立的矩阵运算,您可以通过调用pagefun.您可以使用pagefun在GPU上并行执行矩阵运算,而不是在矩阵上循环。的利用pagefun在GPU上提高小矩阵问题的性能示例显示如何使用pagefun当操作许多小矩阵时。

写MEX文件包含CUDA代码

虽然MATLAB提供了一个广泛的gpu支持函数库,但您可以访问MATLAB中没有类似函数的附加函数库。示例包括NVIDIA库,如NVIDIA性能原语(NPP)、cuRAND和cuFFT库。可以编译在CUDA c++框架中编写的MEX文件mexcuda函数。您可以在MATLAB中执行编译好的MEX文件,并调用NVIDIA库中的函数。这是一个演示如何编写和运行MEX函数的示例gpuArray输入,并返回gpuArray输出,看到运行包含CUDA代码的mex -函数

为GPU性能配置硬件

因为许多计算需要大量的内存,而且大多数系统经常使用GPU进行图形处理,所以使用相同的GPU进行计算和图形处理通常是不切实际的。

在Windows上®在系统中,GPU设备有两种模式:WDDM (Windows Display Driver Model)模式和TCC (Tesla Compute Cluster)模式。要获得代码的最佳性能,请将用于计算的设备设置为TCC模式。有关切换模式以及哪些GPU设备支持TCC模式的更多信息,请参考NVIDIA文档。

为了减少GPU内存耗尽的可能性,不要在MATLAB的多个实例上使用一个GPU。要查看哪些GPU设备可用并已选中,请使用gpuDeviceTable函数。

另请参阅

|||||||

相关的话题

Baidu
map