是否有在GPU上运行的函数式编程语言?

Mai*_*tor 7 parallel-processing ocaml haskell functional-programming gpu

使用传统的顺序缩减方法,下面的图表减少为:

(+ (+ 1 2) (+ 3 4)) ->
(+ 3 (+ 3 4)) ->
(+ 3 7) ->
10
Run Code Online (Sandbox Code Playgroud)

但是,图形缩减本质上是平行的.相反,人们可以将其减少为:

(+ (+ 1 2) (+ 3 4)) ->
(+ 3 7) ->
10
Run Code Online (Sandbox Code Playgroud)

据我所知,每种函数式编程语言都使用第一种方法.我相信这主要是因为在CPU上,调度线程过度补偿了并行减少的好处.但是,最近,我们开始使用GPU而不是CPU用于并行应用程序.如果一种语言完全在GPU上运行,那么这些通信成本就会消失.

是否有功能语言利用这个想法?

lef*_*out 10

是什么让你对GPU调度有所考虑,不会过分包含这些好处?

实际上,GPU中使用的那种并行性要难以安排:它是SIMD并行性,即一整批流处理器一次完成所有基本相同的事情,除了每一个都压碎不同的数字.因此,您不仅需要安排子任务,还需要保持它们的同步.为一般计算自动执行此操作几乎是不可能的.

为特定任务执行此操作非常好,并已嵌入到函数式语言中; 查看Accelerate项目.


use*_*391 5

在 CPU 上,调度线程过度补偿了并行缩减的好处

线程调度在现代操作系统中非常有效。线程初始化和终止可能是一个值得关注的问题,但有很多技术可以消除这些成本。

然而,图缩减本质上是并行的

正如其他答案中提到的,GPU 是非常特殊的设备。不能简单地采用任意算法并仅通过在 CUDA 上重写来使其速度提高 100 倍。说起CUDA,不完全是SIMD(Single Instruction on Multiple Data),而是SIMT(Single Instruction on Multiple Thread)。这要复杂得多,但让我们将其视为一种单纯的向量处理语言。顾名思义,向量处理器旨在处理密集向量和矩阵,即简单的线性数据结构。因此,warp 中的任何分支都会将并行效率和性能降低到零。现代架构(Fermi+)甚至能够处理一些树,但这相当棘手,性能也没有那么出色。因此,您根本无法加速任意图形缩减。

GPGPU 的函数式语言呢?我相信这不会是严重的。大多数有价值的 CUDA 代码都存在于博士制作的几乎没有优化的库中,它的目标是直接提高性能。函数式语言的可读性、声明性、清晰性甚至安全性在那里都无关紧要。


hca*_*rty 5

SPOC从OCaml提供一些GPGPU访问.