Bend

Bend

结合高级语言特性和大规模并行计算的编程语言

Bend是一种创新的高级并行编程语言,将高级语言的易用性与大规模并行计算的高效性相结合。它融合了Python和Haskell等语言的优秀特性,如快速对象分配、高阶函数和闭包支持,同时在GPU等并行硬件上实现了接近CUDA的性能,无需开发者手动添加并行化代码。Bend能够在GPU等大规模并行硬件上实现近乎线性的性能提升,且支持无限递归等高级特性。基于HVM2运行时开发,Bend目前仍在持续完善中,未来有望进一步优化性能。

Bend并行编程GPU编程函数式语言高性能计算Github开源项目
<h1>Bend</h1> <p>一种高级、大规模并行编程语言</p>

目录

  1. 简介
  2. 重要说明
  3. 安装
  4. 入门
  5. 加速示例
  6. 其他资源

简介

Bend提供了类似Python和Haskell等富有表现力的语言的感觉和特性。这包括快速对象分配、对带闭包的高阶函数的完全支持、无限制的递归,甚至是延续。 Bend的可扩展性类似于CUDA,它可以在GPU等大规模并行硬件上运行,几乎可以根据核心数量实现线性加速,而无需显式的并行注解:无需创建线程、锁、互斥量或原子操作。 Bend由HVM2运行时驱动。

重要说明

  • Bend旨在提高核心数量的扩展性能,支持超过10000个并发线程。
  • 当前版本的单核性能可能较低。
  • 随着我们改进代码生成和优化技术,您可以期待性能的显著提升。
  • 我们仍在努力支持Windows。可以使用WSL2作为替代解决方案。
  • 我们目前仅支持NVIDIA GPU

安装

安装依赖项

在Linux上

# 如果尚未安装Rust,请安装。 curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # 对于Bend的C版本,使用GCC。我们建议使用12.x版本。 sudo apt install gcc

对于CUDA运行时,为Linux安装CUDA工具包 12.x版本。

在Mac上

# 如果尚未安装Rust,请安装。 curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # 对于Bend的C版本,使用GCC。我们建议使用12.x版本。 brew install gcc

安装Bend

  1. 通过运行以下命令安装HVM2:
# HVM2是HOC的大规模并行交互组合子评估器。 cargo install hvm # 这确保HVM正确安装并可访问。 hvm --version
  1. 通过运行以下命令安装Bend:
# 此命令将安装Bend cargo install bend-lang # 这确保Bend正确安装并可访问。 bend --version

入门

运行Bend程序

bend run <file.bend> # 默认使用C解释器(并行) bend run-rs <file.bend> # 使用Rust解释器(顺序) bend run-c <file.bend> # 使用C解释器(并行) bend run-cu <file.bend> # 使用CUDA解释器(大规模并行) # 注意 # 您还可以使用gen-c和gen-cu将Bend编译为独立的C/CUDA文件以获得最佳性能。 # 代码生成器仍处于早期阶段,尚不如GCC和GHC等编译器成熟。 # 您可以使用-s标志获取更多信息,包括: # 归约次数 # 代码运行时间 # 每秒交互次数(以百万为单位)

测试Bend程序

以下示例计算从starttarget范围内所有数字的总和。可以用两种不同的方法编写:一种本质上是顺序的(因此无法并行化),另一种易于并行化。(为了便于查看,我们将在大多数示例中使用-s标志)

顺序版本:

首先,创建一个名为sequential_sum.bend的文件

# 在终端中输入此命令 touch sequential_sum.bend

然后使用文本编辑器打开sequential_sum.bend文件,复制下面的代码并粘贴到文件中。

# 定义带有两个参数的Sum函数:start和target def Sum(start, target): if start == target: # 如果start的值与target相同,则返回start。 return start else: # 如果start不等于target,递归调用Sum, # 将start增加1,并将结果加到start上。 return start + Sum(start + 1, target) def main(): # 这相当于 (1 + (2 + (3 + (...... + (999999 + 1000000))))) # 注意,这将超过Bend中数字的最大值 return Sum(1, 1_000_000)
运行文件

您可以使用Rust解释器(顺序)运行它

bend run sequential_sum.bend -s

或者您可以使用C解释器(顺序)运行它

bend run-c sequential_sum.bend -s

如果您有NVIDIA GPU,还可以在CUDA上运行(顺序)

bend run-cu sequential_sum.bend -s

在这个版本中,下一个要计算的值依赖于前一个总和,这意味着在当前计算完成之前无法继续。现在,让我们看看易于并行化的版本。

可并行化版本:

首先关闭旧文件,然后在终端中创建parallel_sum.bend

# 在终端中输入此命令 touch parallel_sum.bend

然后使用文本编辑器打开parallel_sum.bend文件,复制下面的代码并粘贴到文件中。

