Accelerate
摘要
Accelerate 是 Haskell 中用于高性能并行数组计算的嵌入式领域特定语言,支持在线编译到多核 CPU 和 CUDA GPU。
查看缓存全文
缓存时间: 2026/05/16 15:40
AccelerateHS/accelerate
源: https://github.com/AccelerateHS/accelerate
高性能并行数组 for Haskell
CI (https://github.com/tmcdonell/accelerate/actions/workflows/ci.yml)
Gitter (https://gitter.im/AccelerateHS/Lobby)
Hackage (https://hackage.haskell.org/package/accelerate)
Stackage LTS (https://stackage.org/lts/package/accelerate)
Stackage Nightly (https://stackage.org/nightly/package/accelerate)
Data.Array.Accelerate 定义了一种用于Haskell高性能计算的嵌入式数组计算语言。多维规则数组的计算以参数化集合操作(如 map、reduce 和 permutation)的形式表达。这些计算会在运行时被编译并在多种架构上执行。
更多细节请参见我们的论文:
- Accelerating Haskell Array Codes with Multicore GPUs
- Optimising Purely Functional GPU Programs (幻灯片)
- Embedding Foreign Code
- Type-safe Runtime Code Generation: Accelerate to LLVM (幻灯片) (视频)
- Streaming Irregular Arrays (视频)
此外还有一些关于 Accelerate 的演示文稿幻灯片:
- Embedded Languages for High-Performance Computing in Haskell
- GPGPU Programming in Haskell with Accelerate (视频) (工作坊)
Simon Marlow 的《Parallel and Concurrent Programming in Haskell》Mar13 第6章包含对 Accelerate 的入门教程。
Trevor 的博士论文 详细介绍了前端优化和 CUDA 后端的设计与实现。
目录
简单示例
一个简单的例子:计算两个单精度浮点数向量的点积:
dotp :: Acc (Vector Float) -> Acc (Vector Float) -> Acc (Scalar Float)
dotp xs ys = fold (+) 0 (zipWith (*) xs ys)
除了类型,这段代码几乎与对应的 Haskell 列表版本相同。类型表明该计算可能会被实时编译以优化性能;例如,使用 Data.Array.Accelerate.LLVM.PTX.run 可以将其即时卸载到 GPU 上运行。
可用性
Accelerate 包可从以下位置获得:
- Hackage: accelerate - 只需将其添加到你的 cabal 文件中
- GitHub: AccelerateHS/accelerate - 使用
git clone https://github.com/AccelerateHS/accelerate.git获取源代码
要安装 Haskell 工具链,可以尝试 GHCup (https://www.haskell.org/ghcup/)。
附加组件
以下受支持的附加组件作为独立包提供:
- accelerate-llvm-native:面向多核 CPU 的后端
- accelerate-llvm-ptx:面向支持 CUDA 的 NVIDIA GPU 的后端。需要计算能力 3.0 或更高的 GPU(参见 维基百科表格)
- accelerate-examples:展示 Accelerate 使用的计算内核和应用程序,以及回归测试套件(支持功能和性能测试)
- 多种格式之间的转换:
- accelerate-io (https://hackage.haskell.org/package/accelerate-io):在原始指针之间直接复制数据
- accelerate-io-array (https://hackage.haskell.org/package/accelerate-io-array):不可变数组
- accelerate-io-bmp (https://hackage.haskell.org/package/accelerate-io-bmp):未压缩的 BMP 图像文件
- accelerate-io-bytestring (https://hackage.haskell.org/package/accelerate-io-bytestring):紧凑的不可变二进制数据
- accelerate-io-cereal (https://hackage.haskell.org/package/accelerate-io-cereal):使用 cereal (https://hackage.haskell.org/package/cereal) 进行二进制序列化
- accelerate-io-JuicyPixels (https://hackage.haskell.org/package/accelerate-io-JuicyPixels):各种像素格式的图像
- accelerate-io-repa (https://hackage.haskell.org/package/accelerate-io-repa):另一个用于高性能并行数组的 Haskell 库
- accelerate-io-serialise (https://hackage.haskell.org/package/accelerate-io-serialise):使用 serialise (https://hackage.haskell.org/package/serialise) 进行二进制序列化
- accelerate-io-vector (https://hackage.haskell.org/package/accelerate-io-vector):高效盒装和拆箱的一维数组
- accelerate-fft:快速傅里叶变换实现,带有 FFI 绑定到优化实现
- accelerate-blas:BLAS 和 LAPACK 操作,带有 FFI 绑定到优化实现
- accelerate-bignum:固定宽度大整数算术
- colour-accelerate:Accelerate 中的颜色表示(RGB、sRGB、HSV 和 HSL)
- containers-accelerate (http://hackage.haskell.org/package/containers-accelerate):基于哈希的容器类型
- gloss-accelerate:从 Accelerate 生成 gloss 图片
- gloss-raster-accelerate:光栅图像和动画的并行渲染
- hashable-accelerate (http://hackage.haskell.org/package/hashable-accelerate):可转换为哈希值的类型类
- lens-accelerate:Accelerate 类型的 Lens 运算符
- linear-accelerate:Accelerate 中的 Linear 向量空间
- mwc-random-accelerate:生成填充高质量伪随机数的 Accelerate 数组
- numeric-prelude-accelerate:将 numeric-prelude 提升到 Accelerate
- wigner-ville-accelerate (https://github.com/Haskell-mouse/wigner-ville-accelerate):Wigner-Ville 时频分布
以上所有包均可从 Hackage 获得。
文档
示例
accelerate-examples
accelerate-examples 包提供了多种计算内核和几个完整应用程序。示例包括:
- Canny 边缘检测 实现
- 交互式 Mandelbrot 集 生成器
- 固体粒子间万有引力的 N 体模拟
- PageRank 算法实现
- 简单的 光线追踪器
- 基于粒子的稳定流体流动模拟
- 元胞自动机模拟
- 用于 MD5 哈希字典查找的“密码恢复”工具
要运行这些示例,可以从 Hackage 使用 cabal get accelerate-examples 获取源代码,或克隆 git 仓库,然后对各个可执行文件使用 cabal run。
Mandelbrot (https://i.imgur.com/RgXRqsc.jpg)
Raytracer (https://i.imgur.com/ZNEGEJK.jpg)
LULESH
LULESH-accelerate 是 Livermore 非结构化拉格朗日显式冲击流体动力学(LULESH)小应用的实现。LULESH 代表典型的流体动力学代码,如 ALE3D,但它是高度简化的应用,硬编码用于在非结构化六面体网格上求解 Sedov 爆炸问题。
LULESH 网格
其他示例
Accelerate 用户还构建了一些自己的重要应用。欢迎添加你自己的例子!
- Jonathan Fraser, GPUVAC (https://github.com/GeneralFusion/gpuvac):显式平流磁流体动力学模拟
- David van Balen, Sudokus (https://github.com/dpvanbalen/Sudokus):数独求解器
- Trevor L. McDonell, lol-accelerate:基于环的格密码学 Λ ○ λ (Lol) 库的后端
- Henning Thielemann, patch-image (http://hackage.haskell.org/package/patch-image):合并重叠图像的拼贴
- apunktbau, bildpunkt (https://github.com/abau/bildpunkt):光线行进距离场渲染器
- klarh, hasdy (https://github.com/klarh/hasdy):使用 Accelerate 的 Haskell 分子动力学
- Alexandros Gremm 在 2014 年 CSCS 暑期学校(http://user.cscs.ch/blog/2014/cscs_usi_summer_school_2014_30_june_10_july_2014_in_serpiano_tessin/index.html)中使用 Accelerate(代码 (https://github.com/agremm/cscs))
我们是谁?
Accelerate 团队(过去和现在)包括:
- Manuel M T Chakravarty (@mchakravarty)
- Gabriele Keller (@gckeller)
- Trevor L. McDonell (@tmcdonell)
- Robert Clifton-Everest (@robeverest)
- Frederik M. Madsen (@fmma)
- Ryan R. Newton (@rrnewton)
- Joshua Meredith (@JoshMeredith)
- Ben Lever (@blever)
- Sean Seefried (@sseefried)
- Ivo Gabe de Wolff (@ivogabe)
- Tom Smeding (@tomsmeding)
Accelerate 的维护者和主要开发者是 Trevor L. McDonell 。
邮件列表和联系方式
- 邮件列表:
[email protected](欢迎讨论使用和开发相关话题) - 在 Accelerate Google Groups 页面 注册邮件列表
- Bug 报告和问题跟踪:GitHub 项目页面
- 在 gitter 上与我们聊天 (https://gitter.im/AccelerateHS/Lobby)
引用 Accelerate
如果您在学术研究中使用 Accelerate,我们鼓励(但不是必需)引用以下论文:
- Manuel M. T. Chakravarty, Gabriele Keller, Sean Lee, Trevor L. McDonell, and Vinod Grover. Accelerating Haskell Array Codes with Multicore GPUs. In DAMP ’11: Declarative Aspects of Multicore Programming, ACM, 2011.
- Trevor L. McDonell, Manuel M. T. Chakravarty, Gabriele Keller, and Ben Lippmeier. Optimising Purely Functional GPU Programs. In ICFP ’13: The 18th ACM SIGPLAN International Conference on Functional Programming, ACM, 2013.
- Robert Clifton-Everest, Trevor L. McDonell, Manuel M. T. Chakravarty, and Gabriele Keller. Embedding Foreign Code. In PADL ’14: The 16th International Symposium on Practical Aspects of Declarative Languages, Springer-Verlag, LNCS, 2014.
- Trevor L. McDonell, Manuel M. T. Chakravarty, Vinod Grover, and Ryan R. Newton. Type-safe Runtime Code Generation: Accelerate to LLVM. In Haskell ’15: The 8th ACM SIGPLAN Symposium on Haskell, ACM, 2015.
- Robert Clifton-Everest, Trevor L. McDonell, Manuel M. T. Chakravarty, and Gabriele Keller. Streaming Irregular Arrays. In Haskell ’17: The 10th ACM SIGPLAN Symposium on Haskell, ACM, 2017.
Accelerate 主要由学术界人士开发,因此引用对我们非常重要。作为额外的好处,你增加了 Accelerate 的曝光度和潜在用户(以及开发者!)基础,这对所有 Accelerate 用户都有益。
提前感谢!
缺少什么?
以下是目前缺少的功能列表:
- 初步 API(部分 API 可能在后续版本中发生变化)
- 更多功能……请联系我们!
相似文章
AccelOpt:一种用于AI加速器内核优化的自我改进LLM智能体系统
AccelOpt是一种自我改进的LLM智能体系统,通过迭代生成和优化记忆自主优化AI加速器内核,在AWS Trainium上实现了49%至61%的峰值吞吐量提升,同时比Claude Sonnet 4便宜26倍。
@leloykun: 我又忙忘了时间 >.< 最近如果给我发过私信,真的非常抱歉。我保证会逐一查看!--- 在本次迭代中,我……
作者开发了一个从 Lean4 到 TileLang 的张量程序超优化器,能够自动生成优化后的加速器内核并推导超参数缩放定律,在 A100 GPU 上实现了 1.8 倍的加速。
AdaExplore:基于失败驱动的自适应与多样性保留搜索的高效内核生成
来自卡内基梅隆大学、华盛顿大学和Arm的研究人员提出了AdaExplore,这是一种用于GPU内核代码生成的LLM智能体框架。该框架通过失败驱动自适应与多样性保留搜索技术,在不进行额外微调的情况下,在KernelBench Level-2和Level-3基准测试中分别实现了3.12倍和1.72倍的加速。
一个可定制的编译器,用于为AI模型生成高效的融合GPU内核 [P]
作者介绍了一款用 Python 编写、高度可定制且易于修改的 ML 编译器。该编译器通过多级 IR 流水线将 LLMs 转换为优化的 CUDA 内核,在特定操作上实现了与 PyTorch 相当甚至更优的性能。文章详细阐述了该编译器的优化过程、降级规则以及用于生成高效融合 GPU 内核的 CLI 用法。
TokenSpeed:面向智能体工作负载的"光速"LLM推理引擎(5分钟阅读)
Lightseek发布TokenSpeed,一款面向智能体工作负载优化的高性能LLM推理引擎,采用编译器驱动的并行技术和先进的内核优化,相关技术已被vLLM采纳。