主要内容

测量和改进GPU性能

测量GPU性能

在GPU上测量代码性能

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

例如,测量时间函数用于计算随机矩阵的LU因式分解一个的大小N——- - - - - -N.属性的函数句柄可执行此测量函数,并将函数句柄传递给gputimeit

N = 1000;A = rand(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查看代码的每个部分需要多长时间®分析器。有关分析代码的详细信息,请参见配置文件而且分析代码以提高性能.分析器对于识别代码中的性能瓶颈很有用,但不能准确地对GPU代码进行计时,因为它没有考虑重叠执行,这在使用GPU时很常见。

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

计时方法 合适的任务 限制
gputimeit 为单个函数计时
  • 因为gputimeit函数需要一个函数句柄作为参数,您只能使用此方法对单个函数计时。然而,您计时的函数可能包含对其他函数的调用。

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

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

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

MATLAB分析器 发现性能瓶颈

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

GPU基准测试

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

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

  • 使用gpuBench以单精度和双精度测试内存和计算密集型任务。gpuBench可以从Add-On Explorer或MATLAB Central File Exchange下载。有关更多信息,请参见//www.tatmou.com/matlabcentral/fileexchange/34080-gpubench

提升GPU性能

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

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

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

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

普遍适用的

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

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

普遍适用的

方法中所述的分析程序不能用于精确计时在GPU上运行的代码在GPU上测量代码性能部分。

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

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

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

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

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

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

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

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

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

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

  • 并非所有内置的MATLAB函数都受支持。金宝app

有关受支持的功能和其他限制的信息,请参见金宝apparrayfun

使用pagefun-在一次调用中执行大量矩阵操作

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

并非所有内置的MATLAB函数都受支持。金宝app有关受支持的功能和其他限制的信息,请参见金宝apppagefun

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

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

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

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

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

使用GPU阵列

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

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

提示

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

简介和提高你的简历MATLAB代码

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

因为MATLAB分析器独立运行每一行代码,所以它不考虑重叠执行,这在使用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函数将一个基于元素的MATLAB函数转换为自定义CUDA内核,从而减少了执行操作的开销。你可以经常使用arrayfun使用你的代码子集,即使arrayfun不支持您的整个代码金宝app。使用以下方法可以提高各种各样的元素函数的性能arrayfun,包括在循环或分支代码中执行许多元素操作的函数,以及在其中嵌套函数访问父函数中声明的变量的嵌套函数。

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

提高小矩阵运算的性能

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

写入包含CUDA代码的MEX文件

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

为GPU性能配置硬件

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

在Windows上®在系统中,GPU设备有两种模式:Windows显示驱动程序模型(WDDM)或Tesla计算集群(TCC)模式。要获得代码的最佳性能,请将用于计算的设备设置为TCC模式。有关切换模式以及哪些GPU设备支持TCC模式的更多信息,请参阅NVIDIA文档。金宝app

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

另请参阅

|||||||

相关的话题