技术文章和通讯

在MATLAB GPU编程

吉尔里斯,MathWorks和莎拉•Zaranek MathWorks


多核机器和超线程技术使科学家、工程师和金融分析师加速计算密集型应用程序在不同的学科。今天,另一种类型的硬件承诺更高的计算性能:图形处理单元(GPU)。

最初用于加速图形渲染,gpu正越来越多地应用于科学计算。与传统的CPU,包括不超过少数核心,GPU的大规模并行阵列整数和浮点处理器,以及专用高速内存。一个典型的GPU处理器包括数以百计的这些小(图1)。

gpu_fig1_w.jpg
图1所示。比较核心的数量的CPU和GPU。

大大增加吞吐量GPU成为可能,然而,有代价的。首先,内存访问成为一个更有可能为你的计算瓶颈。数据必须被发送之前CPU和GPU计算,然后检索之后。因为GPU是连接到主机CPU通过PCI Express总线、内存访问是低于通过传统的CPU。1这意味着你的整体计算加速传输的数据量是有限的,发生在你的算法。第二,在C或Fortran编程gpu需要不同的心智模型和一个技能,可以困难和耗时的收购。此外,你必须花时间调整为特定GPU来优化您的应用程序代码的峰值性能。

本文演示功能并行计算工具使您能够运行您的MATLAB®代码在GPU通过几个简单的代码更改。我们说明这种方法通过求解一个二阶波动方程使用光谱方法。

为什么并行化波动方程解算器?

波方程被用于广泛的工程学科,包括地震学、流体动力学、声学、电磁学、描述声音,光,和流体波。

一个算法,利用光谱方法来解决波方程并行化是一个很好的候选人,因为它符合这两个标准加速度使用GPU(见“将执行在GPU加速我的应用程序?”):

它是计算密集型。算法执行许多快速傅里叶变换(fft算法)和逆快速傅里叶变换(传输线)。确切的数量取决于网格的大小(图2)和时间步的数量包括在模拟。每个时间步需要两个fft算法和四个传输线上不同的矩阵,和一个计算可以涉及到成千上万的时间步骤。

这是大规模并行。并行FFT算法的目的是“分而治之”,这样类似的任务执行多次在不同的数据。此外,该算法需要大量的处理线程之间的通信和大量的内存带宽。传输线同样可以并行地运行。

图2。解一个二阶波动方程在32 x 32的网格。

将执行GPU加速我的申请?

GPU可以加速应用程序如果它符合下面两个条件:

计算密集型——时间计算大大超过传输数据所花费的时间与GPU内存。

大规模并行——计算可以分为数百或数千个独立的工作单元。

不满足这些标准的应用程序可能会在GPU比在一个CPU上运行慢。

在MATLAB GPU计算

在继续波动方程的例子之前,让我们快速回顾与GPU MATLAB是如何工作的。

FFT、传输线和线性代数操作中超过100内置的MATLAB函数可以直接在GPU上执行,通过提供一个输入参数的类型GPUArray,一个特殊的并行计算工具箱提供的数组类型。这些GPU-enabled功能重载——换句话说,他们根据不同的数据类型的参数传递给他们。

例如,下面的代码使用一个FFT算法来找到一个向量的离散傅里叶变换的伪随机数在CPU上:

一个=兰德(2 ^ 16,1);

B = fft (A);

GPU执行相同的操作,我们首先使用gpuArray从MATLAB命令传输数据工作区设备内存。然后我们可以运行fft,这是一个重载函数的数据:

= gpuArray(兰德(2 ^ 16,1));

B = fft (A);

fftGPU上执行的操作,而不是CPU输入(GPUArray)以来在GPU上举行。

结果,B,存储在GPU上。然而,它仍然是可见的MATLAB工作区。通过运行类(B),我们可以看到,它是一个GPUArray。

类(B)

ans =

parallel.gpu.GPUArray

