一、为什么需要异构计算?
一般情况下,我们的程序都是运行在CPU上。但如果有大量的数据需要计算时,CPU可能就会显得力不从心,比如进行大量的浮点运算。遇到这样的场景,我们通常的思路都是提高CPU的计算能力,比如说主频,来获得更快的计算速度。那么,是否有更好的方法来加快计算速度呢?这个答案就是使用Heterogeneous computing异构计算。
二、什么是异构计算?
所谓Heterogeneous computing异构计算,是指使用多种处理器或多个核心来进行协同计算。这样的系统不仅可以通过添加相同类型的处理器来获取更强的性能,还可以通过添加不同的协处理器,再结合专门的处理功能来处理特定任务,从而获得更强的性能。例如,可以使用CPU(Central Processing Unit)、GPU(Graphic Processing Unit)、甚至APU(Accelerated Processing Units, CPU与GPU的融合)等计算设备的计算能力来提高系统的运算速度。
当前所有的硬件平台,无论是台式机还是智能手机,都是围绕多核和异构的架构来设计片上系统(SoC)。就算是服务器和超级计算机,也都在使用专用核心,比如GPU和DSP等,来提高系统性能。异构系统越来越普遍,对于支持这种环境的计算而言,也正受到越来越多的关注。
三、Snapdragon异构计算介绍
1、Snapdragon异构计算概述
Snapdragon Heterogeneous Compute(异构计算)SDK(HetCompute)就是高通为开发者工具集中用于开发阶段的重要工具,它可以帮助开发者更好地利用高通平台硬件的性能,提升应用的效率。
为了能够在用户应用程序级别充分利用硬件性能,这个SDK 为CPU、GPU和DSP提供了编程接口,支持C++ 编程。通过硬件,可以智能地进行内存管理和内核的同步。在每个CPU、GPU、DSP硬件上,通过SDK的API,允许去控制代码的执行模式,同时也允许在CPU集群上控制代码的执行模式。这些API,对于降低资源的使用率有很大作用。
HetCompute包括以下特性:
- HetCompute支持并行编程模型,其强大的抽象设计能够帮助开发者在设计阶段就构建动态并发来减轻并行编程的负担。而且在较高层面上,HetCompute提供了一组并行编程模式,能够捕获许多现有的并行模块,并增加数据流和工作消除作为优化的第一类基元,从而提高程序员的工作效率。
- HetCompute将异构执行集成到并发任务图中,消除了在不同设备上执行的内核之间管理数据传输和显式数据副本的负担。在较低级别,HetCompute为优化功率和减少工作量提供了尖端算法,使其能够隐藏硬件特性,从而允许开发便携式应用程序。此外,HetCompute还能够支持动态映射到异构执行单元。
- HetCompute在C ++中嵌入了编程模型,并提供了C ++库API。而C ++是大量面向性能的程序员所熟悉的语言,因此可以帮助开发人员更容易获取对象的抽象。同时,HetCompute还可以通过pthreads和OpenGL等方式与现有库实现互操作,从而实现对现有应用程序的增量开发。
HetCompute运行在运行时系统之上,该系统将在SoC上的所有可用计算资源上并发执行应用程序。HetCompute运行时系统本质上是线程,地址空间和设备的资源管理器,它建立在一系列最先进的算法之上,使程序员不用再为管理资源而耗费精力,并为HetCompute执行模型提供最佳性能。
2、Snapdragon异构计算架构
下图说明了HetCompute架构下图说明了HetCompute架构:
Qualcomm® Snapdragon™ 异构计算SDK是一个用户级库,它与OS服务集成,以尽可能地隐藏硬件的复杂性,同时仍然为开发人员提供对性能的控制。HetCompute异构计算SDK利用现有标准允许在整个SoC上执行:POSIX和C ++ 11用于利用多核,OpenCL用于调度到GPU,OpenDSP用于调度到Qualcomm® Hexagon™ DSP。使用HetCompute的优势在于它为所有这些设备提供了无缝接口,使程序员能够专注于正在开发的应用程序,而不是管理硬件,不同的执行模型和数据传输。
HetCompute的执行模型是并发任务图,具有非循环控制依赖性和/或数据依赖性,用于定义哪些任务应同时执行。任务(Task)是独立工作的单元,它们是一种直观的方法,用于指定可映射到不同执行单元的计算块。依赖关系(控制和数据)提供了动态构建并发任务图的机制。该任务将并行执行,因为此时平台上有许多执行单元可用。但是请注意,在移动设备上,由于功率和热量限制,某些执行单元将无法使用,甚至无法动态消失。因此,最好是程序员专注于使用HetCompute任务表达并发性,运行时将它们映射到所有可用资源。在HetCompute中,异构执行与多核执行没有什么不同。但是,为了提供最佳性能,HetCompute要求程序员编写专门的内核。
HetCompute运行时使用最先进的工作调度程序管理任务并将它们映射到平台资源。调度程序基于程序员使用的新颖的高级API驱动的启发式方法,实现工作的减少和任务到执行单元的动态映射。
HetCompute提供了两个级别的API:
- 一组高级API,包括并行编程模式,基本任务和组创建及启动。这些API适用于那些更关注生产力的程序员,而且在大多数情况下使用这些API,只需要较少的编码量就可以为您提供最佳性能。
- 一组低级API,允许专家程序员更好地控制并行流程。这些API可以提供更好的性能,但代价是牺牲一些高级API提供保障。这些API包括了直接访问任务指针对象,任务属性和模式调整器,专用分配器,缓冲区一致性和同步以及存储类等等,这些都是高级API的基础,低级API可以和高级API一起协同工作。但是,使用低级API需要很好地理解并行编程以及并发执行可能对程序产生的副作用,因此,请谨慎使用。
HetCompute更适用于那些更关注性能的程序员们,它被设计用于帮助应用程序员和库程序员去设计高性能应用程序和特定领域的库程序。它旨在简化组合库:HetCompute任务可以从任何应用程序的线程启动(无需加入特定的线程池),可以分层启动任务,或单独或作为一组来同步,以及统一表示的模式和任务。这些新颖的特性使HetCompute成为了异构执行的框架。许多应用程序开发者可以通过嵌入支持Qualcomm HetCompute的库来使用HetCompute技术,从而间接获益于异构执行的效率提升,而这并不会增加并行编程的负担。
四、总结
本片主要简单介绍了Snapdragon异构计算SDK,欢迎感兴趣的小伙伴一起交流学习。