中科院计算所研究员关注异构环境下的编程和编译方向

2024-05-20
来源:网络整理

本文独家采访嘉宾:崔惠民,中国科学院计算技术研究所研究员。 崔惠民研究员重点研究异构环境下的编程与编译方向。 具体研究领域包括:异构编程模型、异构编译优化、数据中心编程与编译技术等。

正在关注《2021年度技术盘点与展望》的朋友会发现,在编程语言部分,异构编程以及充分利用多核算力已经成为众多编程领域研究人员和开发人员关注的焦点语言。

异构编程之所以如此受关注,可以归因于“云边端融合”的发展,CPU和GPU的混合应用构成了当前主要的计算基础设施。 但另一方面,与硬件的高度协作也是编程语言的设计初衷。 用中国科学院计算技术研究所研究员崔惠民教授的话说,这是:

“编程语言设计一直有两个目标:一是让编程变得越来越容易;另一个目标是新的硬件架构出现后,编程语言必须能够充分利用硬件的特性,发挥其性能”。

但无论是CPU、GPU还是FPGA,其演进时间都不短。 为什么我们现在对它还知之甚少? 一方面是生态原因,因为整个开发者群体呈倒金字塔分布,大多数顶级开发者不需要关注太多底层细节,所以异构编程生态系统小的; 另一方面是由于编程本身的异构性造成的。 在身体上——太难了。

异构编程让开发者“为难”

早期,编程语言会通过引入新功能来支持多核计算,以更充分地利用硬件性能。 例如,C/C++为共享内存并行系统引入了多处理器编程,使用多线程来消耗多核计算能力。

随着GPU越来越多地部署在云计算、数据科学、人工智能等领域,支持异构编程的框架开始出现。 现在应用最广泛的是基于自家硬件推出的CUDA框架。

CUDA无疑具有开创性,率先将GPU从“显卡”的范畴中剔除。 作为一款功能强大的芯片,程序员可以使用硬件访问接口直接对其进行编程。 后来,C++ AMP围绕异构编程的概念不断迭代新的开发工具。

然而这种发展趋势也给异构编程带来了困扰:由于硬件本身依然多元化,大多数厂商更喜欢围绕自己的硬件进行开发,没有或者不愿意分配太多的资源来支持其他厂商的硬件编程框架导致异构编程解决方案永远不够收敛。

直到今天,异构编程的性能调优一直是一个相当大的挑战。 它要求程序员不仅要对软件开发有足够深入的了解,还要对各类不同的硬件有深入的了解。

崔惠民教授以团队日常工作为例,详细描述了异构编程的难点:

“团队当时正在做一个超级计算上的大规模应用,其中一项任务就是开发泊松解算器并对其进行性能调优。按照计划,我们首先要对应用进行拆分(很多C语言代码模块优化并不是做得好),然后逐步评估计算量,然后将计算量最大的部分加载到加速核心执行。

当时我们发现其中有两个步骤对计算量要求最高,所以我们做了初步的实现。 但经过测试,我们发现性能非常差。 我们分析原因,发现全部存储都是外部的,片内高速存储没有利用好。 为了充分利用片上存储,我们研究并使用了循环阻塞、数据双缓冲等机制,但应用后发现性能仍然不够好。

没有别的办法,只能继续分析。 我们很快发现,虽然存储在这里没有问题,但数据检索的带宽没有得到充分利用。 超级计算芯片有自己非常复杂的数字检索机制。 为了优化这方面的性能,我们花费了大量的时间。

然而,调整数据访问带宽并没有完全解决问题。 我们还发现,不规则的数据访问导致阻塞变得不合理……调整阻塞意味着矢量化策略也需要重新调整……

最终,当我们将性能调整到可以接受的水平时,花了10个人月(项目组有两个人,每个人花了5-6个月)。 ”

编译器的黄金时代已经到来

虽然很多开发者在跨硬件迁移程序时的工作并不像崔教授基于超算平台的性能调优那么复杂,对性能的要求也没有那么高,但难度仍然被认为很高。 这背后的原因应该追溯到CPU、GPU甚至FPGA硬件设计的差异。

CPU具有较为丰富的多样化指令集,并且片上具有多级缓存。 基于CPU进行程序调优,首先要想办法将程序划分为更细粒度的并行任务,并在负载均衡的情况下分配到各个核上执行,使得每组线程的管道都尽可能满尽可能地,使共享内存上的访问锁尽可能少。

小程序难为开发者_小程序难为开发者_小程序难为开发者

与CPU相比,基于GPU的研发需要将程序划分为比CPU更高的并发度和更细的粒度。 分区完成后,还必须考虑数据在存储中的放置。 同时,由于GPU擅长处理比较规律的计算,我们也需要更好地理解这种比较规律的计算模型,甚至涉及到一些数据结构的重新设计。 同时,GPU拥有大量的浮点运算组件,你需要找到足够的浮点运算作业才能充分利用其特性。