我们可以继续操作使用GPU-enabled函数B在设备上。例如,设想我们的结果,情节命令自动GPUArrays工作:

情节(B);

返回数据回当地的MATLAB工作空间,您可以使用收集命令;例如

C =收集(B);

C现在是一个双在MATLAB和可操作的任何工作在双打的MATLAB函数。

在这个简单的示例中,所节省的时间执行一个FFT函数通常小于所花费的时间将向量从MATLAB工作区和设备内存。这通常是真的,但依赖于硬件和大小的数组。数据传输开销可以变得如此重要,它会降低应用程序的总体性能,特别是如果你反复CPU和GPU之间交换数据执行计算密集型操作相对较少。更高效的执行一些操作在GPU上的数据时,将回到CPU的数据只有在需要时2

注意,gpu,如cpu,有限的记忆。但是,与cpu,他们没有能力交换内存和磁盘。因此,您必须验证数据不超过在GPU上你想保持它的内存限制,特别是当你使用大型矩阵。通过运行gpuDevice你可以查询你的GPU卡,获取信息如姓名、总内存和可用内存。

实现和加速算法在MATLAB解决波动方程

融入上面的例子中,我们实现了GPU的功能在一个真正的问题。我们计算的目标是解决二阶波动方程

\[\压裂{\部分^ 2 u}{\部分t ^ 2} = \压裂{\部分^ 2 u}{\部分x ^ 2} + \压裂{\部分^ 2 u}{\偏y ^ 2} \]

条件\ (u = 0 \)的边界。我们使用一个算法基于光谱方法来解决方程在空间和二阶中心有限差分法解方程。

谱方法是常用的解决偏微分方程。用谱方法,解决方法是近似连续的基函数的线性组合,如正弦和余弦。在本例中,我们用切比雪夫谱方法,它利用切比雪夫多项式基函数。

在每一个时间步,计算当前解的二阶导数在\ (x \)和\ (y \)尺寸用切比雪夫谱方法。使用这些衍生品与旧的解决方案和当前的解决方案,我们应用二阶中心差分方法(也称为跨跃方法)计算新的解决方案。我们选择一个时间步,保持这种跨跃方法的稳定性。

MATLAB算法的运算量,以及元素的数量的网格计算解决方案的增长,时间的算法执行急剧增加。当一个CPU上执行使用2048 x 2048网格,需要超过一分钟完成50次步骤。注意,这一次已包括在MATLAB固有的多线程的性能优势。自R2007a, MATLAB支持多线程计算的功能。这些函数自动执行多个线程而不需要在代码中显式地指定命令创建线程。

在考虑如何使用并行计算加速这个计算工具箱,我们将把重点放在执行的代码为每个时间步计算。图3说明了变化需要算法在GPU上运行。注意,GPU-enabled重载函数的计算涉及到MATLAB操作可通过并行计算工具。这些操作包括FFT和传输线,矩阵乘法和各种element-wise操作。因此,我们不需要以任何方式改变算法在GPU执行它。我们只是将数据传输到GPUgpuArray在进入循环在每个时间步计算结果。

代码比较工具显示不同的CPU和GPU版本的代码。GPU和CPU版本超过84%的代码共同之处(94 111行)
图3。代码比较工具显示不同的CPU和GPU版本的代码。GPU和CPU版本超过84%的代码共同之处(94行,111)。

GPU的计算执行之后,我们将结果GPU和CPU。每个变量引用GPU-enabled函数必须在GPU上创建或转移到GPU之前使用它。

转换的一个重量用于光谱微分GPUArray变量,我们使用

W1T = gpuArray (W1T);

某些类型的数组可以直接在GPU上构造,而不用我们把他们从MATLAB工作区。例如,要创建一个矩阵的零直接在GPU上,我们使用

uxx = parallel.gpu.GPUArray.zeros (N + 1, N + 1);

我们使用收集函数将数据从GPU;例如:

vvg =收集(vv);

