Scala 如何进行与硬件无关的并行编程?

Scala 如何进行与硬件无关的并行编程?,scala,graphics,cpu,parallel-processing,Scala,Graphics,Cpu,Parallel Processing,现在有两种主要的并行编程硬件环境,一种是多线程CPU,另一种是图形卡,可以对数据阵列执行并行操作 问题是,考虑到有两种不同的硬件环境,如何编写一个并行但独立于这两种不同硬件环境的程序。 我的意思是,我想写一个程序,无论我是否有图形卡或多线程CPU或两者都有,系统都应该自动选择在什么上执行它,或者图形卡和/或多线程CPU都有 是否有任何软件库/语言结构允许这样做 我知道有很多方法可以直接将图形卡作为运行代码的目标,但我的问题是,作为程序员,我们如何在不了解任何硬件和软件系统的情况下编写并行代码,而

现在有两种主要的并行编程硬件环境,一种是多线程CPU,另一种是图形卡,可以对数据阵列执行并行操作

问题是,考虑到有两种不同的硬件环境,如何编写一个并行但独立于这两种不同硬件环境的程序。 我的意思是,我想写一个程序,无论我是否有图形卡或多线程CPU或两者都有,系统都应该自动选择在什么上执行它,或者图形卡和/或多线程CPU都有

是否有任何软件库/语言结构允许这样做

我知道有很多方法可以直接将图形卡作为运行代码的目标,但我的问题是,作为程序员,我们如何在不了解任何硬件和软件系统的情况下编写并行代码,而应该将其调度到图形卡或CPU

<>如果你需要我对平台/语言更具体,我想答案是关于C++或Scala或java。
谢谢

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

…到目前为止(据我所知),只针对具有给定范例的相关并行系统组是可行的,而GPU(“令人尴尬的并行”)与“传统”CPU(2-8“线程”)明显不同于20k处理器超级计算机

实际上,有一些并行运行时/库/协议,比如or(想想“参与者”),它们可以通过专门设计的算法扩展到某些问题,从单个CPU扩展到数万个处理器,所以上面的说法有些夸张。然而,GPU——甚至是通用处理器——和更通用的处理器之间有着巨大的根本区别

有时一个正方形的钉子根本不适合一个圆孔


快乐的编码。

最近发布的(非常-)看起来就像是你想要的那种东西。从阅读新闻文章来看,最初它的目标似乎是使用GPU,但长期目标似乎也是包括多核。

马丁·奥德斯基在EPFL的研究小组获得了数百万欧元的欧洲研究资助,以准确回答这个问题。(这篇文章包含多个到论文的链接,提供了更多详细信息。)

当然。请参见示例,尽管目前它仍然是alpha代码。还请注意,它使用了一些执行相同操作的Java库。

我将介绍更多的理论答案

不同的并行硬件架构实现不同的计算模型。在这两者之间架起桥梁是困难的

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

不存在这种单一的并行计算优化模型。自从现代计算机出现以来,人们探索了一个巨大的设计空间;目前的多核CPU和GPU只占这一空间的一小部分

桥接这些模型很困难,因为并行编程本质上是关于性能的。通常,通过添加抽象层来隐藏细节,可以在两个不同的模型或系统上工作。然而,很少有抽象不附带性能成本。这通常会使两种模型的共同点更低

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

一线希望:
发生的是混合计算。有些计算更适合于其他类型的体系结构。您也很少只执行一种类型的计算,因此“足够智能的编译器/运行时”将能够区分您的计算的哪一部分应该在什么体系结构上运行。

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

您可以使用Java,它是围绕OpenCLCAPI的面向对象包装器,将为您节省大量的时间和精力(处理内存分配和转换负担,并附带一些额外功能)

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


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

因此,如果在Scala空间中编程,最好从参与者开始(AKKA)并行集合然后等待他们解决图形卡的细节问题?假设他们将在2年内解决。链接现在已经失效。听起来很有趣,但遗憾的是现在不在这里。它现在在Visual Studio 11中,事实上在没有GPU的情况下,有一个多核和SSE的后备解决方案。C/C++和GCC原子内置函数是最可移植的语言(没有其他语言被移植到这么多平台上)。GPU可以从基于C99的OpenCL使用(带有Java包装器)。请记住,Java和Scala使用的是C/C++库和编译器。