【发布时间】:2012-01-27 16:12:49
【问题描述】:
图形是那些“令人尴尬的并行”问题之一。 Haskell 应该非常非常适合并行处理。所以我的问题是:
在渲染问题上投入尽可能多的 CPU 内核的最佳方法是什么?
是否可以让 GPU 代替执行任务?
“渲染问题”是指以下问题:
每个像素的颜色都是其坐标的纯函数。
我们从现有的“输入”图像开始,每个“输出”像素的颜色都是相应输入像素的纯函数,或者可能是此类像素的一个小邻域。
关于#1:这看起来很简单,但实际上并非如此。有几种可能的数据结构选择来存储计算的像素(这会影响您访问它的方式,以及将结果转储到磁盘或屏幕上的难易程度)。有几种方法可以在多个内核上执行。以此类推。
在我看来,Data Parallel Haskell 将是这类事情的理想选择。但是,上次我检查时,DPH 还没有工作。就是这样。即使假设它确实有效,您也可能会创建一个并行数组来保存像素,然后您必须复制像素以将它们显示在屏幕上或将它们写入磁盘。
我会尝试激发每个像素,但这可能过于精细。我可以将像素设为列表并使用其中一种并行列表策略。或者我可以将其设为(未装箱?)不可变数组并编写一些手动代码来启动火花。或者我可以使用显式线程和可变数组。或者我可以有一堆工作线程,它们通过通道将像素值流式传输到主线程,主线程将结果放到正确的位置。或者……
总而言之,这里有很多令人惊讶的可能性,我不确定哪个是最好的。
关于#2:显然,这类问题是全部原因,GPU 最初存在。显然,GPU 非常适合解决这类问题。我的问题更多的是“从 Haskell 中很难做到这一点吗?”
【问题讨论】:
-
我认为它还不能针对 GPU,但是 Data Parallel Haskell 的目标是能够做这种事情。
标签: haskell graphics parallel-processing