多线程计算的制作方法
【专利摘要】本发明提供了一种系统、方法和计算机程序产品用于改进多线程应用程序的资源利用率。本文所公开的技术提供事件驱动方式以仅在需要时启动内核来进行通道数据上的操作且然后终止以释放资源,而不是要求线程在等待来自通道的数据时阻塞或要求上下文切换以将阻塞最小化。这些操作在硬件中被有效处理,但是足够灵活能以所有编程模型方式来实施。
【专利说明】多线程计算
[0001] 发明背景 发明领域
[0002] 本发明大体上涉及软件编程,并且更具体来说,涉及多线程编程技术。
【背景技术】 [0003] 描述
[0004] 许多高性能计算应用程序被使用多线程技术编写。当使用多线程技术时,执行的 多个线程可以同时或通过交替访问处理流水线在不同的任务上工作。例如,如果可以将任 务分解成两个不同的子任务,那么建立两个单独的线程可为有利的,每一个处理不同的子 任务。然后,这些线程生成其对应的结果,其共同解决整个任务。
[0005] 存在不同的技术用于给任务分配工作。一个方式通常被称为"生产者-消费者设 计。"在生产者-消费者设计方式内,一个或多个线程负责生成数据,而一个或多个线程负 责消费所生成的数据。举例来说,生产者线程可负责将数据从文件读取至可由消费者线程 访问的存储区中。消费者线程从该存储区检索数据并且根据需要处理(消费)数据。
[0006] 随着消费者线程的责任变得更复杂,消费者线程的资源要求通常也变得更复杂。 在生产者-消费者设计方式中,随着数据从生产者线程到达存储区中,消费者线程可用于 处理数据。对于消费者线程保持驻留在存储器中的该要求需要额外的资源利用率。另外, 甚至在存储区为空,消费者线程不进行任何操作的情况下,交换消费者线程出入有源存储 器也很昂贵(例如,对于额外的处理循环、完成时间、功率和其它方面)。
[0007] 因此,所希望的是减少消费者线程的资源要求的技术。
[0008] 发明的实施方案的概要
[0009] 本发明的实施方案包括一种方法,其包括:定义通道、定义被配置成从所述通道读 取数据的消费者内核、定义被配置成将数据写至所述通道的生产者内核、以及寄存被配置 成在满足所述通道的条件时启动所述消费者内核的通道事件。
[0010] 本发明的另一个实施方案包括计算机可读存储装置,其具有在其上存储的指令, 由计算装置执行所述指令使所述计算装置进行包括以下的操作:定义通道、定义被配置成 从所述通道读取数据的消费者内核、定义被配置成将数据写至所述通道的生产者内核、以 及寄存被配置成在满足所述通道的条件时启动所述消费者内核的通道事件。
[0011] 本发明的又一个实施方案包括一个系统,其具有:被配置成存储包括通道的模块 的存储器、被配置成从所述通道读取数据的消费者内核、被配置成将数据写至所述通道的 生产者内核、以及被配置成寄存通道事件的寄存模块,其中所述通道事件被配置成在满足 所述通道的条件时启动所述消费者内核,并且一个或多个处理器被配置成处理所述模块。
[0012] 本发明的进一步特征和优点以及本发明的各种实施方案的结构和操作在下文中 参考附图详细描述。要注意的是本发明不受限于本文所述的具体实施方案。此类实施方案 在此呈现仅用于说明的目的。基于本文所包含的教导,其它实施方案对于相关领域中的技 术人员将是显而易见的。
[0013] 附图简述
[0014] 在此并入并形成说明书的部分的附图图示本发明的实施方案,并且与说明书一起 进一步用于解释本发明的原理并使相关领域中的技术人员能够制作和使用本发明。
[0015] 图1是使用现有技术的实例多线程应用程序。
[0016] 图2图示根据本发明的实施方案的多线程应用程序。
[0017] 图3是根据本发明的实施方案的图示开发多线程应用程序的操作的流程图。
[0018] 图4是根据本发明的实施方案的图示扩展通道和事件处理的操作的流程图。
[0019] 图5是根据本发明的实施方案的图示符合示例性生产者-消费者实施方式的消费 者内核的操作的流程图。
[0020] 图6描绘实例计算机系统,在其中可实施本发明的实施方案。
[0021] 现在将参考附图描述本发明。在附图中,相同的附图标记大体上指示相同或功能 类似的元件。另外,附图标记的最左边的数字标示所述附图标记首次出现的附图。
【具体实施方式】
[0022] 本发明的下列详细说明参考图示符合本发明的示例性实施方案的附图。在不脱离 本发明的精神和范围的情况下,其它实施方案是可能的并且可以对实施方案做出修改。因 此,【具体实施方式】不意在限制本发明。相反,本发明的范围由所附的权利要求定义。
[0023] 如下文所述的本发明的方面可以被实施在软件、硬件、固件和/或附图中所示的 实体的许多不同的实施方案中,这对于本领域的一个技术人员将是显而易见的。用于实施 本发明的任何实际软件代码以及硬件的专门控制不限制本发明。因此,将在给定本文所呈 现的细节级别可做出实施方案的修改和变化的理解的基础上描述本发明的操作行为。
[0024] 另外,本发明的各种实施方案的仿真、合成和/或制造可部分通过使用包括通用 编程语言(诸如C或C++)、包括Verilog HDL、VHDL、Altera HDL(AHDL)等的硬件描述语言 (HDL)、或者其它可用的编程和/或原理图捕获工具(诸如电路捕获工具)的计算机可读代 码(如上文所提及的)来完成,并且这对于本领域的一个普通技术人员将是明显的。该计 算机可读代码可以置于包括半导体、磁盘、光盘(诸如CD-ROM、DVD-ROM)的任何已知的计 算机可使用介质中,并且作为在计算机可使用(例如可读)传输介质(诸如载波或包括基 于数字、光学或模拟介质的任何其它介质)中体现的计算机数据信号。因此,可以通过包括 (因特网和互联网)的通信网络传送代码。要理解的是由上文所述的系统和技术完成的功 能和/或提供的结构可以在核(诸如图形处理单元(GPU)核)中表示(这体现在编程代码 中)并且可被转换成硬件作为生产集成电路的部分。将了解的是其它类型的核或处理单元 可以提供体现本发明的方面的功能和/或结构。例如,这些处理单元可包括中央处理单元 (CPU)、上述图形处理单元、数字信号处理器、应用程序处理器及其类似物。
[0025] 参考在该说明书中的模块和权利要求意指用于进行所指示的功能的硬件或软件 部件的任何组合。模块不需要是严格定义的实体,使得若干模块可重复硬件和软件部件的 功能。例如,软件模块可指代在程序内的单行代码,所述程序本身是单独的软件模块。相关 领域中的一个技术人员将理解可根据例如许多格式或性能优化技术来定义模块的功能。
[0026] 图1是使用现有技术的实例多线程应用程序100。在该实例中,主进程在步骤102 产生线程,特别是根据生产者-消费者设计方式产生一个或多个生产者线程和一个或多个 消费者线程。相关领域中的一个技术人员将了解存在并与该公开相关的其它线程模型,并 且在该公开的此处和别处通过举例的方式使用生产者-消费者设计方式。
[0027] 在步骤104中,生产者线程的任务是生成数据。例如,生产者线程可从文件或数据 库读取数据。该数据可能是应用程序1〇〇被配置成处理的任何数据,诸如由线集组成的图 形。为了该实例的目的,假定可以在处理来自图形文件的线或其它集的数据的同时处理其 它线或集的数据。
[0028] 在步骤106处,生产者确定在缓冲器112中是否存在放置数据的空间。如果不存 在,生产者等待直至如在步骤108中所指示的空间变得可用。该等待状态有时已知为"阻 塞",其中线程不能够进行进一步处理直至资源变得可用。在阻塞时,线程尽管不进行任何 有用功都继续使用系统资源。
[0029] -旦资源(在该情况中缓冲器112)变得可用,在步骤110中生产者就将数据放置 在缓冲器112中。然后,生产者继续回到步骤104以生成任何其它数据(例如来自图形文 件的其它图像线)。
[0030] 消费者线程的任务是处理生产者放置在缓冲器112中的数据。多个生产者和多 个消费者可以用在生产者-消费者设计方式中;尽管在实践中消费者的数量趋于超过生产 者,因为消费者线程负责多个耗时的处理。
[0031] 继续生产者-消费者设计方式的该实例,提供消费者线程以执行来自图形文件单 个线或其它集的数据。在一个实施方案中,消费者线程能够以真实并行操作独立于来自图 形文件的其它数据来进行该工作。例如,消费者线程可用于减少图形的色域(每个像素分 配的位数),并且每个可以在图形的对应的数据上如此进行。相关领域的一个技术人员将再 次了解仅通过举例而不是限制的方式提供该应用程序。
[0032] 在步骤114处,消费者线程确定在缓冲器112中是否存在继续工作的数据以便进 行其工作。如果不存在可用数据,消费者线程不能够继续进行并且必须如在步骤116中所 指示的等待(阻塞)。如上文所论述的,消费者线程在阻塞时继续利用系统资源直至在缓冲 器112中的数据变得可用。
[0033] 存在用于线程阻塞的各种机构。例如,线程可以测试条件并且阻塞直至满足条件 (例如测试缓冲器是否具有数据、锁定测试等)。当满足该条件时,线程则可以继续进行。在 该情况下,线程继续进行至步骤118以从缓冲器112检索数据。然后,在步骤120处线程通 过处理数据(例如减少图形数据的线的色域)来消费数据。然后,消费者线程返回至步骤 114,并且准备好处理其它工作。
[0034] 在方法100中所述的该方式的显著问题是在阻塞状态(例如上文的步骤108和 116)中甚至没有进行有用功时线程的显著资源利用率。这可以在上下文切换处理器中通过 将阻塞的线程切换出处理流水线以使其它线程能够利用一些处理资源而得到一定程度的 改善。即使如此,上下文切换需要为已经切换出的线程保留每线程状态的信息,使得在将其 切换进来时保存其状态信息。另外,不是所有处理器都能够进行必需的上下文切换操作,诸 如尽管如此但是不能够多线程编程的许多GPU。
[0035] 因此,传统的实施方式不是有效方式,其中一个线程编写且另一个线程读取、在阻 塞是读取线程在空的通道上。这导致长期运行的线程占用系统资源,并且可需要由调度器 切换出去。另外,即使切换出去,这些线程继续消费资源以保留每线程状态信息。
[0036] 图2图示根据本发明的实施方案的多线程应用程序200。多线程应用程序200以 及其中所体现的技术提供对于与线程阻塞相关联的现有资源利用率问题的低效的解决方 案。再次呈现本文的生产者-消费者模型的环境下的论述,但是相关领域中的技术人员将 了解该技术可应用于可发生阻塞的其它多线程模型。
[0037] 多线程应用程序200根据本发明的实施方案提供生产者内核202和消费者内核 210。通过非限制性实例的方式,本文的实施方式细节在由Khronos Group开发的OpenCL 并行编程标准的环境下论述。然而,相关领域的一个技术人员将了解这些技术可应用于其 它开发平台。
[0038] 生产者内核202和消费者内核210是使用OpenCL "内核"术语的分别对应于生产 者任务和消费者任务的代码块。在OpenCL中,内核是由线程或一组并行线程处理的任务。 OpenCL运行时间将要执行的内核置于命令队列上,将该内核(线程)排队用于在特定装置 上执行。OpenCL的灵活性准许为用于包括CPU和GPU的大量处理装置的内核排队。如将了解 的,还可以米用 API 而不是 OpenCL。例如,来自 Microsoft Corporation 的 DirectCompute? 是可能采用的另一个API。
[0039] 为了图示生产者内核202和消费者内核210的数据流程,图2还图示根据本发明 的实施方案的生产者队列204和消费者队列208的使用。根据本发明的实施方案,生产者 队列204不需要是字面上的队列,而是生产者内核202读取以提供工作用于一个或多个消 费者内核210的执行的一些种类的数据源。参照回先前的实例,包含图形数据线的文件可 能被视作生产者队列204,其中生产者内核202从文件读取图形数据线。相关领域中的一 个技术人员将了解可以利用其它数据源,并且通过举例而不是限制的方式提供生产者队列 204。
[0040] 类似地,根据本发明的实施方案,消费者队列208不需要是字面上的队列,而是呈 现消费者内核210处理的工作的一些目标。参照回先前的实例,根据本发明的实施方案,每 个消费者内核210从消费者队列208拉出图形数据的单个线并进行处理。多个消费者内核 210可以如此进行用于其各自的工作。相关领域中的一个技术人员将了解可使用用于消费 者内核210的工作的其它源,并且通过举例而不是限制的方式提供消费者队列208。
[0041] 代替使用图1的简单缓冲器实例,多线程应用程序200根据本发明的实施方案引 入通道206。通道206以及支持的功能提供消除消费者线程阻塞的能力。
[0042] 通道206不是单个缓冲器或队列,而是提供在生产者内核202与消费者队列208 之间的准许寄存与通道相关联的内核启动触发器的更复杂的通信通路。该内核启动触发器 将在满足条件(诸如消费者队列208中存在工作)时启动消费者内核210。
[0043] 图3是根据本发明的实施方案的图示利用该方式开发的多线程应用程序的操作 的方法300的流程图。该方法开始于步骤302并且继续进行至步骤304,其中定义了生产者 内核。通过非限制性实例的方式,使用已经扩展以容纳本文所公开的新颖通道和事件处理 概念的OpenCL语法,可以下列方式定义生产者内核:
[0044]
【权利要求】
1. 一种方法,其包括: 定义通道; 定义被配置成从所述通道读取数据的消费者内核;以及 寄存被配置成在满足所述通道的条件时启动所述消费者内核的通道事件。
2. 根据权利要求1所述的方法,其中所述通道的所述条件在至少一个数据块在所述通 道中时被满足。
3. 根据权利要求1所述的方法,其中所述通道的所述条件在所述通道已满时被满足。
4. 根据权利要求1所述的方法,其还包括: 在运行时将所述通道分配给处理单元的存储器单元。
5. 根据权利要求1所述的方法,其还包括: 执行被配置成观察所述通道事件并且触发所述消费者内核的所述启动的硬件调度系 统。
6. 根据权利要求1所述的方法,其还包括: 当满足所述通道的所述条件时,将所述消费者内核放置在命令队列中,其中所述命令 队列被配置成处理所述消费者内核的所述启动。
7. 根据权利要求1所述的方法,其还包括: 启动所述消费者内核; 在所述消费者内核处读取来自所述通道的所述数据; 消费所述数据;以及 终止所述消费者内核。
8. 根据权利要求1所述的方法,其还包括: 定义被配置成将数据写入所述通道的生产者内核。
9. 一种计算机可读存储装置,其具有存储在其上的指令,由计算装置执行所述指令使 所述计算装置进行包括以下的操作: 定义通道; 定义被配置成从所述通道读取数据的消费者内核;以及 寄存被配置成在满足所述通道的条件时启动所述消费者内核的通道事件。
10. 根据权利要求9所述的计算机可读存储装置,其中所述通道的所述条件在至少一 个数据块在所述通道中时被满足。
11. 根据权利要求9所述的计算机可读存储装置,其中所述通道的所述条件在所述通 道已满时被满足。
12. 根据权利要求9所述的计算机可读存储装置,所述操作还包括: 在运行时将所述通道分配给处理单元的存储器单元。
13. 根据权利要求9所述的计算机可读存储装置,所述操作还包括: 执行被配置成观察所述通道事件并且触发所述消费者内核的所述启动的硬件调度系 统。
14. 根据权利要求9所述的计算机可读存储装置,所述操作还包括: 当满足所述通道的所述条件时,将所述消费者内核放置在命令队列中,其中所述命令 队列被配置成处理所述消费者内核的所述启动。
15. 根据权利要求9所述的计算机可读存储装置,所述操作还包括: 启动所述消费者内核; 在所述消费者内核处读取来自所述通道的所述数据; 消费所述数据;以及 终止所述消费者内核。
16. 根据权利要求9所述的计算机可读存储装置,所述操作还包括: 定义被配置成将数据写入所述通道的生产者内核。
17. -种系统,其包括: 被配置成存储模块的存储器,其包括: 通道, 消费者内核,其被配置成从所述通道读取数据,以及 寄存模块,其被配置成寄存通道事件,其中所述通道事件被配置成在满足所述通道的 条件时启动所述消费者内核;以及 一个或多个处理器,其被配置成处理所述模块。
18. 根据权利要求17所述的系统,其中所述通道的所述条件在至少一个数据块在所述 通道中时被满足。
19. 根据权利要求17所述的系统,其中所述通道的所述条件在所述通道已满时被满 足。
20. 根据权利要求17所述的系统,其还包括: 分配模块,其被配置成在运行时将所述通道分配给所述一个或多个处理器的存储器单 J Li 〇
21. 根据权利要求17所述的系统,其还包括: 硬件调度系统,其被配置成观察所述通道事件并且触发所述消费者内核的所述启动。
22. 根据权利要求17所述的系统,其还包括: 命令队列,其被配置成在满足所述通道的所述条件时接收所述消费者内核以及处理所 述消费者内核的所述启动。
23. 根据权利要求17所述的系统,其中所述消费者内核还被配置成消费所述数据以及 终止。
24. 根据权利要求17所述的系统,其还包括: 生产者内核,其被配置成将数据写入所述通道。
【文档编号】G06F9/54GK104094235SQ201380006344
【公开日】2014年10月8日 申请日期:2013年1月23日 优先权日:2012年1月23日
【发明者】迈克尔·克莱尔·休斯顿, 迈克尔·曼特, 李·W·豪斯, 本尼迪克特·R·盖斯特 申请人:超威半导体公司