请注意,有一个单一的数据转移到GPU,紧随其后的是一个从GPU传输数据。每个时间步的计算都是在GPU上执行。

比较CPU和GPU执行速度

评估使用GPU的好处来解决二阶波方程,我们运行了一个基准研究,我们测量算法的时间花了50执行时间步骤网格大小的64年,128年,512年、1024年和2048年英特尔®至强®使用英伟达处理器X5650然后®特斯拉C2050 GPU。

网格大小为2048,该算法显示了7.5 x减少CPU计算时间从超过一分钟不到10秒的GPU(图4)。对数尺度图显示CPU实际上是更快的为小网格大小。随着技术的发展和成熟,然而,GPU越来越能够处理小问题的解决方案,这一趋势我们期望继续。

gpu_fig5_w.jpg
图4。情节的基准测试结果显示所需的时间完成50次步骤对不同网格大小,使用一个线性尺度(左)或对数尺度(右)。

先进的GPU和MATLAB编程

并行计算工具箱提供了一个直接的方法来加快MATLAB代码通过执行GPU。只需改变一个函数的输入的数据类型可以利用许多MATLAB命令GPUArrays已经超载。(内置的MATLAB函数的完整列表,支持GPUArray是可用的并行计算工具箱文档)。

加速算法与GPU多个简单的操作,您可以使用arrayfun,应用一个函数数组的每个元素。因为arrayfun是一个GPU-enabled函数,将会导致内存开销只在单一的电话转给吗arrayfun,而不是在每个操作。

最后,经验丰富的程序员编写自己的CUDA并行计算中的代码可以使用CUDAKernel接口工具箱与MATLAB集成代码。CUDAKernel接口支持更细粒度的控制加速的部分代码的性能瓶颈。它创建一个MATLAB对象,它提供了访问现有的内核编译成PTX代码(PTX低级并行线程执行指令集)。然后调用函数宏指令命令来评估GPU上的内核,使用MATLAB数组作为输入和输出。

总结

工程师和科学家们成功地采用GPU技术,最初用于加速图形渲染,加速他们的专门规程的计算。以最小的努力和没有gpu的广泛知识,您现在可以使用与MATLAB gpu的有前途的力量。GPUArrays和GPU-enabled MATLAB函数帮助你加快MATLAB操作没有低级CUDA编程。如果您已经熟悉gpu编程,MATLAB还允许您将您现有的CUDA内核集成到MATLAB应用程序不需要任何额外的C编程。

实现与GPU加速效果,您的应用程序必须满足某些标准,其中的CPU和GPU之间发送的数据必须采取更少的时间比通过运行在GPU上的性能。如果您的应用程序满足这些标准,这是一个很好的候选人GPU的范围与MATLAB功能。

GPU术语表

CPU(中央处理器)。中央单位在计算机负责计算和控制或监督的其他部分的电脑。CPU执行逻辑和浮点运算在计算机内存中的所有数据。

GPU(图形处理器)。可编程芯片最初用于图形渲染。GPU的高度并行结构使它们更有效的算法比通用cpu的处理大量的数据并行完成的。

核心。一个独立的计算单元内CPU或GPU芯片。CPU和GPU核心不是相当于对方;GPU核心执行专业的操作而CPU核心设计通用程序

CUDA®从NVIDIA并行计算技术®由一个并行计算的体系结构和开发工具,为GPU计算库和编程指令。

设备。包含GPU硬件卡及其相关的记忆。

主机。CPU和系统内存。

内核。编写的代码在GPU执行。内核函数,可以在大量的线程上运行。并行度来自每个线程独立运行相同的程序在不同的数据。

2011 - 91967 v01出版

引用

  1. 看到第六章(内存优化)的NVIDIA CUDA C的最佳实践”文档了解更多信息关于潜在的GPU图形计算瓶颈和优化内存访问。

  2. 看到第六章(内存优化)的NVIDIA CUDA C的最佳实践”文档进一步提高性能通过最小化数据传输的信息。

Baidu
map