如何进行硬件独立并行编程?

时间:2011-06-17 06:46:30

标签: scala graphics cpu parallel-processing

目前有两种主要的并行编程硬件环境,一种是多线程CPU,另一种是可以对数据阵列进行并行操作的显卡。

问题是,鉴于存在两种不同的硬件环境,我如何编写一个并行但独立于这两种不同硬件环境的程序。 我的意思是我想编写一个程序,无论我有显卡还是多线程CPU或两者兼而有之,系统都应自动选择执行它的方式,显卡和/或多线程CPU中的一个或两个

是否有允许这样的软件库/语言结构?

我知道有很多方法可以直接定位显卡来运行代码,但我的问题是我们如何编程并行代码而不了解硬件,软件系统应该将其安排到显卡或CPU。

如果您要求我对平台/语言更具体,我希望答案是关于C ++或Scala或Java。

由于

6 个答案:

答案 0 :(得分:5)

在几年后,程序会在运行时从头开始重写(嘿,为什么不呢?)...

......截至目前(据我所知),只有具有给定范例的并行系统的相关组才能实现,而GPU(“令人尴尬的并行”)是与“常规”CPU(2-8“线程”)显着不同与<20k处理器超级计算机显着不同

实际上有并行的运行时/库/协议,如Charm++MPI(认为“Actors”)可以扩展 - 专门设计算法到某些问题 - 从单CPU到数万个处理器,所以上面有点夸张。然而,GPU(甚至是Cell micoprocessor)和更通用的处理器之间存在着巨大的根本区别。

有时方形钉不适合进入圆孔。

NoFit

快乐的编码。

答案 1 :(得分:5)

Martin Odersky在EPFL的研究小组just recently received获得数百万欧元的欧洲研究资助,以回答这个问题。 (该文章包含几个链接到论文的详细信息。)

答案 2 :(得分:4)

OpenCL正是关于在任何平台(Cell,Mac,PC ......)上的CPU和GPU上运行相同的代码。

从Java开始,您可以使用JavaCL,这是一个围绕OpenCL C API的面向对象的包装器,可以节省大量的时间和精力(处理内存分配和转换负担,并附带一些附加功能)。

来自Scala,有ScalaCL构建在JavaCL上以完全隐藏OpenCL语言:它在编译时将Scala程序的某些部分转换为OpenCL代码(它附带一个编译器插件) )。

请注意,Scala将并行集合作为其自2.9.0以来的标准库的一部分,其可用于与ScalaCL的OpenCL支持的并行集合非常相似的方式(Scala的并行集合可以使用{{1的常规集合创建)虽然ScalaCL的并行集合是使用.par)创建的。

答案 3 :(得分:1)

最近宣布的MS C++ AMP {{3}}看起来像是你追求的那种东西。似乎(从阅读新闻文章)最初它的目标是使用GPU,但长期目标似乎也包括多核。

答案 4 :(得分:1)

不确定。请参阅ScalaCL以获取示例,但目前它仍然是alpha代码。另请注意,它使用了一些执行相同操作的Java库。

答案 5 :(得分:0)

我将涵盖更多的理论答案。

不同的并行硬件架构实现了不同的计算模型。这些之间的桥梁很难。

在顺序世界中,我们一直在愉快地破解基本相同的单一计算模型:随机访问机器。这在硬件实现者和软件编写者之间创建了一种很好的通用语言。

不存在用于并行计算的这种单一最优模型。自现代计算机诞生以来,人们就开始研究大型设计空间;目前的多核CPU和GPU只占这个空间的一小部分。

桥接这些模型很难,因为并行编程主要是关于性能。您通常通过添加一个抽象层来隐藏细节,从而使某些东西在两个不同的模型或系统上工作。但是,抽象不会带来性能成本。这通常会让您获得两种模型的较低公分母。

现在回答你的实际问题。由于性能损失,拥有独立于CPU或GPU的计算模型(语言,操作系统,库,...)通常不会在两者之间进行抽象,同时保留您习惯使用的全部功能。为了保持一切相对有效,模型将通过限制您可以做的事情来倾向于GPU。

银色衬里:
混合计算会发生什么。某些计算更适合其他类型的体系结构。您也很少只进行一种类型的计算,因此“足够智能的编译器/运行时”将能够区分您的计算的哪个部分应该在什么体系结构上运行。