选择 RapidMind

作者:Nicholas Petreley

编写应用程序以支持多核 CPU 并非易事,在某些情况下,如果您想将一个庞大的现有应用程序改造为支持多核,则会更加困难。所以我认为真正的突破可能还需要数年时间。但看起来 RapidMind 已经为此问题提供了一个解决方案,它不需要对现有应用程序进行大规模的改造,而且其解决方案已经可用。

Picking the RapidMind

RapidMind 的创始人兼首席科学家 Michael McCool(左)和总裁兼首席执行官 Ray DePaul(右)

我们邀请了 RapidMind 的总裁兼首席执行官 Ray DePaul 和创始人兼首席科学家 Michael McCool 来讨论 RapidMind 利用多核系统能力的方法。

我们认为研究 RapidMind 很重要,因为看起来我们终于要进入桌面并行处理时代了,芯片制造商正逐渐逼近摩尔定律的实际极限。从显卡到 PlayStation 3 游戏机,如今都在利用并行处理。我的工作站中配备了英特尔四核处理器。虽然我对它很满意,但我发现我真正体会到拥有这款多核芯片的优势只有在我同时运行多个应用程序或运行多个进程时,例如使用命令make -j 5。如果说有什么不同的话,单线程应用程序在这款芯片上运行速度比我以前使用的单核 CPU 还要慢,因为英特尔芯片中的每个核心速度都明显较慢(2GHz 对比 3GHz)。

那么,RapidMind 如何弥合现有软件和不断变化的计算模型之间的差距呢?

LJ:您能否简要介绍一下 RapidMind,以及它旨在解决的问题?

DePaul:RapidMind 是一个多核软件平台,它使软件组织能够利用多核处理器和加速器的性能,从而在他们的行业中获得真正的竞争优势。借助 RapidMind,您可以开发并行应用程序,同时最大限度地减少对您的开发生命周期、成本和时间表的影响。而且,我们允许您在无需多线程的情况下完成此操作。您可以利用现有技能、现有编译器和 IDE,并充分利用所有关键的多核架构,而无需不断地移植您的应用程序。

LJ:那么,说 RapidMind 实际上是一个通用 C/C++ 操作库,其中多核的利用对程序员来说在很大程度上是透明的,这种说法准确吗?

McCool:RapidMind 远不止是一个简单的“预制函数”库。事实上,可以使用 RapidMind 平台的 API 来指定任意计算,并且该计算可以以非常高的性能并行执行。我们提供了一个复杂的多核软件平台,它可以利用多个级别的并行化,但同时允许开发人员以非常熟悉的单线程方式表达他们自己的计算。

LJ:程序员在使用 RapidMind 时,需要了解多少并行处理编程技术,或者说是否需要了解?

McCool:我们认为开发人员是应用程序专家,应该参与将其应用程序转移到并行世界中。关键是让开发人员利用他们已经知道的知识,而不是迫使他们走上不熟悉且令人沮丧的道路。RapidMind 构建在所有开发人员都熟悉的概念之上:数组和函数。开发人员无需直接处理线程、向量化、核心或同步。从根本上说,开发人员可以将函数应用于数组,这会自动调用并行执行。启用 RapidMind 的程序是并行操作的单线程序列,并且比并行编程的多线程模型更容易理解、编码和测试。

LJ:您能否给我们一个简单的代码示例(包括启动典型程序的 include 和声明语句)?

McCool:首先,您需要包含平台头文件,并可选择激活 RapidMind 命名空间

#include <rapidmind/platform.hpp> using namespace rapidmind;

接下来,您可以使用 RapidMind 类型声明数字和数组的变量

Value1f f; Array<2,Value3f> a, b;

Value1f 类型基本上等同于 float,而 Array 类型用于管理大型数据集合。这些类型可以在您通常声明 C++ 变量的任何位置声明:作为类的成员或作为局部或全局变量。

Program 对象是函数在 RapidMind 中的表示形式,通过将对 RapidMind 类型的操作序列括在 RM_BEGIN 和 RM_END 之间来创建。然后,这些操作将存储在 Program 对象中。例如,假设我们想将一个值 f(使用全局变量表示)添加到数组的每个元素。我们将按如下方式创建一个程序对象 prog

Program prog = RM_BEGIN {
  In<Value1f> c; Out<Value1f> d;
   d = c + f;
} RM_END;

请注意,尽管程序可能在协处理器上运行,但我们可以像在函数定义中一样引用外部值(如 f)。无需编写任何其他代码来设置主机处理器和任何协处理器之间的通信。

要将此操作应用于数组 a 并将结果放入数组 b 中,从而调用并行计算,我们只需像使用函数一样使用程序对象

b = prog(a);

当然,在实际应用程序中,程序对象可以包含大量操作,并且会使用程序对象序列和数组上的集体操作(例如 scatter、gather 和 reduce)。

LJ:你们如何避免并行处理的常见陷阱,例如死锁或其他同步问题?

McCool:RapidMind 接口的语义不涉及开发人员的显式锁定或同步。平台本身会在运行时平台的较低级别自动处理这些问题(如有必要)。开发人员无法指定会导致死锁或存在竞争条件的程序,就像 Java 开发人员无法指定会导致内存泄漏的程序一样。

