是否有在GPU上运行的功能编程语言



使用传统的顺序还原方法,以下图被简化为:

(+ (+ 1 2) (+ 3 4)) ->
(+ 3 (+ 3 4)) ->
(+ 3 7) ->
10

绘制降低是固有的平行。相反,可以将其减少为:

(+ (+ 1 2) (+ 3 4)) ->
(+ 3 7) ->
10
据我所知,每种功能编程语言都使用第一种方法。我相信这主要是因为在CPU上,计划线程超过了并行减少的好处。但是,最近,我们已经开始使用GPU而不是CPU用于并行应用。如果语言完全在gpu 上运行,这些通信成本将消失。

是否有功能性语言可以利用该想法?

是什么让您在GPU计划上的想法不会超越好处?

实际上,GPU中使用的平行性类型更难安排:它是Simd ParalleleSism,即一批 stream处理器 一次都在一次基本相同的事情,除了每个事情粉碎了不同的数字。因此,您不仅需要安排子任务,还需要将它们保持在同步。对于一般计算,几乎是不可能的。

为特定任务做得很好,并且已嵌入到功能性语言中;查看加速项目。

spoc提供一些从OCAML访问的GPGPU。

在CPU上,调度线程超过平行还原的好处

线程调度在现代OS中非常有效。线程初始化和终止可能是一个问题,但是有很多消除这些成本的技术。

绘制降低是固有的平行

正如其他答案中提到的那样,GPU是非常特殊的设备。仅通过在CUDA上重写即可采用任意算法,并将其更快地制成100倍。说到CUDA,它并不是SIMD(多个数据上的单个指令),而是SIMT(多线程上的单个指令)。这是更复杂的事情,但让我们将其视为一种矢量处理语言。顾名思义, vector 处理器旨在处理密集的向量和矩阵,即简单的线性数据结构。因此,经线内的任何分支都将并行性和性能的效率降低到零。现代体系结构(Fermi )甚至能够处理一些树木,但这很棘手,而且性能并不是那么闪亮。因此,您根本无法加速任意图形。

GPGPU的功能语言呢?我相信这不是严重的。大多数有价值的CUDA代码都存在于博士学位上几乎没有优化的库中,它的目的是直接朝着绩效进行。功能语言的可读性,声明性,清晰度甚至安全性都不重要。

语言黑曜石是嵌入在Haskell中的域特定语言,该语言针对GPGPU计算。这比您的要求更低,但我认为我无论如何都会提到它。

https://github.com/benjamintrapani/fungpu提供了一种球拍类功能语言,该语言完全在GPU和其他设备上运行,可以用SYCL来定位。运行时会自动以有效利用GPU的方式安排独立子树(对使用不同数据的相同指令进行多次评估)。它仍处于早期阶段,但值得尝试。它已经超过了球拍VM。

最新更新