高效同步多个程序线程的技术的制作方法

文档序号:32434653发布日期:2022-12-06 17:30阅读:119来源:国知局
高效同步多个程序线程的技术的制作方法

1.各种实施例通常涉及并行处理计算架构,更具体地,涉及用于高效同步多个程序线程的技术。


背景技术:

2.除其他外,计算机系统通常包括一个或更多个处理单元,诸如中央处理单元(cpu)和/或图形处理单元(gpu),以及一个或更多个存储器子系统。通常,gpu包括多个并行执行程序指令的处理引擎,以相对于单个处理引擎提高性能。多个处理引擎中的每一个都执行“线程”,其中线程是指在特定输入数据集上执行的特定程序的实例。单指令多线程(simt)技术用于支持大量一般被同步线程的并行执行,本文称为“线程集”或更简单的“线程束(warp)”,使用被配置为向gpu内的一组处理引擎发出指令的通用指令单元。simt执行不是让所有处理引擎执行相同的指令,而是允许不同的线程更容易地遵循通过给定程序的不同执行路径。由于运行simt执行的线程被允许发散,因此线程可能会在不同的时间完成执行。
3.在许多应用中,线程并发地执行指令以完成程序的第一阶段,并且当所有线程都完成第一阶段时,继续并发执行指令以完成程序的第二阶段。为了确定所有线程都已完成第一阶段,每个线程在第一阶段的指令结束时都执行一条同步指令。当每个线程到达同步指令时,线程暂停执行或“阻塞”,直到所有线程都完成第一阶段。当最后一个线程执行同步指令时,线程解除阻塞并开始执行第二阶段的指令。
4.这种用于同步线程执行的方法的一个缺点是所有线程都被限制为在存储器中特定地址处的同一同步指令处同步。然而,对于某些应用程序,线程束中的第一线程子集执行第一指令集,而线程束中的第二线程子集执行第二指令集。如果第一指令集和第二指令集中的每一个都包括各自的同步指令,则这两个同步指令将位于存储器中的不同地址。结果,第一线程子集将无法可靠地与第二线程子集同步。
5.解决该缺陷的一种技术是在程序指令中包括同步大纲函数(synchronization outline function),其中该同步大纲函数包括同步指令。在所需的同步点,第一指令集包括调用同步大纲函数的指令。然后,第一线程子集在同步大纲函数中包括的同步指令处阻塞。类似地,在所需的同步点,第二指令集包括调用同步大纲函数的指令。然后,第二线程子集在同步大纲函数中包括的同步指令处阻塞。一旦第一子集中和第二子集中的所有线程都到达同步指令,线程就会解除阻塞。同步后,第一子集中的线程返回到第一指令集,而第二子集中的线程返回到第二指令集。然而,在程序代码中指定此同步大纲函数会增加复杂性,并且涉及额外的程序指令,这些程序指令对于程序员将其包含在程序中可能很麻烦。此外,调用同步大纲函数、执行该函数,然后从该函数返回需要额外的处理时间,从而降低整体性能。
6.如上所述,本领域需要更有效的技术,用于在具有并行处理计算架构的计算机系统中同步线程。


技术实现要素:

