Chapel 是一种用于高效并行计算的编程语言,近年来其团队致力于添加GPU支持,使得创建中立于厂商且高性能的GPU程序变得更加容易。
核心概念:Locale 与 on 语句
Chapel 通过 “locale” 和 “on” 语句控制代码执行位置。Locale 代表运行程序的机器资源单元,可以是CPU或GPU。on 语句用于将代码块显式地定向到某个locale执行。例如,on here.gpus[0] 会将代码块定位到系统中的第一个GPU上执行。变量在 on 块内声明,则逻辑上属于该locale,从该locale访问性能最佳。
启用GPU支持
需设置环境变量 CHPL_LOCALE_MODEL=gpu 来编译Chapel。对于AMD GPU,还需通过 CHPL_GPU_ARCH 指定架构。若无GPU,可使用 cpu-as-device 模式进行开发,该模式下CPU会透明地执行GPU代码。
循环与GPU执行
在GPU上运行的关键是编写“顺序无关”的循环。使用 foreach 关键字表示循环的每次迭代相互独立、无数据竞争,Chapel编译器会自动将其转换为GPU内核代码。反之,使用 for 关键字的循环为顺序依赖,不会在GPU上执行。例如,在 foreach 循环中计算数组每个元素的两倍是典型的GPU适用场景。
可在GPU上执行的功能
Chapel的大部分语言特性都可在GPU上使用,包括:
- 提升(Promotion):允许将数组传递给需要标量参数的操作,操作会自动并行应用于每个元素,可能运行在GPU上。
- 函数调用:用户自定义或内置函数(如
sin)均可在GPU内核中调用,甚至递归函数也可运行。
- 复合循环:支持在GPU循环内嵌套普通循环。
运行环境与扩展性
Chapel的GPU支持是厂商中立的,同一份代码可在NVIDIA和AMD GPU上无需修改运行。其GPU支持具备良好的可扩展性,从笔记本电脑原型(可使用 cpu-as-device 模式)到超级计算机均可运行。通过嵌套 coforall 和 on 语句,能够轻松编写利用整个系统中所有GPU的程序。
适用问题类型
GPU拥有大量核心,适合处理可分解为众多相似且独立子任务的问题,例如图像渲染(计算各像素颜色)和线性代数运算(如矩阵乘法,各元素计算独立)。通过将任务分解到众多核心上并行执行,GPU能实现显著的性能提升。
总结
Chapel通过 locale 和 on 语句提供清晰的执行位置控制,利用 foreach 循环标识可并行执行的顺序无关代码块,并自动将其转化为GPU内核执行。这使得程序员能够利用大多数Chapel语言特性编写中立于厂商、可扩展且高性能的GPU程序,而无需深入了解CUDA或HIP等底层框架。