LJ:我看到 Hewlett-Packard 软件在适配使用 RapidMind 后运行速度提高了 32.2 倍。修改软件以使用 RapidMind 花费了多长时间?

McCool:我们与 HP 的合作是我们平台的一次很好的测试。将应用程序启用 RapidMind 所花费的时间与 HP 调整其单核基线版本所花费的时间大致相同。HP 的调整使其版本速度提高了 4 倍,而 RapidMind 在 NVIDIA 7900 GPU 上运行的性能超过了前者 32 倍以上。最近,我们在 NVIDIA 8800 GPU 上运行了相同的代码,速度又提高了 5 倍,并且我们还在我们的多核 CPU 四核产品上运行了 RapidMind 版本,其速度比 HP 版本提高了 8 倍。

因此,这对软件组织的好处是相当惊人的。付出同样的努力,您不仅可以使用 RapidMind 在您已经定位的多核处理器上获得更高的性能,还可以利用加速器的额外性能。RapidMind 版本还可以自动扩展到未来具有更多内核的处理器。

LJ:HP 软件的速度提升是典型的还是“最佳情况”?哪些软件最有可能看到速度提升?数据库服务器软件?数据仓库上的复杂查询?垃圾邮件过滤?Web 浏览器?还是其他什么?

McCool:我们在各种应用程序中都看到了大幅度的速度提升,包括数据库操作、图像和视频处理、金融建模、模式匹配和分析、许多不同类型的科学计算等等。RapidMind 平台支持通用编程模型,可以应用于任何类型的计算。HP 测试是计算密集型的,它可以利用 GPU 的高计算性能。然而,在内存密集型应用程序中,我们也看到了显着的好处,从在 RapidMind 上运行应用程序中获得了超过一个数量级的提升。RapidMind 不仅管理并行执行,还管理数据流,因此也可以直接解决内存瓶颈问题。作为一家软件平台公司,我们不断对开发人员正在启用 RapidMind 的各种应用程序感到惊讶。在 2007 年 5 月推出我们的 v2.0 产品之前,我们的 Beta 计划中已经有来自许多不同行业的 1000 多名开发人员。这个问题是全行业性的,我们开发了一个具有非常广泛适用性的平台。

LJ:这种对多核的适配不应该发生在更基础的东西中吗,比如 GNU C 库?难道只是这些库赶上来的时间问题吗?

McCool:简单地并行化标准库函数不会有同样的好处,因为它们单独来说,工作量不够大。相比之下,RapidMind 程序可以执行任意数量的用户指定的并行计算。

虽然对于开发人员来说,RapidMind 看起来像一个库,但重要的是要认识到大部分工作是由运行时平台完成的。多核开发人员面临的挑战不能仅靠库来解决。开发人员需要一个系统来有效地处理多核的复杂性:特定于处理器的优化、数据管理、动态负载平衡、为更多内核扩展以及多级并行化。RapidMind 平台执行所有这些功能。

LJ:你们在不同层面上支持多个平台。例如,你们可以利用 NVIDIA 和 ATI 显卡、Cell 处理器以及多核 CPU 上的处理器。此外,你们还支持 Linux 和 Windows,对吗?

DePaul:处理器供应商正在带来一些令人兴奋和颠覆性的创新。软件公司面临着一些艰难的选择——他们应该支持哪些供应商和哪些架构。通过利用 RapidMind,他们可以从所有硬件创新中受益,并在当前的开发周期和时间表内向客户交付更好的产品。RapidMind 将继续在各种处理器和操作系统上提供可移植的性能。我们将支持未来的多核和众核处理器,因此今天使用 RapidMind 编写的应用程序具有面向未来的特性,并且可以自动利用未来可能出现的新架构,例如内核数量的增加。

LJ:您能详细介绍一下你们最近展示的对英特尔和 AMD 多核 CPU 的支持吗?

DePaul:我们为针对英特尔和 AMD 多核 CPU 的软件公司带来的价值再怎么强调也不为过。例如,在圣地亚哥举行的 SIGGRAPH 大会上,我们展示了一个在八个 CPU 核心上运行的应用程序性能提高了 10 倍。启用 RapidMind 的应用程序可以扩展到任意数量的内核,甚至跨多个处理器,并将针对英特尔和 AMD 架构进行调整。软件组织现在可以使用相同的源代码来针对多核 CPU 以及加速器,例如 ATI 和 NVIDIA GPU 以及 Cell 处理器。

LJ:您还有什么想对我们的读者说的吗?

DePaul:越来越明显的是,软件组织关于多核处理器和加速器的计划将是他们今年采取的最重要的举措之一。选择无所作为的公司将很快发现自己落后于性能曲线。而那些启动大型复杂多线程项目的公司将会对成本和时间表感到沮丧,最终会对结果感到非常失望。我们很幸运能与一群软件组织合作,他们看到了一个机会,可以在不对其软件开发周期产生破坏性影响的情况下,为其客户提供实质性的性能改进。

LJ:非常感谢您抽出时间!

Nicholas Petreley 是 Linux Journal 的主编,也是一位前程序员、教师、分析师和顾问,他从事 Linux 相关工作和写作已有十多年。

加载 Disqus 评论