FPGA 与上述任何编程模型都有很大不同。 无论CPU还是GPU,本质上都完成了从软件到硬件的映射,但FPGA的关键在于精心设计生成电路,充分发挥硬件性能。 早期的FPGA完全基于底层硬件描述语言编写,研发工作非常困难。

由于硬件的巨大差异,异构编程通常只能选择中间方案。 如果在CPU上实现了极致的性能,几乎肯定会导致GPU和FPGA上的性能不佳。

对开发人员的映射使迁移变得困难。 因此,另一类解决方案是基于支持异构编程的新编程语言。 C/C++只是一种早期形式。 一个比较典型的案例出现在中国——华为在2021年推出了必胜C++,并在北京发布了多种计算计算架构。 据华为官方介绍,必胜C++是一种支持多种算力的通用编程语言。 它基于C++,支持SYCL异构编程标准。 可以用一种语言对鲲鹏、升腾以及业界主流算力进行编程。 为了更好地与必胜C++合作,华为还发布了加速库,全称“北明融合加速库2.0”,提供基于API的编程调用,用于加速领域的关键功能,进一步屏蔽硬件细节。

北明多元化算力计算架构主要面向多元化算力集群的软件开发需求,集成了包括开发语言、编译器、调度器、开发框架、计算套件、开发工具链在内的一整套多元化算力开发解决方案。 和生态。 必胜C++和北冥融合加速库2.0是计算架构的关键组件,相当于为开发者提供了整体解决方案集成。

对于必胜C++和北铭多元化的计算计算架构来说,采用的SYCL异构编程标准是业界的一大创新和亮点。 SYCL 异构编程标准是一个免版税、跨平台的抽象层,允许使用标准 ISO C++ 编写异构处理器的编码,并在同一源文件中包含应用程序的主机代码和内核代码,它也是一组标准近期受到业界较高关注。 许多研究人员正在探索基于SYCL的性能,但目前学术界还没有明确的答案。

无论是必胜C++还是北冥融合加速库,它的诞生一方面是为了缓解异构编程高度复杂的研发现状。 另一方面,也反映出编译器的“黄金时代”即将到来。 围绕编译器,解决编程语言层面的问题正在成为异构编程的核心解决方案。

2017年两位图灵奖获得者John L.和A.在年初的报告中预测,未来十年将是计算机架构领域的“新黄金十年”。 同时,也有专家提到,编译器的“黄金十年”也已经到来。

崔惠民教授提到:“过去,硬件发展得很快,软件也自然发展起来。我们把那个时代形容为‘免费午餐’。但现在,‘免费午餐’不复存在了。”

答:报告中提到,通过语言改进和编译器优化,应用程序可以实现6万倍以上的性能提升。 这就需要我们对编译器进行非常深入的优化,以匹配当前的硬件环境。

当然,编程语言和编译器的优化不仅仅是技术问题,更是产品设计问题。 它总是会在易用性和性能之间摇摆以达到最佳平衡。 C++ AMP曾因其易用性而受到工业界和学术界的广泛欢迎,但也因过度屏蔽底层操作,造成性能瓶颈而退出舞台。

同样的挑战对于必胜C++在国内肯定也会存在,而解决问题的主要途径很可能要归结于行业生态。

生态决定未来发展

崔惠民教授表示:“在基于CPU的编译器早期,大家对基础设施做了很好的抽象。他们认为与平台无关的部分开源,其他部分闭源。但现在大家更倾向于把他们自己的,而且还没有这样的东西。”

尤其是现在五金行业呈碎片化发展。 除了、的芯片外,鲲鹏、升腾、亿天等各种芯片也百花齐放。 如果没有生态支撑,所谓的异构编程基础设施很容易成为只属于某类芯片的基础设施。 开源也是一种值得重点考虑的实现方式,RISC-V组织模型就是一个很好的例子。

从生态角度来看,SYCL作为开放的异构编程标准,更有利于构建同一软件生态系统,避免异构开发包过度碎片化。

在国内,华为在必胜C++和北冥融合加速库方面的工作对整个行业来说是一个良好的开端。 它代表着中国企业在基础软件领域开始全面前进。 但与国外老牌厂商相比,能否实现弯道超车,还要看生态协同。

此外,崔惠民教授认为,产学界的合作也值得关注。 行业工程能力良好、需求充足、平台完善; 学术界具有良好的技术探索能力,一个学生的天马行空的想法也可能成为未来行业的创新解决方案。 两者的充分结合,能够更好地促进行业的发展。

对大学生进行普及教育是营造良性生态系统的又一重要举措。 学生团体中的成功推广也是CUDA早期成功的重要原因。

在国内,华为还建立了“智慧基地”产教融合协同教育基地,作为鲲鹏升腾与高校师生的学习和交流中心。 其相关在线课程还包括高性能计算等内容。 面向大学生的智能计算认证和鲲鹏应用开发者认证早在2019年就启动了,开创了国内产学融合的新路径。

总体而言,产学研的高度融合,加上一定的开源策略,可能决定异构编程生态的发展水平; 异构编程生态的发展也将决定未来IT基础设施的服务能力。 以国内企业为龙头,未来无疑充满想象。

分享