测量和改进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 |
为单个函数计时 |
|
抽搐 而且toc |
计时多行代码或整个工作流 |
|
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运行你的代码 |
普遍适用的 | 函数必须支持金宝app |
配置文件和改进您的MATLAB代码-分析你的代码以识别瓶颈 |
普遍适用的 | 方法中所述的分析程序不能用于精确计时在GPU上运行的代码在GPU上测量代码性能部分。 |
Vectorize计算-用矩阵和向量操作替换for循环 |
当在for循环中运行操作向量或矩阵的代码时 | 有关更多信息,请参见使用向量化. |
在单精度执行计算-通过使用较低精度的数据来减少计算 |
当值的范围较小和精度较低是可以接受的 | 某些类型的计算,例如线性代数问题,可能需要双精度处理。 |
使用 |
|
有关受支持的功能和其他限制的信息,请参见金宝app |
使用 |
当使用对大量小矩阵执行独立矩阵运算的函数时 | 并非所有内置的MATLAB函数都受支持。金宝app有关受支持的功能和其他限制的信息,请参见金宝app |
写入包含CUDA代码的MEX文件-访问额外的GPU函数库 |
当你想访问NVIDIA®库或高级CUDA功能 | 需要使用CUDA c++框架编写的代码。 |
为GPU性能配置硬件-充分利用硬件 |
普遍适用的 |
|
使用GPU阵列
如果您的代码使用的所有函数都在GPU上得到支持,那么惟一必要的修改就是通过调用将输入数据传金宝app输到GPUgpuArray
.获取支持的MATLAB函数列表金宝appgpuArray
输入,看到在图形处理器上运行MATLAB函数.
一个gpuArray
对象将数据存储在GPU内存中。因为MATLAB和其他工具箱中的大多数数值函数都支持金宝appgpuArray
对象,你通常可以通过做最小的改变在GPU上运行你的代码。这些函数需要gpuArray
输入,在GPU上执行计算,然后返回gpuArray
输出。一般来说,这些函数支持与在CPU上运行的标准MATLAB金宝app函数相同的参数和数据类型。
简介和提高你的简历MATLAB代码
当将MATLAB代码转换为在GPU上运行时,最好从性能已经良好的MATLAB代码开始。许多编写在CPU上运行良好的代码的指导方针也将提高在GPU上运行的代码的性能。你可以使用MATLAB分析器分析你的CPU代码。在CPU上花费最多时间的代码行可能是您应该改进或考虑转移到GPU上使用的代码行gpuArray
对象。有关分析代码的详细信息,请参见分析代码以提高性能.
因为MATLAB分析器独立运行每一行代码,所以它不考虑重叠执行,这在使用GPU时很常见。计算整个算法的使用时间抽搐
而且toc
或gputimeit
如在在GPU上测量代码性能部分。
Vectorize计算
在GPU上,向量、矩阵和高维操作通常比标量操作执行得更好,因为GPU通过并行计算许多结果来实现高性能。通过重写循环来使用高维操作,可以获得更好的性能。修改基于循环的、面向标量的代码以使用MATLAB矩阵和矢量操作的过程被称为向量化.有关向量化的信息,请参见使用向量化而且使用GPU和向量化计算提高性能.这张图来自使用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
函数。
另请参阅
gpuDevice
|gputimeit
|抽搐
|toc
|gpuArray
|arrayfun
|pagefun
|mexcuda