# 定义带有两个参数的Sum函数:start和target def Sum(start, target): if start == target: # 如果start的值与target相同,则返回start。 return start else: # 如果start不等于target,计算中点(half), # 然后递归调用Sum计算两半。 half = (start + target) / 2 left = Sum(start, half) # (Start -> Half) right = Sum(half + 1, target) return left + right # 可并行化的从1到1000000的数字总和 def main(): # 这相当于 (((1 + 2) + (3 + 4)) + ... (999999 + 1000000)...) return Sum(1, 1_000_000)

在这个例子中,(3 + 4)的和不依赖于(1 + 2),这意味着它可以并行运行,因为两个计算可以同时进行。

运行文件

你可以使用Rust解释器(顺序执行)运行它

bend run parallel_sum.bend -s

或者你可以使用C解释器(并行执行)运行它

bend run-c parallel_sum.bend -s

如果你有NVIDIA GPU,你也可以在CUDA上运行(大规模并行)

bend run-cu parallel_sum.bend -s

在Bend中,只需改变运行命令就可以实现并行化。如果你的代码能够并行运行,它就会并行运行。

加速示例

下面的代码片段实现了一个使用不可变树旋转双调排序器。这不是你期望在GPU上快速运行的那种算法。然而,由于它使用了分治法,这种方法本质上是并行的,Bend会在多个线程上执行它,无需创建线程,无需显式锁管理。

双调排序器基准测试

  • bend run:CPU,Apple M3 Max:12.15秒
  • bend run-c:CPU,Apple M3 Max:0.96秒
  • bend run-cu:GPU,NVIDIA RTX 4090:0.21秒
<details> <summary><b>点击此处查看双调排序器代码</b></summary>
# 排序网络 = 只需旋转树! def sort(d, s, tree): switch d: case 0: return tree case _: (x,y) = tree lft = sort(d-1, 0, x) rgt = sort(d-1, 1, y) return rots(d, s, (lft, rgt)) # 旋转子树(蓝色/绿色框) def rots(d, s, tree): switch d: case 0: return tree case _: (x,y) = tree return down(d, s, warp(d-1, s, x, y)) # 交换远距离值(红色框) def warp(d, s, a, b): switch d: case 0: return swap(s ^ (a > b), a, b) case _: (a.a, a.b) = a (b.a, b.b) = b (A.a, A.b) = warp(d-1, s, a.a, b.a) (B.a, B.b) = warp(d-1, s, a.b, b.b) return ((A.a,B.a),(A.b,B.b)) # 向下传播 def down(d,s,t): switch d: case 0: return t case _: (t.a, t.b) = t return (rots(d-1, s, t.a), rots(d-1, s, t.b)) # 交换单个对 def swap(s, a, b): switch s: case 0: return (a,b) case _: return (b,a) # 测试 # ------- # 生成一个大树 def gen(d, x): switch d: case 0: return x case _: return (gen(d-1, x * 2 + 1), gen(d-1, x * 2)) # 对大树求和 def sum(d, t): switch d: case 0: return t case _: (t.a, t.b) = t return sum(d-1, t.a) + sum(d-1, t.b) # 对大树排序 def main: return sum(20, sort(20, 0, gen(20, 0)))
</details>

如果你对其他算法感兴趣,可以查看我们的示例文件夹

其他资源

  • 要了解Bend背后的技术,请查看HVM2论文
  • 我们正在编写官方文档,同时如需更深入的解释,请查看GUIDE.md
  • 阅读FEATURES.md了解我们的功能
  • Bend由HigherOrderCO开发 - 加入我们的Discord

编辑推荐精选

Vora

Vora

免费创建高清无水印Sora视频

Vora是一个免费创建高清无水印Sora视频的AI工具

Refly.AI

Refly.AI

最适合小白的AI自动化工作流平台

无需编码,轻松生成可复用、可变现的AI自动化工作流

酷表ChatExcel

酷表ChatExcel

大模型驱动的Excel数据处理工具

基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。

AI工具酷表ChatExcelAI智能客服AI营销产品使用教程
TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
AIWritePaper论文写作

AIWritePaper论文写作

AI论文写作指导平台

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

AI辅助写作AI工具AI论文工具论文写作智能生成大纲数据安全AI助手热门
博思AIPPT

博思AIPPT

AI一键生成PPT,就用博思AIPPT!

博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。

AI办公办公工具AI工具博思AIPPTAI生成PPT智能排版海量精品模板AI创作热门
潮际好麦

潮际好麦

AI赋能电商视觉革命,一站式智能商拍平台

潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。

iTerms

iTerms

企业专属的AI法律顾问

iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。

SimilarWeb流量提升

SimilarWeb流量提升

稳定高效的流量提升解决方案,助力品牌曝光

稳定高效的流量提升解决方案,助力品牌曝光

Sora2视频免费生成

Sora2视频免费生成

最新版Sora2模型免费使用,一键生成无水印视频

最新版Sora2模型免费使用,一键生成无水印视频

下拉加载更多