Harlan是一种全新的、GPU计算领域的专用开发编程语言,它对富数据结构、树以及多维数组提供了原生支持。Harlan可以在Mac OS X 10.6、Mac OS X 10.7、Mac OS X 10.8和其他版本的Linux上运行。
Harlan需要一个OpenCL的实现,如Intel的OpenCL SDK、NVIDIA的CUDA工具包、AMD加速并行处理(APP)SDK以及Petite Chez Scheme。此外,它还对高阶过程提供了支持。
为了进一步了解编程语言Harlan,InfoQ对美国印第安纳大学的博士生Eric Holk进行了采访。
InfoQ:使用Harlan构建应用的基本要求是什么?
Harlan致力于在各种硬件上工作。使用Harlan编写的应用程序可以在任何设备上运行,只要该设备上有某种OpenCL实现。因为编译器本身是用Chez Scheme写的,所以用户需要安装Chez Scheme或Petite Chez Scheme。为了让大家在进行Harlan语言实验时更加方便,我们一直在最小化Harlan运行需求方面努力。
InfoQ:您能向读者介绍一些使用Harlan开发的软件应用程序吗?
从设计方面而言,Harlan是一种通用的数据并行计算语言,因此它可以应用在多种程序中。Harlan提供了大量的高阶编程功能,如自定义数据类型以及高阶过程,这在现有面向GPU的编程语言中是很少见的。
作为编译器的编写者,我对使用Harlan来加速某些程序分析任务的方面非常感兴趣,我一直在探索其可能性。我们曾经进行的一些基准测试显示,Harlan在传统科学的应用程序上运行得非常好。Harlan语言自身的特性还使其支持非传统的GPU应用,如图表分析或者光线追踪。
InfoQ:Harlan兼容Windows 7和Windows 8吗?
很遗憾,目前不兼容。也就是说,Harlan现在不太可能在Windows上运行。但是,大部分代码是可移植的,只是需要根据运行时系统进行一些小小的修改。
InfoQ的:Harlan对图形渲染有帮助吗?
其实,Harlan真正关注的重点是通用计算,而不是具体的图形渲染。也就是说,程序将实际运行在GPU上,并且可以使用Harlan编写很多图形处理任务。
InfoQ:您能使用Harlan向读者们演示一个简单的Hello World应用吗?
Hello World的代码如下所示:
(module (define (main) (println "Hello, World!") (return 0))) >上面的示例其实并没有体现Harlan并行的特性,所以没有什么意思。下面是另一个程序,展示了如何计算两个矢量之间的点积:
(module (define (main) (let ((X (vector 1 2 3 4)) (Y (vector 4 3 2 1))) (let ((dot (reduce + (kernel ((x X) (y Y)) (* x y))))) (println dot) (return 0)))))读者可以使用不同的表达式来创建更长的矢量,从而对(vector 1 2 3 4)和(vector 4 3 2 1)进行替换。
Harlan使用的是类 Scheme的S-表达式语法,因此示例中才会有这么多的括号。部分原因是因为编译器是用Schema写的,所以自然选择和S-表达式一起使用。当然,S-表达式也支持特定的语言特性——比如Harlan的宏系统,很难使用包含更多传统语法的语言来实现。
InfoQ:Harlan的主要功能同时支持NVIDIA和ATI的GPU吗?
Harlan被编译为OpenCL,这是一个生成运算层(Generate Computing Layer),支持大多数GPU、CPU以及其他加速器。它也因此不支持最新的功能。比如,Harlan目前不支持CUDA中新的动态并行(Dynamic Parallelism)功能。我想可能这种情况过段时间会有所改观。Harlan目前还无法大量使用GPU上的不同的内存,但这是未来我关注的研究领域之一。
InfoQ:您能再与我们介绍下有关Harlan支持高阶过程方面的内容吗?
其实,大约在一个星期前,Harlan才对高阶过程提供基本的支持。
高阶过程是函数式编程语言的主要部分。通常,在命令式语言中,除了调用函数之外,用户基本上做不了什么事。但在函数式语言中,如Scheme、ML、Haskell甚至是JavaScript,用户可以将其他函数作为某个函数的参数、创建新的函数以及返回函数等。用户甚至可以把这些函数放到数据结构中。
常见的“映射”就是一种高阶函数,其参数是一个函数和一个列表,它会调用传入的函数对列表中的每一个元素进行处理,并将处理结果保存为一个新列表,并返回。下面是一个Scheme的示例:
(let ((ls (list 1 2 3 4))) (map add1 ls))
这里首先创建了一个包含数字1、2、3、4的列表,然后通过调用add1这个过程,将其参数增加1,也就是说,列表中的每个元素将增加1。结果如下:
(2 3 4 5)
查看英文原文:Harlan with Support for Rich Data Structures, Trees, Ragged Arrays and Higher Order Procedures