之前做算法的并行优化加速时,学习过Nvida的CUDA框架,也了解过一些AMD的OpenCL的通用加速框架。最近发现了微软研究人员2011年开发的直接支持C++编程语言的C++AMP框架,简单易用,直接面向C++编程。抱着技多不压身的态度,准备系统的学习一下。
以下是C++ AMP 的简要概述,转自于:
C++ AMP:用Visual C++加速大规模并行计算》——1.3 C++ AMP方法
C++ AMP:用Visual C++加速大规模并行计算
C++ AMP是一个并行库和语言层面的小扩展,能够帮助在C++应用程序中实现异构计算。(AMP是Accelerated Massive Parallelism的缩写,即加速大规模并行。)Visual Studio提供了新的工具和功能支持,可以用来调试和剖析C++ AMP应用程序的性能,包括GPU调试和GPU并行可视化。有了C++ AMP以后,主流C++开发人员可以使用熟悉的工具来创建可移植的、不会过时的应用程序,对于适宜数据并行的应用程序而言,能够实现显著加速。
1. C++ AMP将GPGPU(以及更多)带进主流
C++ AMP的使命之一是将GPGPU编程带给每一位开发者,使他们的应用程序可以从中获益。现在,支持C++ AMP的显卡几乎无处不在。然而,C++ AMP的首要任务不仅仅是GPGPU,它是一种利用异构计算平台的方法,例如GPU和CPU的向量处理单元,使数以百万计的主流开发人员能够创造性地使用异构平台。尽管说转向数据并行编程,尤其是用C++实现可移植性,是一项巨大的工程,但从软件开发实践的角度看,C++ AMP并非是第一个吃螃蟹的。
许多改变我们的行业和世界的技术或工艺都肇始于研究领域与学术界,这些技术和工艺起初仅被极少数的开发者所掌握,他们使用非常专业的工具,能够做到非常困难的事情。为改变行业和世界,这些技术走向大众,被视为主流。其他技术(例如GUI界面)也发生了这个过程。起初,只有少数开发者拥有诸如控制、响应鼠标事件这样的工作必需的专业技能。随着库、框架和工具的不断开发和发布,越来越多的开发人员能开发GUI应用程序了,现在这些都已成为规范。一些库、框架和工具比其他库、框架和工具更受欢迎,这些都使得GUI开发生态环境得以繁荣昌盛。
类似的过程在面向对象开发上也发生过。起初,当主流开发者还在使用过程化的方式开发应用时,少数学者就已经开始倡导新的软件设计和构建方式了。随着框架和工具的不断开发和发布,采纳规模已经达到了可以视面向对象开发为标准的程度,基本上大多数主流语言的所有开发者都在不同程度地使用它。
这种改变可能正发生在触摸界面和自然用户界面上,并行革命也势在必行。第一阶段是CPU并行,第二阶段是异构并行。要有工具、库和框架才能使异构计算变得更加容易和普遍。C++ AMP和Visual Studio正是主流开发人员需要的可以发挥GPU功能的工具、库和框架。
一个有趣的可能性是,主流开发人员可能会发现不直接使用C++ AMP也能从中获得好处。如果代码库的开发人员采用C++ AMP,使用这些库的代码无需了解底层库的做法就能获得加速。这一点对于创建面向特定领域的代码库而言很重要。
2. C++ AMP是C++,而不是C
GPGPU的开发还有许多其他方法,这些方法都涉及类C语言。虽然C是一种功能强大的高性能语言,但C++仍然会是那些 喜欢使用现代程序设计语言来工作的注重性能的开发人员的头号选择。C++提供了抽象和类型安全的泛型,开发人员能够借此解决较大的问题,使用更强大的库和结构,我们使用C++ AMP时也可以使用这些特性。我们可以使用模板、重载和异常,就像我们在应用程序其他部分做的那样。
因为C++ AMP是C++,而不是C或类C的语言,所以我们进行并行开发所需要的额外类型,并不是语言本身的扩展或补充,而是模板类型。这为我们提供了类型安全的泛型——我们可以区分实数数组和整数数组,同时降低了学习曲线。增加C语言的抽象和有用类型是C++的主要设计目标之一。
标准C++(例如C++ 11)以前就支持CPU独享编程。C++并行模式库PPL以标准库的方式提供了一组类型和算法来支持C++多核开发,这使得C++开发人员可以运用他们正在使用的语言和工具来利用新硬件。C++ AMP为异构计算带来了同样的舒适和便利。
3. C++ AMP使用了我们熟识的工具
Visual Studio 2012已全面支持C++ AMP,Windows计算机也将马上可以使用C++ AMP了。这为在Visual Studio中使用C++的所有开发人员打开了方便之门。这些开发人员不需要学习新工具或新语言便能利用强大的GPU。但他们仍要掌握数据并行的思维方式,评估他们所做的算法和数据结构的决策的成本(以执行时间或功耗来计算)。借用熟悉的工具整体技能差距会被拉平。Visual Studio提供了智能感知、GPU调试、性能剖析,以及其他相关功能,这使得开发人员要做的事情远不止编写和编译代码。
即使对于不以Windows为目标平台的开发人员,Visual Studio也是很受欢迎的。更重要的是,C++ AMP开发并非仅限于Windows或Visual Studio用户,它已经发布成为一个开放的技术规范,其他厂商也正在将C++ AMP添加到他们的工具集中。例如,AMD决定把C++ AMP加入到他们的FSA参考编译器中,可以同时支持Windows平台和非Windows平台。
4. C++ AMP是一个近乎全面的代码库
用熟悉的程序语言编写代码主要是为了保持熟悉的感觉。C++ AMP是对C++的扩展,确实有两个C++11中没有声明的关键字。然而,也只是两个关键字而已,语言的变化并不大。此外,新的主关键字restrict在C99中有声明,因此是一个保留字,不太可能导致与现有代码库的冲突。C++ AMP的其他工作要素还有类型和函数库。对于熟悉标准库或PPL的开发人员,C++ AMP上手也会很快。