7.本公开的各种实施例阐述了一种计算机实现的方法,该方法用于在不同地址同步线程集。所述方法包括当执行位于第一地址的第一同步指令时,确定所述线程集中包括的第一线程已阻塞。所述方法还包括当执行位于第二地址的第二同步指令时,确定所述线程集中包括的第二线程已阻塞。所述方法还包括解除所述第一线程和所述第二线程的阻塞。所述方法还包括使所述第一线程返回到所述第一地址。所述方法还包括使所述第二线程返回到所述第二地址。
8.其他实施例包括但不限于实现所公开技术的一个或更多个方面的系统、包括用于执行所公开技术的一个或更多个方面的指令的一种或更多种计算机可读介质,以及用于执行所公开技术的一个或更多个方面的方法。
9.相对于现有技术,所公开技术的至少一个技术优势在于,利用所公开的技术,线程束中的不同线程子集通过位于存储器中不同地址的同步指令的多个副本进行同步。因此,当执行不同的指令集时,线程束中的线程能够彼此同步,而无需同步大纲函数或类似机制。因此,与现有方法相比,线程同步效率更高,开销更少,处理器性能也得到改善。这些优点代表了相对于现有技术方法的一项或更多项技术改进。
附图说明
10.为了能够详细理解各种实施例的上述特征的方式,可以通过参考各种实施例(其中一些在附图中示出)来对上述简要总结的发明概念进行更具体的描述。然而,应当注意,附图仅示出了本发明概念的典型实施例,因此不应被视为以任何方式限制范围,并且存在其他同等有效的实施例。
11.图1是被配置为实现各种实施例的一个或更多个方面的计算机系统的框图;
12.图2是根据各种实施例的在图1的并行处理子系统中包括的并行处理单元(ppu)的框图;
13.图3是根据各种实施例的在图2的并行处理单元(ppu)中包括的通用处理集群(gpc)的框图;
14.图4是根据各种实施例的在不同地址处同步的线程的执行流程;
15.图5是根据各种实施例的受同步操作的混叠和过早解析影响的线程的执行流程;
16.图6是根据各种实施例的防止同步操作的混叠和过早解析的线程的执行流程;以及
17.图7是根据各种实施例的用于在图2的ppu中在不同地址同步线程的方法步骤的流程图。
具体实施方式
18.在以下描述中,阐述了许多具体细节以提供对各种实施例的更透彻的理解。然而,对于本领域的技术人员将显而易见的是,可以在没有一个或更多个这些具体细节的情况下实践本发明构思。
19.如本文所述,并行处理计算架构包括被配置为在不同地址同步线程的处理引擎。给定线程束中的线程至少被划分为第一线程子集和第二线程子集。第一子集中的线程执行
第一指令集,而第二子集中的线程执行第二指令集。在同步点,第一子集中的线程执行在存储器中的第一地址处的第一同步指令。第一同步指令包括标识参与同步操作的线程的第一掩码。类似地,在同步点处,第二子集中的线程执行在存储器中的第二地址处的第二同步指令。第二同步指令包括标识参与同步操作的线程的第二掩码。
20.当两个线程子集中的每个线程执行各自的同步指令时,线程阻塞并等待其余线程到达同步点。当最后参与线程到达同步点并执行同步指令时,同步指令解析,第一子集和第二子集中的线程解除阻塞,并且后续指令以线程束同步方式执行。至少有一个线程执行同步操作。第一子集中的每个线程返回到第一指令集,以在第一同步指令之后的指令处或可选地在由立即偏移量指定的后续指令处继续执行。类似地,第二子集中的每个线程返回到第一指令集,以在第二同步指令之后的指令处或可选地在由立即偏移量指定的后续指令处继续执行。以此方式,第一子集中的线程在存储器中的与第二子集中的线程不同的地址处同步。
21.系统总览
22.图1是被配置为实现各种实施例的一个或更多个方面的计算机系统100的框图。如图所示,计算机系统100包括但不限于经由存储器桥(memory bridge)105和通信路径113耦合到并行处理子系统112的中央处理单元(cpu)102和系统存储器104。存储器桥105经由通信路径106进一步耦合到i/o(输入/输出)桥107,并且i/o桥107又耦合到交换机116。
23.在操作中,i/o桥107被配置为从输入设备108(诸如键盘或鼠标)接收用户输入信息,并且将输入信息经由通信路径106和存储器桥105转发到cpu 102以进行处理。交换机116被配置为提供i/o桥107和计算机系统100的其他组件之间的连接,诸如网络适配器118和各种插件卡120和121。
24.还如图所示,i/o桥107耦合到系统盘114,系统盘114可以被配置为存储内容、应用程序和数据,以供cpu 102和并行处理子系统112使用。一般而言,系统盘114提供应用程序和数据的非易失性存储,并可包括固定或可移动硬盘驱动器、闪存设备和cd-rom(光盘只读存储器)、dvd-rom(数字多功能光盘-rom)、蓝光、hd-dvd(高清dvd)或其他磁性、光学或固态存储设备。最后,尽管未明确示出,但诸如通用串行总线或其他端口连接、光盘驱动器、数字多功能光盘驱动器、胶片记录设备等的其他组件也可以连接到i/o桥107。
25.在各种实施例中,存储器桥105可以是北桥(northbridge)芯片,并且i/o桥107可以是南桥(southbridge)芯片。此外,通信路径106和113以及计算机系统100内的其他通信路径可以使用任何技术上合适的协议来实现,包括但不限于agp(加速图形端口)、超级传输(hypertransport)或本领域已知的任何其他总线或点对点通信协议。
26.在一些实施例中,并行处理子系统112包括图形子系统,该图形子系统将像素传送到显示设备110,该显示设备110可以是任何常规阴极射线管、液晶显示器、发光二极管显示器等。在这些实施例中,并行处理子系统112结合了针对图形和视频处理优化的电路,包括例如视频输出电路。如以下在图2中更详细地描述的,这种电路可以跨并行处理子系统112内包括的一个或更多个并行处理单元(ppu)合并。在其他实施例中,并行处理子系统112包括为通用和/或计算处理而优化的电路。同样,这种电路可跨并行处理子系统112内包括的一个或更多个ppu被合并,其被配置为执行此类通用和/或计算操作。在又一其它实施例中,并行处理子系统112内包括的一个或更多个ppu可被配置为执行图形处理、通用处理和计算
处理操作。系统存储器104包括至少一个设备驱动器103,其被配置为管理并行处理子系统112内的一个或更多个ppu的处理操作。
27.在各种实施例中,并行处理子系统112可以与图1的一个或更多个其他元件集成以形成单个系统。例如,并行处理子系统112可以与cpu 102和其他连接电路集成在单个芯片上,以形成片上系统(soc)。
28.应当理解,本文所示的系统是说明性的,并且可以进行变更和修改。可以根据需要修改连接拓扑,包括桥的数量和布置、cpu 102的数量以及并行处理子系统112的数量。例如,在一些实施例中,系统存储器104可以直接连接到cpu 102,而不是通过存储器桥105,并且其他设备将经由存储器桥105和cpu 102与系统存储器104通信。在其他替代拓扑中,并行处理子系统112可以连接到i/o桥107或直接连接到cpu 102,而不是连接到存储器桥105。在其他实施例中,i/o桥107和存储器桥105可以集成到单个芯片中,而不是作为一个或更多个分立设备存在。最后,在某些实施例中,可能不存在图1中所示的一个或更多个组件。例如,可以去掉交换机116,并且网络适配器118和插件卡120、121将直接连接到i/o桥107。
29.图2是根据各种实施例的在图1的并行处理子系统112中包括的并行处理单元(ppu)202的框图。尽管图2描绘了一个ppu 202,但如上所述,并行处理子系统112可以包括任意数量的ppu 202。如图所示,ppu 202耦合到本地并行处理(pp)存储器204。ppu 202和pp存储器204可以是使用一个或更多个集成电路设备(诸如可编程处理器、专用集成电路(asic)或存储设备)实现,或以任何其他技术上可行的方式来实现。
30.在一些实施例中,ppu 202包括图形处理单元(gpu),该图形处理单元可被配置为实现图形渲染管线,以执行与基于由cpu 102和/或系统存储器104提供的图形数据生成像素数据相关的各种操作。当处理图形数据时,pp存储器204可用作图形存储器,其存储一个或更多个常规帧缓冲区以及(如果需要)还存储一个或更多个其他渲染目标。除其他事项外,pp存储器204可用于存储和更新像素数据,并将最终像素数据或显示帧传送到显示设备110以供显示。在一些实施例中,ppu 202还可以被配置用于通用处理和计算操作。
31.在操作中,cpu 102是计算机系统100的主处理器,控制和协调其他系统组件的操作。特别地,cpu 102发出控制ppu 202的操作的命令。在一些实施例中,cpu 102将用于ppu 202的命令流写入数据结构(图1或图2中未明确示出),该数据结构可位于系统存储器104、pp存储器204或cpu 102和ppu 202均可访问的另一存储位置。指向数据结构的指针被写入推送缓冲区(pushbuffer),以启动对数据结构中命令流的处理。ppu 202从推送缓冲区读取命令流,然后相对于cpu 102的操作异步地执行命令。在生成多个推送缓冲区的实施例中,应用程序可以经由设备驱动器103为每个推送缓冲区指定执行优先级,以控制不同推送缓冲区的调度。
32.还如图所示,ppu 202包括i/o(输入/输出)单元205,该单元经由通信路径113和存储器桥105与计算机系统100的其余部分通信。i/o单元205生成用于在通信路径113上传输的分组(或其他信号),并且还从通信路径113接收所有传入分组(或其他信号),将传入分组定向到ppu 202的适当组件。例如,与处理任务相关的命令可以被定向到主机接口206,而与存储器操作(例如,从pp存储器204读取或写入)相关的命令可以被定向到交叉开关单元210。主机接口206读取每个推送缓冲区,并将存储在推送缓冲区中的命令流发送到前端212。
33.如上文结合图1所述,ppu 202与计算机系统100的其余部分的连接可以改变。在一些实施例中,包括至少一个ppu 202的并行处理子系统112被实现为可以插入到计算机系统100的扩展槽中的插件卡。在其他实施例中,ppu 202可以集成在具有总线桥的单个芯片上,例如存储器桥105或i/o桥107。同样,在其他实施例中,ppu 202的部分或全部元件可以与cpu 102一起被包括在单个集成电路或芯片系统(soc)中。
34.在操作中,前端212将从主机接口206接收的处理任务发送到任务/工作单元207内的工作分配单元(未示出)。工作分配单元接收指向处理任务的指针,这些任务被编码为任务元数据(tmd)并存储在存储器中。指向tmd的指针被包括在命令流中,该命令流存储为推送缓冲区并由前端单元212从主机接口206接收。可以被编码为tmd的处理任务包括与要处理的数据相关联的索引以及定义如何处理数据的状态参数和命令。例如,状态参数和命令可以定义要在数据上执行的程序。任务/工作单元207从前端212接收任务,并确保gpc 208被配置为在启动由每个tmd指定的处理任务之前的有效状态。可以为用于调度处理任务的执行的每个tmd指定优先级。还可以从处理集群阵列230接收处理任务。可选地,tmd可以包括一个参数,该参数控制tmd是添加到处理任务列表的头部还是尾部(或指向处理任务的指针列表),从而提供对执行优先级的另一级控制。
35.ppu 202有利地实现基于处理集群阵列230的高度并行处理架构,该处理集群阵列230包括一组c个通用处理集群(gpc)208,其中c≥1。每个gpc 208能够同时执行大量(例如数百或数千)线程,其中每个线程都是程序的一个实例。在各种应用中,可以分配不同的gpc 208来处理不同类型的程序或执行不同类型的计算。gpc 208的分配可以根据每种类型的程序或计算产生的工作负载而变化。
36.存储器接口214包括一组d个分区单元215,其中d≥1。每个分区单元215耦合到驻留在ppm存储器204内的一个或更多个动态随机存取存储器(dram)220。在一个实施例中,分区单元215的数量等于dram 220的数量,并且每个分区单元215耦合到不同的dram 220。在其他实施例中,分区单元215的数量可以不同于dram 220的数量。本领域的普通技术人员将理解,dram 220可以用任何其他技术上合适的存储设备代替。在操作中,诸如纹理图和帧缓冲区的各种渲染目标可以跨dram 220存储,从而允许分区单元215并行写入每个渲染目标的部分,以有效地使用pp存储器204的可用带宽。
37.给定的gpc 208可以处理要写入到pp存储器204内的任何dram 220的数据。交叉开关单元210被配置为将每个gpc 208的输出路由到任何分区单元215的输入,或路由到任何其他gpc 208以进行进一步处理。gpc 208经由交叉开关单元210与存储器接口214通信,以从各种dram 220读取或写入数据。在一个实施例中,交叉开关单元210具有到i/o单元205的连接,还有经由存储器接口214到pp存储器204的连接,从而使得不同gpc 208内的处理核能够与系统存储器104或非ppu 202本地的其他存储器通信。在图2的实施例中,交叉开关单元210与i/o单元205直接连接。在各种实施例中,交叉开关单元210可以使用虚拟信道来分离gpc 208和分区单元215之间的业务流。
38.同样,gpc 208可以被编程为执行与多种应用相关的处理任务,包括但不限于线性和非线性数据变换、视频和/或音频数据的过滤、建模操作(例如,应用物理定律来确定物体的位置、速度和其他属性)、图像渲染操作(例如,曲面细分着色器、顶点着色器、几何着色器和/或像素/片段着色器程序)、通用计算操作等。在操作中,ppu 202被配置为将数据从系统
存储器104和/或pp存储器204传输到一个或更多个片上存储器单元,处理数据,并将结果数据写回系统存储器104和/或pp存储器204。结果数据随后可由其他系统组件访问,所述其他系统组件包括cpu 102、并行处理子系统112内的另一个ppu 202或计算机系统100内的另一个并行处理子系统112。
39.如上所述,并行处理子系统112中可以包括任意数量的ppu 202。例如,可以在单个插件卡上提供多个ppu 202,或者多个插件卡可以连接到通信路径113,或者一个或更多个ppu 202可以集成到桥接芯片中。多ppu系统中的ppu 202可以彼此相同或不同。例如,不同的ppu 202可以具有不同数量的处理核和/或不同数量的pp存储器204。在存在多个ppu 202的实施方式中,这些ppu可以并行操作,以比单个ppu 202可能更高的吞吐量来处理数据。包含一个或更多个ppu 202的系统可以以各种配置和形式因素来实现,包括但不限于台式机、笔记本电脑、手持个人计算机或其他手持设备、服务器、工作站、游戏控制台、嵌入式系统等。
40.图3是根据各种实施例的在图2的并行处理单元(ppu)202中包括的通用处理集群(gpc)208的框图。在操作中,gpc 208可以被配置为并行执行大量线程,以执行图形、通用处理和/或计算操作。如本文所用,“线程”是指在特定的一组输入数据上执行的特定程序的实例。在一些实施例中,单指令多数据(simd)指令发布技术用于支持大量线程的并行执行而无需提供多个独立的指令单元。在其他实施例中,使用单指令多线程(simt)技术来支持并行执行大量一般同步的线程,这使用了公共指令单元,该公共指令单元配置成向gpc 208内的一组处理引擎发出指令。与所有处理引擎通常执行相同指令的simd执行机制不同,simt执行允许不同的线程更容易地遵循通过给定程序的不同的执行路径。本领域普通技术人员将理解,simd处理机制表示simt处理机制的功能子集。
41.gpc 208的操作经由管线管理器305进行控制,管线管理器305将从任务/工作单元207内的工作分配单元(未示出)接收的处理任务分配给一个或更多个流式多处理器(sm)310。管线管理器305还可以被配置为通过指定由sm 310输出的处理数据的目的地来控制工作分配交叉开关330。
42.在一个实施例中,gpc 208包括一组m个sm 310,其中m≥1。此外,每个sm 310包括一组功能执行单元(未示出),诸如执行单元和加载存储单元。特定于任何功能执行单元的处理操作可以是流水线化的,这使得能够在前一条指令完成执行之前发出新指令以供执行。可以提供给定sm 310内的功能执行单元的任何组合。在各种实施例中,功能执行单元可以被配置为支持各种不同的运算,包括整数和浮点运算(例如,加法和乘法)、比较运算、布尔运算(和、或、异或)、位移位和各种代数函数的计算(例如,平面插值和三角函数、指数函数和对数函数等)。有利的是,相同的功能执行单元可以被配置为执行不同的运算。
43.在操作中,每个sm 310被配置为处理一个或更多个线程组。如本文所使用的,“线程组”或“线程束”是指在不同输入数据上同时执行同一程序的一组线程,组中的一个线程被分配给sm 310内的不同执行单元。线程组可以包括比sm 310内的执行单元的数量更少的线程,在这种情况下,一些执行可能在正在处理该线程组的周期期间空闲。线程组还可以包括比sm 310内的执行单元的数量更多的线程,在这种情况下,处理可以在连续的时钟周期内进行。由于每个sm 310可以同时支持多达g个线程组,因此可以在任何给定时间在gpc 208中执行多达g*m个线程组。
44.此外,多个相关线程组可以在sm 310内同时处于活动状态(在不同的执行阶段)。该线程组的集合在本文中被称为“协作线程阵列”(“cta”)或“线程阵列”。特定cta的大小等于m*k,其中k是线程组中同时执行的线程的数量,其通常是sm 310内的执行单元的数量的整数倍,m是sm 310内同时处于活动状态的线程组数。
45.尽管图3中未示出,但每个sm 310都包含一级(l1)高速缓存或使用sm 310外部的对应l1高速缓存中的空间,以支持由执行单元执行的加载和存储操作等。每个sm 310还可以访问二级(l2)高速缓存(未显示),所述二级(l2)高速缓存在ppu 202中的所有gpc 208之间共享。l2高速缓存可以用于在线程之间传输数据。最后,sm 310还可以访问片外“全局”存储器,其可以包括pp存储器204和/或系统存储器104。应当理解,ppu 202外部的任何存储器均可用作全局存储器。此外,如图3所示,1.5级(l1.5)高速缓存335可以被包括在gpc 208内,并且被配置为接收和保存由sm 310经由存储器接口214从存储器请求的数据。这样的数据可以包括,但不限于指令、统一数据和常量数据。在gpc 208内具有多个sm 310的实施例中,sm 310可以有益地共享缓存在l1.5高速缓存335中的公共指令和数据。
46.每个gpc 208可以具有相关联的存储器管理单元(mmu)320,其被配置为将虚拟地址映射到物理地址。在各种实施例中,mmu 320可驻留在gpc 208内或存储器接口214内。mmu 320包括一组页表条目(pte),该页表条目用于将虚拟地址映射到块或存储器页的物理地址,并且可选地高速缓存行索引。mmu 320可包括地址转换后备缓冲区(tlb)或高速缓存,其可驻留在sm 310内、一个或更多个l1高速缓存内或gpc 208内。
47.在图形和计算应用程序中,gpc 208可以被配置为使得每个sm 310耦合到纹理单元315,以用于执行纹理映射操作,诸如确定纹理样本位置、读取纹理数据和过滤纹理数据。
48.在操作中,每个sm 310向工作分配交叉开关330发送已处理任务,以便将已处理的任务提供给另一gpc 208以供进一步处理,或将已处理的任务存储在l2高速缓存(未示出)、并行处理存储器204中或经由交叉开关单元210的系统存储器104中。此外,预光栅操作(prerop)单元325被配置为从sm 310接收数据、将数据定向到分区单元215内的一个或更多个光栅操作(rop)单元、执行颜色混合优化、组织像素颜色数据以及执行地址转换。
49.应当理解,本文描述的核心架构是说明性的,并且可以进行变更和修改。除其他事项外,任何数量的处理单元(诸如sm 310、纹理单元315或prerop单元325)可被包括在gpc 208内。此外,如上文结合图2所述,ppu 202可包括任意数量的gpc 208,这些gpc 208被配置为在功能上彼此相似,以便执行行为不依赖于哪个gpc 208接收特定处理任务。此外,每个gpc 208独立于ppu 202中的其他gpc 208操作,以执行一个或更多个应用程序的任务。鉴于以上所述,本领域普通技术人员将理解,图1-3中描述的架构并不以任何方式限制本公开的各种实施例的范围。
50.请注意,如本文所用,对共享存储器的引用可包括任何一个或更多个技术上可行的存储器,包括但不限于由一个或更多个sm 310共享的本地存储器,或可通过存储器接口214访问的存储器,诸如高速缓存存储器、并行处理存储器204或系统存储器104。还请注意,如本文所使用的,对高速缓存存储器的引用可包括任何一个或更多个技术上可行的存储器,包括但不限于l1高速缓存、l1.5高速缓存和l2高速缓存。
51.在不同地址同步线程子集
52.如本文所述,所公开的技术允许线程束中的不同线程在不同地址处同步。一种用
于同步发散线程的传统技术在下表1所示的伪代码部分示出:
[0053][0053][0054]
表1.用于线程束同步的传统方法
[0055]
如图所示,伪代码包括if-then-else条件语句,其中线程采用不同的路径。具体而言,偶数编号的线程(本文称为偶数线程)采用第一路径,如第1010-1070行中所示,而奇数编号的线程(本文称为奇数线程)采用第二路径,如第1080-1140行中所示。偶数线程执行特定于偶数线程的程序指令(第1020行),然后到达一个点,在该点,线程束中的所有线程都需要执行同步操作以交换数据(第1030行)。类似地,奇数线程执行特定于奇数线程的程序指令(第1090行),然后到达一个点,在该点,线程束中的所有线程都需要执行同步操作以交换数据(第1110行)。一种这样的同步操作包括线程束混洗(shfl)指令。该线程束混洗指令通过允许每个线程读取属于线程束中的一个或更多个其他线程的寄存器,从而允许线程彼此交换数据。另一种这样的同步操作包括投票(vote)指令。投票指令允许线程束中的线程比较在线程束中的多个线程之间的条件,并将比较结果广播给线程束中的其他线程。在线程束中的所有线程都被限制在单个地址处同步的系统中,程序员不能包括两条同步指令,因为这两条同步指令将在不同的路径中,因此将在存储器中具有不同的地址。因此,程序员将
无法通过在第一路径中包括一条同步指令和在第二路径中包括另一条同步指令来同步两条路径中的线程。
[0056]
因此,第一路径中的线程和第二路径中的线程调用公共同步大纲函数,如第1150-1190行所示。第一路径中的偶数线程执行有效加载程序计数器(lepc)指令(第1040行),以保存偶数线程的返回地址。当偶数线程从同步大纲函数返回时,该返回地址标识偶数线程要执行的第一条指令。第一路径中的偶数线程执行对同步大纲函数的调用(第1050行)。类似地,第二路径中的奇数线程执行有效加载程序计数器(lepc)指令(第1110行),以保存奇数线程的返回地址。当奇数线程从同步大纲函数返回时,该返回地址标识奇数线程要执行的第一条指令。第二路径中的奇数线程执行对同步大纲函数的调用(第1120行)。
[0057]
当线程束中的每个线程开始执行同步大纲函数(第1150行)时,该线程执行线程束同步(warpsync)指令(第1160行)。warpsync指令指定了一个掩码,该掩码标识线程束中的参与同步操作的线程。该掩码包括线程束中的每个线程的位。例如,如果一个线程束包括32个线程,那么该掩码包括32位,每个线程一位。掩码中在特定位位置的值为1指示相应线程正在参与同步操作。掩码中在特定位位置的值为0指示相应线程未参与同步操作。如图所示,第1160行的warpsync指令的掩码为0xffffffff,指示该线程束中的所有32个线程都在参与同步操作。当每个线程执行warpsync指令时,线程会阻塞并等待所有其他参与线程到达并执行warpsync指令。
[0058]
当最后参与线程到达同步的点并执行同步指令时,同步指令解析。参与线程解除阻塞,并且至少一个参与线程执行同步操作(第1170行)。同步操作可以包括交叉线程指令,诸如shfl指令或vote指令。附加地或可替代地,同步操作可以包括某些其他指令。每个线程返回到由lepc指令保存的相应返回地址。偶数线程执行返回(ret)指令(第1180行)以返回到第一路径中的地址,并继续执行特定于偶数线程的程序指令(第1060行)。类似地,奇数线程执行返回(ret)指令(第1180行)以返回到第二路径中的地址,并继续执行特定于奇数线程的程序指令(第1130行)。
[0059]
此外,使用表1中所示的方法,某些编译器优化不可用。具体而言,编译器无法为同步操作实现循环展开或内联函数,诸如表1中所示的同步大纲函数。
[0060]
通过循环展开,编译器将迭代执行的程序代码的循环分解为只执行一次的单个程序代码集。单个程序代码集包括用于程序循环每次迭代的一个程序代码实例。例如,如果编译器检测到程序代码循环,其中该程序代码循环执行了五次,则编译器将循环的程序代码的五个实例作为单个程序代码集插入,根据需要修改每个实例以便正确地执行程序代码。虽然插入循环代码的多个实例比原始程序循环占用更多的存储器空间,但是编译器不需要包括管理程序循环的迭代次数的代码。因此,展开循环通常比程序循环产生更好的性能。然而,如果程序代码循环包括同步指令,则编译器在存储器中插入同步指令的多个实例,诸如五个实例。同步指令的每个实例都位于存储器中的不同位置。因此,编译器无法保证所有参与线程在同步操作后都返回同一个返回地址。
[0061]
对于内联函数,编译器检测函数(诸如同步大纲函数),该编译器将函数中包含的指令插入到具有执行函数调用的程序代码的行中。例如,编译器将在第1050行的调用指令和第1120行的调用指令处插入第1150-1190行的同步大纲函数中包括的指令的多个实例。虽然插入函数的多个实例比原始程序循环占用更多存储器空间,但编译器不需要将调用函
数的调用指令与程序代码一起包括以便在函数执行后返回到调用程序代码。因此,内联函数通常比单独的函数产生更好的性能。然而,如果函数包括同步指令,则编译器在存储器中插入同步指令的多个实例,诸如两个实例。同步指令的每个实例都位于存储器中的不同位置。因此,编译器无法保证所有参与线程在同步操作后都返回到同一个返回地址。
[0062]
因此,当编译器检测到包括同步指令的函数时,诸如表1的同步大纲函数,编译器通常无法先验地确定是否可以采用循环展开和/或内联函数,同时仍然将所有参与线程返回到相同的返回地址。因此,当编译器检测到包括同步指令的函数时,编译器将禁用该函数的循环展开和内联函数。因此,编译器无法在同步操作期间通过循环展开和内联函数来提高性能。
[0063]
表1中所示的这种传统方法以保存每个线程的返回地址、调用单独的函数、从该函数返回以及恢复先前保存的返回地址的形式消耗处理和存储器开销。
[0064]
所公开的技术允许线程束中的不同线程在不同地址处同步,从而相对于其他方法减少和/或免除处理和存储器开销。此外,通过允许不同的线程在不同的地址进行同步,编译器能够在同步操作期间利用循环展开和内联函数带来的性能增益。如下面表2中的伪代码部分示出了一种在不同地址同步不同线程的这样的技术:
[0065]
[0066][0067]
表2.在不同地址处的线程束同步
[0068]
表2中所示的方法采用具有基于寄存器的活动掩码(诸如rb)和立即偏移量(诸如#0x30)的warpsync.collective指令。这种方法与表1中所示的常见返回地址方法形成对比。如表2中所示,该伪代码包括一个if-then-else条件语句,其中线程采用不同的路径。具体而言,偶数线程采用第一路径,如第2010-2090行中所示,而奇数线程采用第二路径,如第2100-2180行中所示。偶数线程和奇数线程可以以任意顺序执行各自的路径。偶数线程执行特定于偶数线程的程序指令(第2020行),然后到达一个点,在该点,线程束中的所有线程都需要执行同步操作,这里也称为集合操作以便交换数据(第2030行)。类似地,奇数线程执行特定于奇数线程的程序指令(第2110行),然后到达一个点,在该点,线程束中的所有线程都需要执行同步操作以交换数据(第2120行)。
[0069]
偶数线程执行与第2040行相对应的在存储器中第一地址处的线程束同步集合(warpsync.collective)指令。类似地,奇数线程执行与第2130行相对应的在存储器中的第二地址处的线程束同步集合(warpsync.collective)指令。该warpsync.collective指令包括一个操作数,该操作数指定一个寄存器,该寄存器存储标识线程束中参与同步操作的线程的掩码的值。如图所示,warpsync.collective指令指定寄存器rb。如果寄存器rb=0xffffffff,则所有32个线程都参与同步操作。如果寄存器rb=0x0000ffff,则最低的16个线程将参与同步操作。如果寄存器rb=0xffff0000,则最上面的16个线程将参与同步操作,以此类推。warpsync.collective指令还包括一个操作数,该操作数指定要加到某些参与线程的返回地址的立即偏移量,以生成调整后的地址,如本文进一步讨论的。如图所示,warpsync.collective指令指定立即偏移量为#0x30。
[0070]
当每个偶数线程执行在第2040行的warpsync.collective指令时,偶数线程阻塞并进入blocked_collective状态。该偶数线程在与第2040行的warpsync.collective指令相关联的程序计数器对应的返回地址处阻塞。处理器将由寄存器rb的值指定的同步掩码与处于blocked_collective状态的所有线程进行比较。如果至少有一个参与线程不是blocked_collective状态,则偶数线程等待,直到由同步掩码指定的所有线程都已转换为blocked_collective状态。当每个奇数线程执行在第2130行的warpsync.collective指令
时,奇数线程阻塞并进入blocked_collective状态。奇数线程在与第2130行的warpsync.collective指令相关联的程序计数器对应的返回地址处阻塞。处理器将同步掩码与处于blocked_collective状态的所有线程进行比较。如果至少有一个参与线程不是blocked_collective状态,则奇数线程等待,直到由同步掩码指定的所有线程都已转换为blocked_collective状态。
[0071]
当最后的参与线程已转换为blocked_collective状态时,warpsync.collective指令解析。至少一个线程(诸如最后的参与线程)执行在warpsync.collective指令和第2160行的endcollective指令(这里称为结束指令)之间的指令。warpsync.collective指令和endcollective指令之间的这些指令在本文中被称为“集合块(collective block)”指令。通常,集合块指令执行一次(如果有的话)。更具体地说,最后线程解析同步指令,并且后续指令由同步掩码指定的所有参与线程以线程束同步方式执行。由于允许指令谓词,因此有可能只有同步掩码中指定的一个线程子集执行线程束同步操作。执行集合块指令时,将活动掩码设置为寄存器rb的值,诸如0xffffffff,这是warpsync.collective指令标识的掩码。
[0072]
偶数线程和奇数线程执行集合块指令,直到endcollective指令。endcollective指令的执行将集合掩码设置为0x0,指示warpsync.collective指令已解析,并且集合块指令已执行。在执行endcollective指令之后,活动掩码将更改回执行同步指令的最后线程集,诸如偶数线程或奇数线程,视情况而定。一旦集合块中的指令已执行,被选中的线程就会使用warpsync.collective指令中的偏移量来生成调整后的地址,以便跳转到集合块的末尾。以这种方式,集合块中的指令不会被多次执行。当warpsync.collective指令解析时,这些选中的线程将提升到ready_at_next状态,以便识别需要跳过集合块中的指令的线程。
[0073]
如果偶数线程解析同步指令,则偶数线程执行在第2050行和第2060行的集合块指令,直到第2070行的endcollective指令。奇数线程被瞬移以执行在第2050行和第2060行的相同集合块指令,直到第2070行的endcollective指令。以这种方式,由同步掩码表示的所有线程执行在相同的程序计数器处的相同指令,并执行相同的endcollective指令。endcollective指令的执行将集合掩码设置为0x0,指示warpsync.collective指令已解析,并且集合块指令已执行。在执行endcollective指令之后,活动掩码将更改回偶数线程。偶数线程执行在第2080行的集合块指令之后的偶数线程指令。奇数线程瞬移回并执行在第2170行的集合块指令之后的奇数线程指令。
[0074]
如果奇数线程解析同步指令,则奇数线程执行第2140行和第2150行的集合块指令,直到第2160行的endcollective指令。偶数线程瞬移以执行第2140行和第2150行的相同集合块指令,直到第2160行的endcollective指令。以这种方式,由同步掩码表示的所有线程执行在相同的程序计数器处的相同指令,并执行相同的endcollective指令。endcollective指令的执行将集合掩码设置为0x0,指示warpsync.collective指令已解析,并且集合块指令已执行。在执行endcollective指令之后,活动掩码被更改回奇数线程。奇数线程执行在第2170行的集合块指令之后的奇数线程指令。偶数线程瞬移回并执行在第2080行的集合块指令之后的奇数线程指令。
[0075]
第2050和2060行的偶数线程的集合块指令与第2140和2150行的奇数线程的集合块指令相同。此外,第2050和2060行的偶数线程的集合块指令访问与第2140和2150行的奇
数线程的集合块指令相同的固定寄存器。结果,无论线程是执行在第2050和2060行的集合块指令,还是执行在第2140和2150行的集合块指令,同步操作都会正确执行。此外,当一个或更多个线程瞬移到集合块指令的不同实例时,同步操作会正确执行。在这方面,偶数线程可以在第2040行的偶数线程的warpsync.collective指令处阻塞,瞬移以执行在第2140和2150行的奇数线程的集合块指令,并且瞬移回到偶数线程的正确指令。类似地,奇数线程可以在第2130行的奇数线程的warpsync.collective指令处阻塞,瞬移以执行在第2050和2060行的偶数线程的集合块指令,并瞬移回到奇数线程的正确指令。
[0076]
集合块指令包括shfl指令(第2050行和第2140行)。附加地或替代地,集合块指令可以包括其他同步操作,诸如vote指令等。此外,集合块指令包括整数加法(iadd)指令(第2060和2150行)。附加地或替代地,集合块指令可以包括其他某些其他指令,诸如其他算术指令、断点/陷阱(bpt)指令、分支到相对地址(bra)指令、跳转到绝对地址(jmp)指令和/或类似指令。
[0077]
当warpsync.collective指令解析时,在warpsync.collective指令处被阻塞的线程从blocked_collective状态转换为ready_at_next状态。从blocked_collective状态到ready_at_next状态的这种转换不包括解析warpsync.collective指令的最后一组线程。处于ready_at_next状态的线程不会重新执行集合块指令。相反,处于ready_at_next状态的线程通过在重新选配时调整返回地址来跳过集合块指令。更具体地说,线程返回到warpsync.collective指令。线程将返回地址与离warpsync.collective指令的立即偏移量相加,以生成调整后的返回地址,或者更简单地说,以生成调整后的地址。偶数线程将指向第2040行的返回地址与第2040行中的#0x30立即偏移量相加,使得调整后的返回地址标识由偶数线程执行的进一步指令(第2080行)。类似地,奇数线程将指向第2130行的返回地址与第2130行中的#0x30立即偏移量相加,使得调整后的返回地址标识由奇数线程执行的进一步指令(第2170行)。
[0078]
因为线程束中的线程可以返回到不同的地址,所以编译器可以为包括同步指令的循环和内联函数实现循环展开和/或内联函数。编译器可以将包括同步指令的程序代码循环分解为执行一次的单组程序代码。单组程序代码包括多个程序代码实例,其中每个实例表示程序循环的不同迭代。附加地或替代地,编译器可以插入包括同步指令的函数的多个实例,使得函数中的指令与调用该函数的程序代码一致。调用该函数的每条指令被替换为该函数中的指令的一个实例。
[0079]
应当理解,本文所示的系统是说明性的,并且可以进行变更和修改。表2所示的方法包括两条路径,该两条路径对应于参与线程的两个子集,即偶数线程和奇数线程。更一般地,可以基于各个线程子集的对应活动掩码,以任何方式划分参与线程。此外,参与线程可以被划分为任意数量的子集,诸如两个子集、三个子集、四个子集等。
[0080]
在一些实施例中,某些线程可以执行warpsync.collective.all指令。如本文所述,执行warpsync.collective指令的线程基于存储在由warpsync.collective指令指定的寄存器中的掩码来识别参与线程。该线程转换到blocked_collective状态,并等待掩码指定的所有其他线程。相比之下,warpsync.collective.all指令不指定存储掩码的寄存器。相反,warpsync.collective.all指令意味着默认情况下整个线程束都被包括在掩码中。线程转换到blocked_all状态,并等待整个线程束中的所有其他线程到达同步指令并阻塞。与
warpsync.collective指令类似,warpsync.collective.all指令包括一个立即偏移量,该偏移量指定要加到某些参与线程的返回地址上的值。
[0081]
图4是根据各种实施例的在不同地址处同步的线程的执行流程400。如图所示,执行流程400开始于具有活动掩码0xfff的块402,指示该线程束的线程0-11正在执行。执行流程400分成在块404、406和408处的三个线程子集。块404处的线程子集具有活动掩码0x00f,指示线程束的线程0-3作为第一线程子集正在执行。块406处的线程子集具有活动掩码0xf00,指示线程束的线程8-11作为第二线程子集正在执行。块408处的线程子集具有活动掩码0x0f0,指示线程束的线程4-7作为第三线程子集正在执行。
[0082]
在执行第一子集和第二子集期间的某个点,第一子集的线程和第二子集的线程执行同步操作。在块410,第一子集的线程和第二子集的线程执行warpsync.collective指令,该指令将寄存器r0指定为存储warpsync.collective指令的活动掩码的寄存器。寄存器r0存储值0xf0f,指示线程0-3和线程8-11正在参与同步操作。在warpsync.collective指令解析后,至少有一个线程执行同步操作。在块412,第一子集的线程0-3继续执行。块412处的线程子集具有活动掩码0x00f,指示线程束的线程0-3作为第一线程子集继续执行。以这种方式,不同子集的线程通过一个或更多个warpsync.collective指令在不同的地址执行同步操作。
[0083]
图5是根据各种实施例的受到同步操作的混叠和过早解析的线程的执行流程500。如图所示,执行流程500开始于具有活动掩码0xffffff的块502,指示线程束的线程0-23正在执行。执行流程500分成在块504、506和508处的三个线程子集。块504处的线程子集具有活动掩码0xff0000,指示线程束的线程16-23作为第一线程子集正在执行。块506处的线程子集具有活动掩码0x00ff00,指示线程束的线程8-15作为第二线程子集正在执行。块508处的线程子集具有活动掩码0x0000ff,指示线程束的线程0-7作为第三线程子集正在执行。
[0084]
第一子集的线程和第二子集的线程执行在块510的同步操作。在执行同步操作期间的某个点,第二子集执行warpsync.collective指令,该指令将集合掩码r0指定为0xffff00,指示线程8-23正在参与同步操作。当第二子集的每个线程执行在块510的warpsync.collective指令时,该线程转换到blocked_collective状态。
[0085]
第二子集的线程和第三子集的线程都执行在块514的同步操作。在执行同步操作期间的某个点,第三子集执行warpsync.collective指令,该指令将集合掩码r1指定为0xffff。
[0086]
如果参与在块510处的warpsync.collective指令的线程已经将值0x00ffff存储在寄存器rl中,则在块514处的warpsync.collective指令可能会错误地确定在块514处的warpsync.collective指令已经解析。结果,块514处的warpsync.collective指令可能过早解析,导致程序执行错误。为了解决warpsync.collective指令的这种潜在的过早解析,推荐的做法是对整个程序中的所有warpsync指令使用相同的寄存器。
[0087]
图6是根据各种实施例的用于防止同步操作的混叠和过早解析的线程的执行流程600。除了下面进一步描述的之外,块502、504、506、508、510和512基本上如结合图5所描述的那样起作用。
[0088]
在执行第二子集和第三子集期间的某个点,第二子集的线程和第三子集的线程执行同步操作。在块614,第二子集的线程和第三子集的线程执行warpsync.collective.all
指令。当第二子集和第三子集的每个线程执行块614的warpsync.collective.all指令时,该线程转换到blocked_all状态。直到所有线程执行warpsync.collective.all指令并转换到blocked_all状态,块614处的warpsync.collective.all指令才解析,而不管任何特定寄存器的内容。以此方式,参与块510的warpsync.collective指令的线程不会导致块614的warpsync.collective.all指令过早解析。
[0089]
图7是根据各种实施例的用于在不同地址处同步线程的方法步骤的流程图。尽管结合图1-6的系统描述了方法步骤,但是本领域普通技术人员将理解,被配置为以任何顺序执行方法步骤的任何系统都在本公开的范围内。
[0090]
如图所示,方法700开始于步骤702,其中处理器(诸如图1-3中的cpu 102、ppu 202、gpc 208或sm 310)确定线程已执行同步指令。同步指令可以是warpsync.collective指令,该指令包括指定寄存器的操作数,该寄存器存储标识线程束中的参与同步操作的线程的掩码的值。在执行warpsync.collective指令后,线程转换到blocked_collective状态。附加地或替代地,同步指令可以是warpsync.collective.all指令,该指令不指定存储掩码的寄存器。相反,使用warpsync.collective.all指令,假定整个线程束中的所有线程转换都参与了。在执行warpsync.collective.all指令后,线程转换到blocked_all状态。warpsync.collective指令和warpsync.collective.all指令还包括一个操作数,该操作数指定要加到某些参与线程的返回地址上的立即偏移量。
[0091]
在步骤704,处理器在同步指令处阻塞当前线程。在warpsync.collective指令的情况下,处理器将线程转换为blocked_collective状态。在warpsync.collective.all指令的情况下,处理器将线程转换为blocked_all状态。在步骤706,处理器确定已在同步指令上阻塞的参与线程集。在warpsync.collective指令的情况下,处理器确定哪些线程(由存储在已标识寄存器中的掩码标识)已转换到blocked_collective状态。在warpsync.collective.all指令的情况下,处理器确定线程束中的哪些线程已转换为blocked_all状态。
[0092]
在步骤708,处理器确定是否所有参与线程都已被阻塞。如果一个或更多个参与线程未被阻塞,则处理器进行到上述步骤702,以处理未被阻塞的另外的参与线程。如果所有参与线程都已阻塞,则方法700进行到步骤710,其中处理器解除所有参与线程的阻塞。解析warpsync.collective指令的最后参与线程执行集合块指令。处理器将剩余的参与线程转换为ready_at_next状态。在步骤712,处理器经由解析warpsync.collective指令的线程执行集合块指令。集合块指令包括同步操作,诸如shfl指令、vote指令等。集合块指令还可以包括某些其他指令,诸如算术指令、断点/陷阱指令、分支到相对地址指令、跳转到绝对地址指令等。
[0093]
在步骤714,处理器向处于ready_at_next状态的所有参与线程的返回地址增加一偏移量。该偏移量由同步指令指定,诸如步骤702的warpsync.collective指令或warpsync.collective.all指令。在步骤716,处理器将瞬移的参与线程返回到相应的返回地址,如在步骤714所调整的。参与线程的返回地址可能彼此不同。以这种方式,参与线程可以在不同的地址进行同步。然后方法700终止。
[0094]
总之,各种实施例包括并行处理计算架构,该架构包括被配置为在不同地址同步线程的处理引擎。给定线程束中的线程至少被划分为第一线程子集和第二线程子集。第一
子集中的线程执行第一指令集,而第二子集中的线程执行第二指令集。在同步点,第一子集中的线程执行在存储器中的第一地址处的第一同步指令。第一同步指令包括标识参与同步操作的线程的第一掩码。类似地,在同步点,第二子集中的线程执行在存储器中的第二地址处的第二同步指令。第二同步指令包括标识参与同步操作的线程的第二掩码。
[0095]
当两个线程子集中的每个线程执行各自的同步指令时,线程阻塞并等待其余线程到达同步点。当最后参与线程到达同步点并执行同步指令时,同步指令解析,第一子集中和第二子集中的线程解除阻塞,并且后续指令以线程束同步方式执行。至少有一个线程执行同步操作。第一子集中的每个线程返回到第一指令集,以在第一条同步指令之后的指令处或者可选地在由立即偏移量指定的后续指令处继续执行。类似地,第二子集中的每个线程返回到第一指令集,以在第二条同步指令之后的指令处或者可选地在由立即偏移量指定的后续指令处继续执行。以此方式,第一子集中的线程在与第二子集中的线程不同的存储器中的地址处同步。
[0096]
本公开的技术相对于现有技术的至少一个技术优势在于,利用所公开的技术,线程束中的不同线程子集通过位于存储器中不同地址的同步指令的多个副本进行同步。因此,线程束中的线程在执行不同的指令集时能够彼此同步,而无需同步大纲函数或类似机制。结果,与现有方法相比,线程同步效率更高,开销更少且处理器性能也得到改善。这些优点代表了相对于现有技术方法的一项或更多项技术改进。
[0097]
任何权利要求中记载的任何权利要求要素和/或本技术中描述的任何要素的任何和所有组合,以任何方式都落于本公开和保护的预期范围内。
[0098]
为了说明的目的,已经给出了各种实施例的描述,但并不旨在穷举或限于所公开的实施例。在不脱离所描述实施例的范围和精神的情况下,许多修改和变化对于本领域普通技术人员来说将是显而易见的。
[0099]
本实施例的各个方面可以实现为系统、方法或计算机程序产品。因此,本公开的方面可以采用完全硬件实施例、完全软件实施例(包括固件、驻留软件、微代码等)或结合软件和硬件方面的实施例的形式,这些方面在本文中通常被称为“模块”或“系统”。此外,本公开的方面可以采用包含在一个或更多个计算机可读介质中的计算机程序产品的形式,该计算机可读介质具有包含在其上的计算机可读程序代码。
[0100]
可以利用一种或更多种计算机可读介质的任何组合。计算机可读介质可以是计算机可读信号介质或计算机可读存储介质。计算机可读存储介质可以是,例如,但不限于,电子、磁性、光学、电磁、红外或半导体系统、装置或设备,或上述的任何适当组合。计算机可读存储介质的更具体示例(非详尽列表)将包括以下内容:具有一根或更多根电线的电气连接、便携式计算机软盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦除可编程只读存储器(eprom或闪存)、光纤、便携式光盘只读存储器(cd-rom)、光存储设备、磁存储设备或上述任何适当组合。在本文档的上下文中,计算机可读存储介质可以是任何有形介质,其可以包含或存储供指令执行系统、装置或设备使用或与之相关联的程序。
[0101]
上文参考根据本公开的实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了本公开的各个方面。应当理解,流程图和/或框图的每个块,以及流程图和/或框图中的块的组合,可以通过计算机程序指令来实现。这些计算机程序指令可以提供给通用计算机、专用计算机或其他可编程数据处理设备的处理器以生产机器,使得通过计
算机或其他可编程数据处理设备的处理器执行的指令,启用流程图和/或框图块或块中指定的功能/动作的实现。此类处理器可以是但不限于通用处理器、专用处理器、专用处理器或现场可编程处理器。
[0102]
图中的流程图和框图示出了根据本公开的各种实施例的系统、方法和计算机程序产品的可能实现的架构、功能和操作。就这一点而言,流程图或框图中的每个块可表示模块、段或代码的一部分,其包括用于实现指定逻辑功能的一个或更多个可执行指令。还应当注意的是,在一些替代实施方式中,在块中标注的功能可以不按照图中标注的顺序出现。例如,根据所涉及的功能,连续示出的两个块实际上可以基本上同时执行,或者有时可以以相反的顺序执行这些块。还将注意到,框图和/或流程图示出的每个块,以及框图和/或流程图示出的块组合,可以由执行指定功能或动作的基于专用硬件的系统或者专用硬件和计算机指令的组合来实现。
[0103]
虽然前述内容针对本公开的实施例,但是在不脱离其基本范围的情况下,可以设计本公开的其他和进一步的实施例,并且其范围由随后的权利要求确定。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1