测量和提高GPU性能
测量GPU的性能
测量代码GPU的性能
您的代码的性能的一个重要措施是需要多长时间。时间代码运行在GPU的最好办法是使用gputimeit
函数运行一个函数多次平均变异和补偿开销。的gputimeit
函数还确保所有操作在GPU完成之前记录的时间。
例如,测量的时间陆
函数计算一个随机矩阵的LU分解一个
的大小N
——- - - - - -N
。要执行该测量,创建一个函数句柄陆
函数和传递函数句柄gputimeit
。
N = 1000;兰德(N =“gpuArray”);f = @陆()();numOutputs = 2;numOutputs gputimeit (f)
你也可以时间代码使用抽搐
和toc
。然而,为了获得准确的时间信息代码运行在GPU,你必须在调用之前等待操作完成抽搐
和toc
。要做到这一点,您可以使用等待
函数与一个gpuDevice
对象作为输入。例如,测量时间计算矩阵的LU分解一个
使用抽搐
,toc
,等待
。
D = gpuDevice;等待(D)抽搐(L U) = lu (A);等待(D) toc
您可以查看代码的每一部分需要多长时间使用MATLAB®分析器。分析代码的更多信息,请参阅配置文件
和概要文件代码来提高性能。识别性能瓶颈的分析器是有用的在您的代码中但不能准确时间GPU代码,因为它不占重叠执行,这是很常见的,当你使用GPU。
使用这个表格来帮助你决定使用哪一个计时方法。
计时方法 | 合适的任务 | 限制 |
---|---|---|
gputimeit |
个人时间函数 |
|
抽搐 和toc |
时间多行代码或者整个工作流 |
|
MATLAB分析器 | 发现性能瓶颈 | 分析器独立运行的每一行代码,不占重叠执行,这是很常见的,当你使用GPU。你不能使用GPU代码分析器来准确的时间。 |
GPU基准测试
基准测试是有用的对于识别的优点和缺点GPU和比较不同GPU的性能。测量GPU的性能通过使用这些基准测试:
运行测量GPU的性能GPU例子来获得详细信息,包括PCI总线速度,GPU内存读/写和峰值计算双精度矩阵计算的性能。
使用
gpuBench
测试内存和计算密集型任务单和双精度。gpuBench
可以从插件浏览器下载或从MATLAB中央文件交换。有关更多信息,请参见//www.tianjin-qmedu.com/matlabcentral/fileexchange/34080-gpubench。
提高GPU性能
在MATLAB GPU计算的目的是加快您的代码。可以取得更好的性能在GPU上实现编写代码的最佳实践和配置您的GPU硬件。下面讨论了各种方法来提高性能,从最简单的实现。
用这个表来帮助你决定使用哪些方法。
性能改进方法 | 我什么时候应该使用这种方法? | 限制 |
---|---|---|
使用GPU数组——支持GPU数组传递给函数在GPU上运行万博1manbetx您的代码 |
普遍适用的 | 函数必须支持万博1manbetx |
概要文件和改善你的MATLAB代码——文件代码识别瓶颈 |
普遍适用的 | 分析器不能用于准确时间代码运行在GPU中描述测量代码GPU的性能部分。 |
Vectorize计算——用矩阵和向量操作代替for循环 |
运行代码时作用于向量或矩阵在for循环 | 有关更多信息,请参见使用向量化。 |
执行计算的精度——减少使用低精度的计算数据 |
当小范围的值和较低的精度是可以接受的 | 某些类型的计算,如线性代数问题,可能需要双精度加工。 |
使用 |
|
支持信息功能和额外的限制,明白了万博1manbetx |
使用 |
当使用一个函数来执行独立的矩阵运算大量的小型矩阵 | 并不是所有支持内置的MATLAB函数。万博1manbetx支持信息功能和额外的限制,明白了万博1manbetx |
编写包含CUDA墨西哥人文件的代码——访问GPU的附加的库函数 |
当你想要访问NVIDIA®库或高级CUDA功能 | 需要使用CUDA c++编写的代码框架。 |
为GPU的性能配置您的硬件——充分利用您的硬件 |
普遍适用的 |
|
使用GPU数组
如果所有的功能,你的代码使用支持GPU,唯一必要的修改是将输入数据转移到GPU通过调用万博1manbetxgpuArray
。支持的MATLAB函数的列表万博1manbetxgpuArray
输入,看到运行在GPU MATLAB函数。
一个gpuArray
对象将数据存储在GPU内存。因为大多数在MATLAB数值函数和其它许多工具箱支持万博1manbetxgpuArray
对象,通常你可以在GPU上运行您的代码通过最小的变化。这些功能需要gpuArray
输入,GPU执行计算,并返回gpuArray
输出。一般来说,这些功能支持相同的参数和数据类型作为标准MAT万博1manbetxLAB函数在CPU上运行。
形象和提高你的MATLAB代码
将MATLAB代码转换为运行在GPU时,最好先从MATLAB代码已经表现良好。许多指南编写代码在一个CPU上运行也会提高代码运行在GPU的性能。您可以配置您的CPU使用MATLAB代码分析器。行代码,以最可能会在CPU上的时间,你应该改善或考虑到GPU移动使用gpuArray
对象。分析代码的更多信息,请参阅概要文件代码来提高性能。
由于MATLAB分析器独立运行的每一行代码,它不考虑重叠执行,当你使用GPU中很常见。整个算法使用抽搐
和toc
或gputimeit
中描述的那样测量代码GPU的性能部分。
Vectorize计算
向量,矩阵和高维操作通常对GPU执行比标量操作因为GPU实现高性能并行计算许多结果。你可以取得更好的性能通过重写循环利用高维操作。修改循环的过程中,scalar-oriented代码使用MATLAB矩阵和向量操作向量化。向量化的信息,请参阅使用向量化和使用GPU和矢量化计算提高性能。这张图的使用GPU和矢量化计算提高性能示例显示了性能的增加通过vectorizing函数执行的CPU和GPU。
执行计算的精度
你可以提高代码运行在GPU的性能通过计算在单精度而不是双精度。CPU计算时不提供这种改进从双切换到单精度,因为大多数GPU卡是为图形显示设计的,要求高的单精度性能。更多信息将数据转换为单精度和对单精度数据、执行算术运算浮点数。
工作流的典型例子适合GPU的单精度计算包括图像处理和机器学习。然而,其他类型的计算,如线性代数问题,通常需要双精度加工。深度学习工具箱™执行许多操作在默认情况下在单精度。有关更多信息,请参见深度学习精度(深度学习工具箱)。
具体的性能改进取决于核心的GPU卡和总数。高端计算卡片通常显示一个小的改进。综合性能概述的NVIDIA GPU卡,包括单-和双精度处理能力,明白了https://en.wikipedia.org/wiki/List_of_Nvidia_graphics_processing_units。
提高性能的Element-Wise功能
如果你有以聪明元素函数,通常可以改善其性能,通过调用它arrayfun
。的arrayfun
函数在GPU以聪明元素MATLAB函数变成一个定制的CUDA内核,从而降低执行操作的开销。你可以经常使用arrayfun
与你的代码,即使一个子集arrayfun
不支持你的整个代码万博1manbetx。各种element-wise的性能可以改善使用功能arrayfun
,包括循环中执行许多element-wise操作的函数或分支代码,和嵌套函数的嵌套函数访问其父函数中声明的变量。
的提高性能使用arrayfun Element-Wise MATLAB函数的GPU示例显示了一个基本的应用arrayfun
。的使用GPU arrayfun蒙特卡罗模拟示例显示了arrayfun
用于提高性能的一个函数执行一个循环内element-wise经营。的对GPU模板操作示例显示了arrayfun
用于调用一个嵌套函数访问父函数中声明的变量。
提高性能的操作在小矩阵
如果有一个函数,它执行独立的矩阵运算大量的小矩阵,可以改善其性能,通过调用它pagefun
。您可以使用pagefun
在GPU并行执行矩阵操作而不是循环矩阵。的提高性能的小型矩阵问题使用pagefun GPU示例显示了如何提高使用性能pagefun
当操作在许多小矩阵。
编写包含CUDA墨西哥人文件的代码
而MATLAB提供了一个广泛的图书馆GPU-enabled功能,您可以访问图书馆额外的MATLAB函数没有相似之处。例子包括NVIDIA库如NVIDIA表现原语(NPP)和cuRAND库。可以编译墨西哥人文件写在CUDA c++框架使用mexcuda
函数。您可以执行编译后的墨西哥人在MATLAB和从NVIDIA调用函数库文件。为例,展示了如何编写和运行墨西哥人的功能gpuArray
输入,并返回gpuArray
输出,看到运行包含CUDA MEX-Functions代码。
为GPU的性能配置您的硬件
因为许多计算需要大量的内存和大多数系统经常使用GPU图形,使用相同的GPU的计算和图形通常是不切实际的。
在Windows上®系统,GPU设备有两种操作模式:Windows显示驱动模型(WDDM)或特斯拉计算集群(太极拳)。为您的代码实现最佳性能,设置你的设备用于计算使用移行细胞癌模型。看哪个模型你的GPU设备正在使用,检查DriverModel
属性返回的gpuDevice
函数。为更多的信息交换模型和GPU设备支持移行细胞癌模型,查阅英伟达文档。万博1manbetx
减少的可能性在GPU内存耗尽,不要使用MATLAB GPU在多个实例之一。看到GPU设备是可用的和选择使用gpuDeviceTable
函数。
另请参阅
gpuDevice
|gputimeit
|抽搐
|toc
|gpuArray
|arrayfun
|pagefun
|mexcuda