acm-header
登录

ACM通信

研究突出了

利用广义流融合实现向量指令


利用矢量指令与广义流融合,插图

来源:iStockPhoto.com

理想情况下,一个由简洁的、自包含的组件组成的程序的性能应该与手工编写的等效版本一样好,在手工编写的版本中,许多组件的功能被手工组合成一个整体实现。也就是说,程序员不应该为了获得性能而牺牲代码的清晰性或良好的软件工程实践——我们想要的是不影响性能的组合性。本文展示了如何在序列处理函数(包括数组处理等应用程序)领域为高级Haskell实现这一目标。

流融合的前期工作3.演示如何将一些高级序列处理函数自动转换为有效的实现。它在Haskell库中被用于操作字节数组、Unicode文本和未装箱的向量,效果非常好。然而,一些操作,如向量追加,在流融合框架中不能很好地执行。其他的,比如使用现代x86芯片上的SSE和AVX指令的SIMD计算,似乎根本不适合流融合框架。我们描述了广义流融合,它通过仔细选择流表示来解决这些问题。基准测试表明,使用我们的编译器和库编写的高级Haskell代码可以生成比编译器和手工向量化C更快的代码。

回到顶部

1.简介

要求编译器能够将表示为高级Haskell代码的数值算法转换为严格的机器代码似乎是不合理的。编译器必须处理盒装数字类型,处理延迟求值,并消除中间数据结构。然而,Glasgow Haskell Compiler已经变得“足够聪明”,在许多领域,用于表示数值计算的Haskell库不再需要为了抽象而牺牲速度。

让这种牺牲变得不必要的关键发展是流融合。3.序列上的算法——无论它们是列表还是向量(数组)——都是使用折叠、映射和压缩等操作在函数式语言中自然表示的。尽管是高度模块化的,但这些操作会产生不必要的中间结构,导致代码效率低下。消除这些中间结构被称为森林砍伐或融合。方程定律,如映射f〇映射g≡映射(f〇g),允许消除其中一些中间结构;寻找更普遍的规律一直是大量研究的主题。


没有发现记录

登录阅读全文

登录

如果您是ACM会员、通讯订阅用户或数字图书馆订阅用户,则使用ACM Web帐户用户名和密码登录以访问优质内容。

需要访问吗?

请选择下面的一个选项以访问高级内容和功能。

创建一个网上帐户

如果你已经是ACM会员,通信订阅者或数码图书馆订阅者,请设置网页帐户,以浏览本网站的优质内容。

参加ACM

成为ACM的会员,可以充分利用ACM卓越的计算信息资源、网络机会等优势。

订阅ACM杂志通讯

获得50多年的中华中医药学会内容的完整访问权限,并每月获得杂志印刷版。

购买这篇文章

非会员可以购买这篇文章或刊登这篇文章的杂志。
Baidu
map