CN104050033A - 用于有索引的屏障的硬件调度的系统和方法 - Google Patents
用于有索引的屏障的硬件调度的系统和方法 Download PDFInfo
- Publication number
- CN104050033A CN104050033A CN201310745810.5A CN201310745810A CN104050033A CN 104050033 A CN104050033 A CN 104050033A CN 201310745810 A CN201310745810 A CN 201310745810A CN 104050033 A CN104050033 A CN 104050033A
- Authority
- CN
- China
- Prior art keywords
- thread
- barrier
- instruction
- execution
- threads
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 230000004888 barrier function Effects 0.000 title claims abstract description 461
- 238000000034 method Methods 0.000 title claims abstract description 70
- 230000008569 process Effects 0.000 claims abstract description 23
- 238000012545 processing Methods 0.000 claims description 98
- 238000003860 storage Methods 0.000 claims description 58
- 230000015572 biosynthetic process Effects 0.000 claims description 15
- 230000003068 static effect Effects 0.000 description 21
- 238000010586 diagram Methods 0.000 description 19
- 238000004891 communication Methods 0.000 description 16
- 230000005059 dormancy Effects 0.000 description 10
- 230000006870 function Effects 0.000 description 10
- 230000001360 synchronised effect Effects 0.000 description 10
- 238000007726 management method Methods 0.000 description 9
- 238000013316 zoning Methods 0.000 description 9
- 238000009826 distribution Methods 0.000 description 7
- 238000005516 engineering process Methods 0.000 description 7
- 238000013507 mapping Methods 0.000 description 6
- 230000007246 mechanism Effects 0.000 description 6
- 230000008859 change Effects 0.000 description 5
- 230000000295 complement effect Effects 0.000 description 4
- 230000005540 biological transmission Effects 0.000 description 3
- 238000013519 translation Methods 0.000 description 3
- 230000006399 behavior Effects 0.000 description 2
- 230000000977 initiatory effect Effects 0.000 description 2
- 230000004807 localization Effects 0.000 description 2
- 230000014759 maintenance of location Effects 0.000 description 2
- 230000002093 peripheral effect Effects 0.000 description 2
- 238000009877 rendering Methods 0.000 description 2
- 238000012884 algebraic function Methods 0.000 description 1
- 238000003491 array Methods 0.000 description 1
- 230000003139 buffering effect Effects 0.000 description 1
- 238000005266 casting Methods 0.000 description 1
- 238000006243 chemical reaction Methods 0.000 description 1
- 239000003086 colorant Substances 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000007599 discharging Methods 0.000 description 1
- 239000006185 dispersion Substances 0.000 description 1
- 238000006073 displacement reaction Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000001914 filtration Methods 0.000 description 1
- 230000008676 import Effects 0.000 description 1
- 239000004973 liquid crystal related substance Substances 0.000 description 1
- 238000012423 maintenance Methods 0.000 description 1
- 239000000203 mixture Substances 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 238000012797 qualification Methods 0.000 description 1
- 230000001846 repelling effect Effects 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 230000007958 sleep Effects 0.000 description 1
- 239000000725 suspension Substances 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
- 210000003462 vein Anatomy 0.000 description 1
- 230000002618 waking effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/30076—Arrangements for executing specific machine instructions to perform miscellaneous control operations, e.g. NOP
- G06F9/30087—Synchronisation or serialisation instructions
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3824—Operand accessing
- G06F9/3834—Maintaining memory consistency
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3836—Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
- G06F9/3851—Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution from multiple instruction streams, e.g. multistreaming
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3885—Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units
- G06F9/3888—Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple threads [SIMT] in parallel
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
- G06F9/522—Barrier synchronisation
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Multimedia (AREA)
- Advance Control (AREA)
- Image Processing (AREA)
- Multi Processors (AREA)
Abstract
提供用于有索引的屏障指令的硬件调度的方法和系统。发起多个线程的执行以处理包括屏障指令的程序的指令,并且当每个线程到达屏障指令时,线程暂停指令的执行。多个线程中的线程的第一子组与第一子屏障索引相关联并且多个线程中的线程的第二子组与第二子屏障索引相关联。当屏障指令能够被调度用于执行时,第一子组中的线程被串行地执行,第二子组中的线程被串行地执行,并且第一子组中的至少一个线程与第二子组中的至少一个线程被并行地执行。
Description
技术领域
本发明涉及程序执行,并且更具体地,涉及屏障(barrier)。
背景技术
常规的并行处理架构支持多个线程的执行。在程序的执行期间使用常规的并行处理架构实施的特定操作可能要求多个线程的同步。屏障指令(或栅栏(fence)指令)用来在这类程序的执行期间使多个线程的执行同步。并行处理架构内的调度单元识别屏障指令并且确保所有线程在任何线程执行该特定屏障指令以后的指令之前抵达该特定屏障指令。执行线程的多线程处理单元配置为使特定屏障指令处的线程同步。多线程处理单元可以配置为并行地或串行地执行经同步的线程。在一些情况下,所有经同步的线程可以不被并行执行,诸如当屏障用来描绘有序的关键代码段时。然而,线程的串行执行降低性能。
因此,存在对于解决处理屏障指令的问题和/或与现有技术相关联的其他问题的需求。
发明内容
提供用于调度有索引的屏障指令的执行的系统和方法。发起多个线程的执行以处理包括屏障指令的程序的指令,并且当每个线程到达屏障指令时,线程暂停指令的执行。多个线程中的线程的第一子组与第一子屏障索引相关联并且多个线程中的线程的第二子组与第二子屏障索引相关联。当屏障指令能够被调度用于执行时,第一子组中的线程被串行地执行,第二子组中的线程被串行地执行,并且第一子组中的至少一个线程与第二子组中的至少一个线程被并行地执行。
附图说明
图1是示出了配置为实现本公开的一个或多个方面的计算机系统的框图;
图2是根据本公开的一个实施例的、用于图1的计算机系统的并行处理子系统的框图;
图3A是根据本公开的一个实施例的、图2的前端的框图;
图3B是根据本公开的一个实施例的、图2的并行处理单元之一内的通用处理集群的框图;
图3C是根据本公开的一个实施例的、图3B的流多处理器的一部分的框图;以及
图4是根据本公开的一个示范性实施例的、示出了CTA的线程块的示意图;
图5A是根据本公开的一个示范性实施例的、图3C的线程束(warp)调度器和指令单元的框图;
图5B是根据本公开的一个示范性实施例的、将子屏障索引映射到由多个图形图元相交的像素网格的示意图;
图5C是根据本公开的一个示范性实施例的、图5A的调度单元和屏障调度单元的一部分的框图;
图5D示出了根据本公开的一个示范性实施例的、用于调度有索引的屏障指令用于执行的方法;
图6A示出了根据本公开的一个示范性实施例的、用于调度有索引的屏障指令用于执行的方法;
图6B示出了根据本公开的一个示范性实施例的、用于实施图6A所示的步骤的方法;以及
图6C示出了根据本公开的一个示范性实施例的、用于实施图6B所示的步骤的方法。
具体实施方式
提供用于调度使得线程子组能够参与屏障指令的有条件的屏障的执行的系统和方法。发起线程的执行以处理包括屏障指令的程序的指令,并且当每个线程到达屏障指令时,确定线程是否参与屏障指令。执行参与屏障指令的线程以处理跟随在屏障指令之后的程序的一个或多个指令。不参与屏障指令的线程可以继续执行而不等待其他线程到达屏障指令。
现在将关于各可选架构和特征来阐述更多示例性的信息,根据用户的期望可以采用所述架构和特征来实现或不实现前述的技术。应该特别注意下面的信息出于示例性的目的而阐述并且其不应该被认为是以任何方式进行限制。下面特征中的任何一个可以可选地合并,排斥或无需排斥所述的其他特征。
图1为示出了配置为实现本公开的一个或多个方面的计算机系统100的框图。计算机系统100包括经由可以包括存储器桥105的互连路径通信的中央处理单元(CPU)102和系统存储器104。存储器桥105可以是例如北桥芯片,经由总线或其他通信路径106(例如超传输(HyperTransport)链路)连接到I/O(输入/输出)桥107。I/O桥107,其可以是例如南桥芯片,从一个或多个用户输入设备108(例如键盘、鼠标)接收用户输入并且经由通信路径106和存储器桥105将该输入转发到CPU102。并行处理子系统112经由总线或第二通信路径113(例如外围部件互连(PCI)Express、加速图形端口或超传输链路)耦连到存储器桥105;在一个实施例中,并行处理子系统112是将像素传递到显示设备110(例如常规的基于阴极射线管或液晶显示器的监视器)的图形子系统。系统盘114也连接到I/O桥107。交换器116提供I/O桥107与诸如网络适配器118以及各种插卡120和121的其他部件之间的连接。其他部件(未明确示出),包括通用串行总线(USB)或其他端口连接、压缩光盘(CD)驱动器、数字视频光盘(DVD)驱动器、胶片录制设备及类似部件,也可以连接到I/O桥107。图1所示的各种通信路径包括具体命名的通信路径106和113可以使用任何适合的协议实现,诸如PCI-Express、AGP(加速图形端口)、超传输或者任何其他总线或点到点通信协议,并且如本领域已知的,不同设备间的连接可使用不同协议。
在一个实施例中,并行处理子系统112包含经优化用于图形和视频处理的电路,包括例如视频输出电路,并且构成图形处理单元(GPU)。在另一个实施例中,并行处理子系统112包含经优化用于通用处理的电路,同时保留底层(underlying)的计算架构,本文将更详细地进行描述。在又一个实施例中,可以将并行处理子系统112与一个或多个其他系统元件集成在单个子系统中,诸如结合存储器桥105、CPU102以及I/O桥107,以形成片上系统(SoC)。
应该理解,本文所示系统是示例性的,并且变化和修改都是可能的。连接拓扑,包括桥的数目和布置、CPU102的数目以及并行处理子系统112的数目,可根据需要修改。例如,在一些实施例中,系统存储器104直接连接到CPU102而不是通过桥,并且其他设备经由存储器桥105和CPU102与系统存储器104通信。在其他替代性拓扑中,并行处理子系统112连接到I/O桥107或直接连接到CPU102,而不是连接到存储器桥105。而在其他实施例中,I/O桥107和存储器桥105可能被集成到单个芯片上而不是作为一个或多个分立设备存在。大型实施例可以包括两个或更多个CPU102以及两个或更多个并行处理系统112。本文所示的特定部件是可选的;例如,任何数目的插卡或外围设备都可能得到支持。在一些实施例中,交换器116被去掉,网络适配器118和插卡120、121直接连接到I/O桥107。
图2示出了根据本公开的一个实施例的并行处理子系统112。如所示的,并行处理子系统112包括一个或多个并行处理单元(PPU)202,每个并行处理单元202都耦连到本地并行处理(PP)存储器204。通常,并行处理子系统包括U个PPU,其中U≥1。(本文中,类似对象的多个实例需要时以标识对象的参考数字和标识实例的括号中的数字来表示。)PPU202和并行处理存储器204可使用一个或多个集成电路设备来实现,诸如可编程处理器、专用集成电路(ASIC)或存储器设备,或者以任何其他技术可行的方式来实现。
再参考图1以及图2,在一些实施例中,并行处理子系统112中的一些或所有PPU202是具有渲染管线的图形处理器,其可以配置为实施与下述相关的各种操作:经由存储器桥105和第二通信路径113从CPU102和/或系统存储器104所供应的图形数据生成像素数据,与本地并行处理存储器204(可被用作图形存储器,包括例如常规帧缓冲区(buffer))交互以存储和更新像素数据,传递像素数据到显示设备110等等。在一些实施例中,并行处理子系统112可包括一个或多个作为图形处理器而操作的PPU202以及一个或多个用于通用计算的其他PPU202。这些PPU可以是同样的或不同的,并且每个PPU可具有专用并行处理存储器设备或不具有专用并行处理存储器设备。并行处理子系统112中的一个或多个PPU202可输出数据到显示设备110,或者并行处理子系统112中的每个PPU202可输出数据到一个或多个显示设备110。
在操作中,CPU102是计算机系统100的主处理器,控制和协调其他系统部件的操作。具体地,CPU102发出控制PPU202的操作的命令。在一些实施例中,CPU102写入用于每个PPU202的命令流到数据结构中(在图1或图2中未明确示出),该数据结构可位于系统存储器104、并行处理存储器204、或CPU102和PPU202都可访问的其他存储位置中。将指向每个数据结构的指针写到入栈缓冲区(pushbuffer)以发起对数据结构中的命令流的处理。PPU202从一个或多个入栈缓冲区读取命令流,然后相对于CPU102的操作异步地执行命令。可以经由设备驱动程序103由应用程序为每个入栈缓冲区指定执行优先级以控制对不同入栈缓冲区的调度。
现在返回参考图2和图1,每个PPU202包括经由连接到存储器桥105(或者,在一个替代性实施例中,直接连接到CPU102)的通信路径113与计算机系统100的其余部分通信的I/O(输入/输出)单元205。PPU202到计算机系统100的其余部分的连接也可以变化。在一些实施例中,并行处理子系统112可实现为可插入到计算机系统100的扩展槽中的插卡。在其他实施例中,PPU202可以和诸如存储器桥105或I/O桥107的总线桥集成在单个芯片上。而在其他实施例中,PPU202的一些或所有元件可以和CPU102集成在单个芯片上。
在一个实施例中,通信路径113是PCI Express链路,如本领域所知的,其中专用通道被分配到每个PPU202。也可以使用其他通信路径。I/O单元205生成用于在通信路径113上传送的包(或其他信号),并且还从通信路径113接收所有传入的包(或其他信号),将传入的包引导到PPU202的适当部件。例如,可将与处理任务相关的命令引导到主机接口206,而将与存储器操作相关的命令(例如,对并行处理存储器204的读取或写入)引导到存储器交叉开关单元210。主机接口206读取每个入栈缓冲区,并且将存储在入栈缓冲区中的命令流输出到前端212。
有利地,每个PPU202都实现高度并行处理架构。如详细示出的,PPU202(0)包括处理集群阵列230,该阵列230包括C个通用处理集群(GPC)208,其中C≥1。每个GPC208能够并发执行大量的(例如,几百或几千)线程,其中每个线程是程序的实例(instance)。在各种应用中,可分配不同的GPC208用于处理不同类型的程序或用于实施不同类型的计算。GPC208的分配可以取决于因每种类型的程序或计算所产生的工作量而变化。
GPC208从任务/工作单元207内的工作分布单元接收所要执行的处理任务。工作分布单元接收指向编码为任务元数据(TMD)并存储在存储器中的处理任务的指针。指向TMD的指针包括在存储为入栈缓冲区并由前端单元212从主机接口206接收的命令流中。可以编码为TMD的处理任务包括所要处理的数据的索引,以及定义数据将被如何处理(例如,什么程序将被执行)的状态参数和命令。任务/工作单元207从前端212接收任务并确保在每一个TMD所指定的处理发起前,将GPC208配置为有效状态。可以为每个TMD指定用来调度处理任务的执行的优先级。还可从处理集群阵列230接收处理任务。可选地,TMD可包括控制将TMD添加到处理任务列表(或指向处理任务的指针的列表)的头部还是尾部的参数,从而提供除优先级以外的另一级别的控制。
存储器接口214包括D个分区单元215,每个分区单元215直接耦连到并行处理存储器204的一部分,其中D≥1。如所示的,分区单元215的数目一般等于动态随机存取存储器(DRAM)220的数目。在其他实施例中,分区单元215的数目也可以不等于存储器设备的数目。本领域的普通技术人员应该理解DRAM220可以用其他合适的存储设备来替代并且可以是一般常规的设计。因此省略了详细描述。诸如帧缓冲区或纹理映射图的渲染目标可以跨DRAM220加以存储,这允许分区单元215并行写入每个渲染目标的各部分以有效地使用并行处理存储器204的可用带宽。
任何一个GPC208都可以处理要被写到并行处理存储器204内的任何DRAM220的数据。交叉开关单元210配置为路由每个GPC208的输出到任何分区单元215的输入或到另一个GPC208用于进一步处理。GPC208通过交叉开关单元210与存储器接口214通信,以对各种外部存储器设备进行读取或写入。在一个实施例中,交叉开关单元210具有到存储器接口214的连接以和I/O单元205通信,以及到本地并行处理存储器204的连接,从而使得在不同GPC208内的处理内核能够与系统存储器104或对于PPU202而言非本地的其他存储器通信。在图2所示的实施例中,交叉开关单元210直接与I/O单元205连接。交叉开关单元210可使用虚拟信道来分开GPC208与分区单元215之间的业务流。
另外,GPC208可被编程以执行与种类繁多的应用相关的处理任务,包括但不限于,线性和非线性数据变换、视频和/或音频数据过滤、建模操作(例如,应用物理定律以确定对象的位置、速率和其他属性)、图像渲染操作(例如,曲面细分(tessellation)着色器、顶点着色器、几何着色器、和/或像素着色器程序)等等。PPU202可将数据从系统存储器104和/或本地并行处理存储器204转移到内部(片上)存储器中,处理该数据,并且将结果数据写回到系统存储器104和/或本地并行处理存储器204,其中这样的数据可以由其他系统部件访问,所述其他系统部件包括CPU102或另一个并行处理子系统112。
PPU202可配备有任何容量(amount)的本地并行处理存储器204,包括没有本地存储器,并且可以以任何组合方式使用本地存储器和系统存储器。例如,在统一存储器架构(UMA)实施例中,PPU202可以是图形处理器。在这样的实施例中,将不提供或几乎不提供专用的图形(并行处理)存储器,并且PPU202会以排他或几乎排他的方式使用系统存储器。在UMA实施例中,PPU202可集成到桥式芯片中或处理器芯片中,或作为具有高速链路(例如,PCI Express)的分立芯片提供,所述高速链路经由桥式芯片或其他通信手段将PPU202连接到系统存储器。
如上所示,在并行处理子系统112中可以包括任何数目的PPU202。例如,可在单个插卡上提供多个PPU202、或可将多个插卡连接到通信路径113、或可将一个或多个PPU202集成到桥式芯片中。在多PPU系统中的PPU202可以彼此同样或不同。例如,不同的PPU202可能具有不同数目的处理内核、不同容量的本地并行处理存储器等等。在存在多个PPU202的情况下,可并行操作那些PPU从而以高于单个PPU202所可能达到的吞吐量来处理数据。包含一个或多个PPU202的系统可以以各种配置和形式因素来实现,包括台式电脑、笔记本电脑或手持式个人计算机、服务器、工作站、游戏控制台、嵌入式系统等等。
多个并发任务调度
可以在GPC208上并发执行多个处理任务并且处理任务在执行期间可以生成一个或多个“子”处理任务。任务/工作单元207接收任务并动态调度处理任务和子处理任务用于由GPC208执行。
图3A为根据本公开的一个实施例的图2的任务/工作单元207的框图。任务/工作单元207包括任务管理单元300和工作分布单元340。任务管理单元300基于执行优先级级别来组织所要调度的任务。对于每个优先级级别,任务管理单元300将指向与任务相对应的TMD322的指针的列表存储在调度器表321中,其中所述列表可以实现为链表。可以将TMD322存储在PP存储器204或系统存储器104中。任务管理单元300接受任务并将任务存储在调度器表321中的速度与任务管理单元300调度任务用于执行的速度是解耦的。因此,任务管理单元300可以在调度任务之前收集数个任务。之后可以基于优先级信息或使用其他技术诸如轮叫调度来调度所收集的任务。
工作分布单元340包括具有槽的任务表345,每个槽可以被用于正在执行的任务的TMD322所占用。当任务表345中有空闲槽时,任务管理单元300可以调度任务用于执行。当没有空闲槽时,未占用槽的较高优先级任务可以驱逐占用槽的较低优先级任务。当任务被驱逐时,该任务被停止,并且如果该任务的执行并不完整,则将指向该任务的指针添加到所要调度的任务指针的列表以使得任务的执行稍后将恢复。当生成子处理任务时,在任务的执行期间,将指向该子任务的指针添加到所要调度的任务指针的列表。可以由在处理集群阵列230中执行的TMD322生成子任务。
不同于由任务/工作单元207从前端212接收的任务,子任务从处理集群阵列230接收。子任务不被插入入栈缓冲区或传送到前端。当生成子任务或将用于子任务的数据存储在存储器中时不通知CPU102。通过入栈缓冲区提供的任务与子任务之间的另一个区别是通过入栈缓冲区提供的任务由应用程序来定义而子任务是在任务执行期间动态生成的。
任务处理概述
图3B为根据本公开的一个实施例的在图2的PPU202之一内的GPC208的框图。每个GPC208可配置为并行执行大量线程,其中术语“线程”是指在特定输入数据集上执行的特定程序的实例。在一些实施例中,单指令、多数据(SIMD)指令发出技术用于在不提供多个独立指令单元的情况下支持大量线程的并行执行。在其他实施例中,单指令、多线程(SIMT)技术用于使用配置为向GPC208中的每一个内的处理引擎集发出指令的公共指令单元来支持大量一般来说同步的线程的并行执行。不同于所有处理引擎通常都执行同样指令的SIMD执行机制,SIMT执行通过给定线程程序允许不同线程更容易跟随分散执行路径。本领域普通技术人员应该理解SIMD处理机制代表SIMT处理机制的功能子集。类似地,SISD(单指令单数据)或MIMD(多指令多数据)机制也代表SIMT处理机制的功能子集。
经由将处理任务分布到流多处理器(SM)310的管线管理器305来有利地控制GPC208的操作。管线管理器305还可配置为通过为由SM310所输出的处理数据指定目的地来控制工作分布交叉开关330。
在一个实施例中,每个GPC208包括M个SM310,其中M≥1,每个SM310配置为处理一个或多个线程组。另外,如本领域已知的,每个SM310有利地包括可以管线化的同样功能执行单元集(例如执行单元和加载-存储单元—在图3C中示出为Exec单元302和LSU303),其允许在前一个指令已经结束之前发出新指令。可提供功能执行单元的任何组合。在一个实施例中,功能单元支持各种各样的操作,包括整数和浮点运算(例如加法和乘法)、比较操作、布尔操作(AND、OR、XOR)、移位和各种代数函数的计算(例如平面插值、三角函数、指数函数和对数函数等等);以及相同功能单元硬件可均衡地用来实施不同的操作。
如本文之前所定义的,传送到特定GPC208的一系列指令由一个或多个线程执行,并且跨SM310内的并行处理引擎(未示出)的某一数目的并发执行线程的集合在本文中称为“线程束”或“线程组”。如本文所使用的,“线程组”是指对不同输入数据并发执行相同程序的一组一个或多个线程,所述组的一个线程被指派到SM310内的不同处理引擎。线程组可以包括比SM310内的处理引擎数目少的线程,在这种情况下一些处理引擎将在该线程组正在被处理的周期期间处于闲置状态。线程组还可以包括比SM310内的处理引擎数目多的线程,在这种情况下处理将在连续的时钟周期内发生。因为每个SM310可以并发支持多达G个线程组,结果是在任何给定时间在GPC208中可以执行多达G*M个线程组。
此外,多个相关线程束可以在SM310内同时活动(在执行的不同阶段)。该线程组集合在本文中称为“协作线程阵列”(“CTA”)或“线程阵列”。每个CTA包括编程者所指定的在同一SM310中执行的线程束的数目。一个或多个CTA可潜在地在同一SM310中并发执行。CTA的大小一般由编程者以及可用于CTA的硬件资源诸如存储器或寄存器的容量来确定。
每个SM310包含一级(L1)高速缓存(图3C所示)或使用用于实施加载和存储操作的SM310外部的相应L1高速缓存中的空间。每个SM310都还有权访问在所有GPC208之间共享并且可用于在线程之间转移数据的二级(L2)高速缓存。最后,SM310还有权访问片外“全局”存储器,所述“全局”存储器可以包括例如并行处理存储器204和/或系统存储器104。应该理解,PPU202外部的任何存储器可用作全局存储器。此外,一点五级(L1.5)高速缓存335可以包括在GPC208内,其配置为接收并保持由SM310所请求的经由存储器接口214从存储器获取的数据,包括指令、一致(uniform)数据和常数数据,并将所请求的数据提供给SM310。在GPC208中具有多个SM310的实施例有利地共享了高速缓存在L1.5高速缓存335中的公共指令和数据。
每个GPC208可以包括配置为将虚拟地址映射到物理地址中的存储器管理单元(MMU)328。在其他实施例中,MMU328可以驻留在存储器接口214内。MMU328包括用于将虚拟地址映射到物理地址的页表条目(PTE)集。MMU328可以包括地址转译后备缓冲区(TLB)或可以驻留在多处理器SM310或L1高速缓存或GPC208内的高速缓存。物理地址经处理以分布数据访问位置来允许高效请求在分区单元215之间交错。高速缓存行索引可用于确定用于高速缓存行的请求是命中还是未命中。
在图形和计算应用中,GPC208可配置为使得每个SM310耦连到用于实施纹理映射操作例如确定纹理样本位置、读取纹理数据以及过滤该纹理数据的纹理单元315。从内部纹理L1高速缓存(未示出)或者在一些实施例中从SM310内的L1高速缓存读取纹理数据并根据需要从在所有GPC208之间共享的L2高速缓存、并行处理存储器204或系统存储器104中获取纹理数据。为了将所处理的任务提供给另一个GPC208用于进一步处理或为了经由交叉开关单元210将所处理的任务存储在L2高速缓存、并行处理存储器204或系统存储器104中,每个SM310将所处理的任务输出到工作分布交叉开关330。preROP(预光栅操作)325配置为从SM310接收数据、将数据引导到分区单元215内的ROP单元以及针对颜色混合实施优化、组织像素颜色数据和实施地址转译。
应该理解本文所述的内核架构是示例性的并且变化和修改都是可能的。任何数目的处理单元例如SM310或纹理单元315、preROP325可以包括在GPC208内。进一步地,如图2所示,PPU202可以包括任何数目的GPC208,所述GPC208有利地在功能上彼此相似以使得执行行为不取决于哪个GPC208接收特定处理任务。进一步地,每个GPC208有利地使用分开且各异的处理单元、L1高速缓存来独立于其他GPC208操作以为一个或多个应用程序执行任务。
本领域普通技术人员应该理解图1、2、3A和3B所描述的架构决不限制本发明的范围并且在不脱离本发明范围的情况下本文所教导的技术可以在任何经适当配置的处理单元上实现,所述处理单元包括但不限于一个或多个CPU、一个或多个多核CPU、一个或多个PPU202、一个或多个GPC208、一个或多个图形或专用处理单元等等。
在本发明的实施例中,使用计算系统的PPU202或其他处理器来使用线程阵列执行通用计算是可取的。为线程阵列中的每个线程指派在线程的执行期间对于线程可访问的唯一的线程标识符(“线程ID”)。可被定义为一维或多维数值的线程ID控制线程处理行为的各方面。例如,线程ID可用于确定线程将要处理输入数据集的哪部分和/或确定线程将要产生或写输出数据集的哪部分。
每线程指令序列可包括定义线程阵列的代表性线程和一个或多个其他线程之间的协作行为的至少一个指令。例如,每线程指令序列可能包括在序列中的特定点处挂起用于代表性线程的操作执行直到诸如其他线程的一个或多个到达该特定点的时间为止的指令、用于代表性线程将数据存储在其他线程的一个或多个有权访问的共享存储器中的指令、用于代表性线程原子地读取和更新存储在其他线程的一个或多个基于它们的线程ID有权访问的共享存储器中的数据的指令等等。程序还可以包括计算数据将从其读取的共享存储器中的地址的指令,该地址是线程ID的函数。通过定义合适的函数并提供同步技术,可以以可预测的方式由CTA的一个线程将数据写入共享存储器中的给定位置并由同一个CTA的不同线程从该位置读取数据。因此,数据在线程之间共享的任何期望模式可以得到支持,以及CTA中的任何线程可以与同一个CTA中的任何其他线程共享数据。如果存在数据在CTA的线程之间的共享,则其范围由程序确定;因此,应该理解的是,在使用CTA的特定应用中,CTA的线程可能会或可能不会真正互相共享数据,这取决于程序,术语“CTA”和“线程阵列”在本文作为同义词使用。
图3C为根据本公开的一个实施例的图3B的SM310的框图。SM310包括配置为经由L1.5高速缓存335从存储器接收指令和常数的指令L1高速缓存370。线程束调度器和指令单元312从指令L1高速缓存370接收指令和常数并根据该指令和常数控制本地寄存器堆304和SM310功能单元。SM310功能单元包括N个exec(执行或处理)单元302和P个加载-存储单元(LSU)303。
SM310提供具有不同级别的可访问性的片上(内部)数据存储。特殊寄存器(未示出)对于LSU303可读但不可写并且用于存储定义每个线程的“位置”的参数。在一个实施例中,特殊寄存器包括每线程(或SM310内的每exec单元302)一个的存储线程ID的寄存器;每个线程ID寄存器仅由各自的exec单元302可访问。特殊寄存器还可以包括附加寄存器,其对于执行由TMD322所代表的同一个处理任务的所有线程(或由所有LSU303)可读,其存储CTA标识符、CTA维数、CTA所属网格(grid)的维数(或队列位置,如果TMD322编码队列任务而不是网格任务的话)、以及CTA被指派到的TMD322的标识符。
如果TMD322是网格TMD,则TMD322的执行会启动和执行固定数目的CTA以处理存储在队列中的固定量的数据。将CTA的数目指定为网格宽度、高度和深度的乘积。可以将固定量的数据存储在TMD322中或TMD322可以存储指向将由CTA所处理的数据的指针。TMD322还存储由CTA所执行的程序的开始地址。
如果TMD322是队列TMD,那么使用TMD322的队列特点,这意味着将要被处理的数据量不一定是固定的。队列条目存储用于由指派到TMD322的CTA所处理的数据。队列条目还可以代表在线程执行期间由另一个TMD322所生成的子任务,从而提供嵌套并行性。通常线程或包括线程的CTA的执行被挂起直到子任务的执行完结。可以将队列存储在TMD322中或与TMD322分开存储,在该情况下TMD322存储指向该队列的队列指针。有利地,当代表子任务的TMD322正在执行时可以将由子任务所生成的数据写到队列。队列可以实现为循环队列以使得数据的总量不限于队列的大小。
属于网格的CTA具有指示网格内各自CTA的位置的隐含网格宽度、高度和深度参数。在初始化期间响应于经由前端212从设备驱动程序103所接收的命令来写特殊寄存器并且在处理任务的执行期间特殊寄存器不改变。前端212调度每个处理任务用于执行。每个CTA与具体TMD322相关联用于一个或多个任务的并发执行。此外,单个GPC208可以并发执行多个任务。
参数存储器(未示出)存储可由同一个CTA内的任何线程(或任何LSU303)读取但不可由其写入的运行时间参数(常数)。在一个实施例中,设备驱动程序103在引导SM310开始执行使用参数的任务之前将这些参数提供给参数存储器。任何CTA内的任何线程(或SM310内的任何exec单元302)可以通过存储器接口214访问全局存储器。可以将全局存储器的各部分存储在L1高速缓存320中。
每个线程将本地寄存器堆304用作暂存空间;每个寄存器被分配以专用于一个线程,并且在本地寄存器堆304的任何部分中的数据仅对于寄存器被分配到的线程可访问。本地寄存器堆304可以实现为物理上或逻辑上分为P个通道的寄存器堆,每个通道具有一定数目的条目(其中每个条目可以存储例如32位字)。将一个通道指派到N个exec单元302和P个下载-存储单元LSU303的每一个,并且利用用于执行同一个程序的不同线程的数据来填充不同通道中的相应条目以帮助SIMD执行。可以将通道的不同部分分配到G个并发线程组中的不同线程组,以使得本地寄存器堆304中的给定条目仅对于特定线程可访问。在一个实施例中,保留本地寄存器堆304内的某些条目用于存储线程标识符,实现特殊寄存器之一。此外,一致L1高速缓存375存储用于N个exec单元302和P个下载-存储单元LSU303的每个通道的一致值或常数值。
共享存储器306对于单个CTA内的线程可访问;换言之,共享存储器306中的任何位置对于同一个CTA内的任何线程(或对于SM310内的任何处理引擎)可访问。共享存储器306可以实现为具有允许任何处理引擎对共享存储器中的任何位置读取或写入的互连的共享寄存器堆或共享片上高速缓存存储器。在其他实施例中,共享状态空间可能映射到片外存储器的每CTA区上并被高速缓存在L1高速缓存320中。参数存储器可以实现为在实现共享存储器306的同一个共享寄存器堆或共享高速缓存存储器内的指定段(section),或者实现为LSU303对其具有只读访问权限的分开的共享寄存器堆或片上高速缓存存储器。在一个实施例中,实现参数存储器的区域还用于存储CTA ID和任务ID,以及CTA和网格维数或队列位置,实现特殊寄存器的各部分。SM310中的每个LSU303耦连到统一地址映射单元352,统一地址映射单元352将为在统一存储器空间中所指定的加载和存储指令所提供的地址转换为每个各异存储器空间中的地址。因此,指令可以用于通过指定统一存储器空间中的地址来访问本地、共享或全局存储器空间中的任何一个。
每个SM310中的L1高速缓存320可以用于高速缓存私有的每线程本地数据还有每应用全局数据。在一些实施例中,可以将每CTA共享数据高速缓存在L1高速缓存320中。LSU303经由存储器和高速缓存互连380耦连到共享存储器306和L1高速缓存320。
线程逻辑标识符
包括多个工作项的输入工作缓冲区被指派到CTA用于处理。工作缓冲区可以包括用于像素块(pixel tile)的工作项,其中每个工作项与像素块的特定区域相对应。等于工作缓冲区中的工作项的数目的若干线程附属于“父”CTA。如果存在过多工作项,那么仅可用工作项的子集可以被附属于“父”CTA。相对于父CTA的逻辑标识符被指派到每个线程并且逻辑标识符依次增量,以使得逻辑标识符指示线程被启动的顺序。在线性空间而非多维空间中定义逻辑标识符。当需要时,线程可以配置为基于逻辑标识符执行代码的关键(critical)段。当逻辑标识符由每个线程所使用以索引输入工作缓冲区时,可以按工作顺序(经由逻辑至物理线程映射)执行CTA的线程。重要的是,用于线程的逻辑标识符存储在SM310内,所以即使处理工作被存储在SM310外,也可以标识由逻辑标识符所指定的、序列中进行处理的下一个线程。之后,可以将用于下一个线程的处理工作加载到SM310中用于处理。
为了维护从逻辑线程ID至物理线程的映射,引入线程块的概念,其中每个线程块与固定的物理线程集相对应(例如每块16个线程)。当启动新的工作时,一次为物理线程分配一个线程块。以此方式,仅需要以每块的粒度而非每线程的粒度维护映射。图4是根据本公开的一个示范性实施例的、示出了CTA的线程块的示意图。如图4所示,16个CTA可正执行在SM310内并且每个CTA可使用八个不同屏障,每个屏障具有唯一的屏障标识符。屏障可以包括“顶”和“底”屏障指令以定义程序内的关键代码段的开始和终结。较简单的屏障仅包括“顶”屏障指令。在一个实施例中,“顶”屏障指令的程序计数器作为标签被附加到屏障标识符以允许同一屏障标识符被用在单个程序中的多个地方。当同一屏障标识符在程序中出现多于一次时,程序计数器唯一地区分不同屏障。在另一个实施例中,使用增量计数器来生成唯一的屏障标识符。
可以为每个CTA分配至少一个线程块,其中线程块包括16个线程。如图4所示,在一个实施例中,可被分配到CTA的线程块的最大数目是8。在另一个实施例中,线程块包括64个线程并且每个CTA可以包括512个或更多个线程。保留16个线程束用于处理线程块,其中每个线程束包括4个线程。因此,每个线程块是具有被一起分配的资源的64个线程的组。如图4所示,128个线程束可以同时由SM310处理并且四个线程块可以分布到不同的执行单元302用于跨不同执行单元302的负载平衡。在其他实施例中,不同数目的线程可以包括在CTA中并且线程块可以包括不同数目的线程。
给定与特定线程相关联的逻辑标识符,可以确定包括特定线程的相应线程组。在一个实施例中,通过舍去逻辑标识符的最低4位来计算线程块。逻辑标识符的最低4位是线程块内的偏移。通过将线程块映射到相应的物理标识符基并且之后使用偏移来定位为线程所分配的处理资源来计算用于线程的物理标识符。例如,物理标识符的高位可以用来确定线程块并且较低位可以用来确定线程块内的特定线程。总之,逻辑标识符是用于CTA中的每个线程的面向CTA的标识符并且物理标识符是针对CTA的用于由SM310执行的每个线程的面向硬件的标识符。
屏障指令调度
图5A是根据本公开的一个示范性实施例的、图3C的线程束调度器和指令单元312的框图。如图5A所示,线程束调度器和指令单元312包括指令高速缓存获取单元412,其配置为从指令L1高速缓存370获取包含用于线程束的指令的高速缓存行。在一个实施例中,每个高速缓存行是512位宽,在单个高速缓存行中存储8个指令(64位宽)。指令高速缓存获取单元412将指令输出到指令调度单元420。
指令调度单元420接收指令和线程束标识符并且继续调度指令用于执行。指令调度单元420可以配置为维护与在SM310上所调度的每个线程束相关联的优先级以及基于优先级调度所获取的指令。例如,调度单元425可以在任何给定的时间维护与在SM310上所调度的16个不同线程束中的每一个相关联的6位或10位优先级值。可以基于各种因素指派优先级。在一个实施例中,优先级可以基于何时在SM310上调度线程束(即最长挂起的线程束可具有最高的优先级)。在其他实施例中,用于每个线程束的优先级可以由程序所指定或可以基于CTA,该程序由线程束所执行的指令定义。
指令调度单元420包括调度单元425、屏障状态502、线程状态510和屏障调度单元430。调度单元425不一定按不同线程束的优先级顺序选择指令,因为指令中的一个或多个可能由于数据依赖性而未就绪用于执行,或者因为参与屏障指令的所有线程尚未到达屏障指令。当第一指令可以被发出时,由调度单元425调度并且输出指令。当第一指令不能被发出时,调度单元425确定用于不同线程束的指令是否可以被发出用于各自的指令。在一些情况下,第一指令可以被发出,但是第一指令是低优先级的,使得(来自不同线程束的)另一指令可能代替其被发出。在所有情况下,用于线程束的每个单独线程的指令按用于各自的单独线程的指令由线程束调度器和指令单元312接收的顺序被发出。
调度单元425维护基于所发出的指令被更新的SM310的状态模型。状态模型允许调度单元425基于程序的动态执行和SM310内的资源的可用性来选择指令。例如,将执行指令的SM310或SM310内的功能单元或纹理单元315可以被标识为指令所需的资源并且资源的可用性可以由调度单元425使用。
由调度单元425和屏障调度单元430维护和使用状态信息。特别地,屏障和线程需要状态信息。屏障状态包括下面字段中的一个或多个:参考计数、重新扫描标志、静态/动态/空闲字段和屏障类型(例如简单有条件的关键段、有序的关键段)。屏障在空闲状态中开始。当至少一个线程到达顶屏障指令时,屏障状态从空闲改变为静态。当屏障“就绪(ready)”以被执行时,调度单元425将状态从静态改变为动态。当屏障的执行“完成(done)”时,屏障调度单元430将状态从动态改变为空闲。
线程状态存储在线程状态510中并且包括下面字段中的一个或多个:屏障标识符、父CTA的标识符、逻辑标识符、完成标志和清醒/休眠标志。在下面的段落中进一步详细描述了线程状态510和屏障状态的使用。
当调度单元425标识特定屏障指令的第一出现时,意味着在程序的执行期间CTA的第一线程已经到达特定屏障指令,调度单元425将由屏障指令所指定的屏障标识符的状态从“空闲”更新为“静态”(假设第一线程造成与参考计数相比的屏障成员计数器的增量)。不一定CTA的所有线程参与被分配到CTA的每个屏障。参与特定屏障的每个线程指定与该特定屏障相对应的屏障标识符并且线程可以一次参与一个屏障。在一个实施例中,线程可以使用指令谓词指示参与特定屏障。不参与屏障的线程可以被调度以执行由调度单元425所接收的指令。不参与屏障的线程直到所有参与线程已经到达屏障指令为止才能执行按程序顺序在屏障指令之后的指令。
调度单元425配置为当用于特定屏障的“成员”完整时,将屏障状态从静态改变为动态。各种不同的条件可以用来确定成员完整。第一条件是已经到达屏障指令的线程的数目等于被指派到父CTA的线程的数目。第二条件是已经到达屏障指令的线程的数目等于为屏障所指定的参考计数。第三条件是已经到达屏障指令以及参与屏障的线程的数目等于为屏障所指定的参考计数。参考值由程序指定并且指示被期望抵达屏障的线程的数目。不参与屏障的线程将在线程状态510中存储0用于屏障标识符。调度单元425可以配置为随着线程到达屏障指令而增量与特定屏障相对应的屏障成员计数器以确定用于屏障的成员是否完整。
随着每个参与线程到达屏障指令,更新存储在线程状态510中的用于线程的状态数据。具体地,将线程状态设置为“休眠(asleep)”,指示线程被停止(即暂停)并且没有正在执行指令。已经撤回的线程保持“清醒”并且可以继续执行。一旦成员完整,调度单元425就将屏障标识符的状态改变为“动态”并且将CTA标识符和屏障标识符输出到屏障调度单元430。屏障调度单元430配置为调度参与屏障指令的线程用于执行。
屏障指令可以用来描绘程序的有序和无序的关键代码段。顶屏障指令在关键代码段的第一指令之前立即发生并且具有与顶屏障指令相同的屏障标识符的底屏障指令在关键代码段的最后指令之后立即发生。表1示出了有序的关键代码段的示例。
表1
屏障指令还可以用来描绘不具有顺序约束的关键代码段,即无序的关键代码部分。无序的关键代码段可以由屏障调度单元430以任意顺序调度,或者逻辑标识符可被用来以逻辑标识符顺序调度关键代码段,正如有序的关键代码段被调度一样。屏障调度单元430将仅调度(有序的和无序的)关键代码段用于由参与屏障的线程执行。在一个实施例中,屏障指令不描绘关键代码段并且用作(简单的)有条件的屏障以使在屏障指令处的参与线程的执行同步。换言之,仅存在单个的屏障指令而非顶和底指令。
屏障调度单元430通过唤醒第一线程来调度参与屏障的线程,其中第一线程是具有最低逻辑标识符值的参与线程(除非使用不同的排序约定)。屏障调度单元430更新线程状态510以指示第一线程清醒。因此,因为第一线程现在有资格被执行,所以调度单元425将调度第一线程用于执行。当第一线程到达底屏障时,屏障调度单元430由调度单元425通知并且线程状态510由屏障调度单元430或调度单元425更新以指示第一线程休眠。当第一线程到达底屏障时,线程状态510中的完成标志也由屏障调度单元430或调度单元425更新以指示第一线程完成。
之后屏障调度单元430唤醒下一个参与线程,这使能用于下一个参与线程的关键代码段的执行。屏障调度单元430继续按逻辑顺序唤醒每个参与线程直到最后的参与线程到达底屏障为止。当最后的参与线程到达底屏障时,屏障的执行完整并且屏障调度单元430更新线程状态510以指示所有参与线程清醒。当针对下一个参与线程的搜索失败时,屏障调度单元430可以确定最后的参与线程已经被调度。调度单元425更新屏障状态502以指示屏障标识符是“空闲”,例如既非“静态”也非“动态”。之后调度单元425能够以任何顺序调度参与线程中的一个或多个用于执行。
有索引的屏障指令调度
在一些情况下,参与屏障的线程不需要被串行执行。换言之,参与线程的子组可以被并行执行。在每个子组内线程被串行执行。用于改善性能的一个技术是将每个子组指派到不同的屏障标识符,以使得不同的子组可以被并行执行。单个屏障标识符可以由参与线程中的每一个引用,以使得在不同子组开始并行执行之前参与线程被同步。如先前所解释的,为每个屏障指定参考计数。时常每个子组中的线程的数目不一定能被简单确定。因此,使用不同的屏障标识符用于每个子组可能不是使能并行执行的实用技术。相反,如本文所进一步描述的,有索引的屏障指令可以用来使能至少一个线程的子组的并行执行,其中每个线程参与同一有索引的屏障。
有索引的屏障指令将屏障标识符分开成两个(或更多个)字段,其中第一字段指定与参考计数相关联的屏障标识符并且第二字段指定子屏障索引。例如,6位名称空间可被分成4.2格式,其中4位指定主要屏障标识符,2位指定子屏障索引,这允许16个不同的主要屏障,每个可以包括4个不同的子屏障。因此,16个主要屏障中的每一个可以支持多达4路并行。子屏障索引区分参与线程的不同子组并且可以存储在每线程寄存器中。主要屏障标识符可以作为操作码字段被提供。在一个实施例中,主要屏障标识符和子屏障索引二者都存储在每线程寄存器中,其中子屏障索引驻留在寄存器的较低位中。
在执行期间,一旦参与线程在有索引的屏障处同步,不同的子组就可以并行执行。然而,在指定同一子屏障标识符的线程的每个子组内,参与线程被串行执行。在跟随在针对有索引的屏障的同步之后的任何时间点,一次可以选择属于不同子屏障中的每一个的一个线程用于执行,并且所选择的线程可以被并行执行,以使得参与有索引的屏障的两个或更多个线程可以被并行执行。在一个实施例中,四个线程可以被并行执行。在一个实施例中,已知为能够并行执行的线程组,诸如像素四元组(quad)(例如2×2、1×4或4×1像素)的四个线程可以代替单个线程被控制并执行。
子屏障标识符中的每一个不需要分开的参考计数。在一些情况下,计算用于子屏障标识符中的每一个的参考计数可能是困难的,因为应该到达子屏障的线程的数目是未知的。因此,使用为多个子组指定参考计数的有索引的屏障的能力使能每个子组的并行执行而不需要计算用于每个子组的参考计数。相反,使用分开的(非索引的)屏障用于每个子组以使得子组可以被并行执行则要求为子组中的每一个指定参考计数。
图5B是根据本公开的一个示范性实施例的、将子屏障索引映射到由多个图形图元相交的像素网格540的示意图。像素网格540是8×8网格,其进一步分为四个4×4像素的区域。在其他实施例中,每个区域包括像素网格540中的相邻或非相邻像素中的一个或多个像素。有序的关键代码段可以配置为实施隐藏表面移除(即z缓冲或深度测试)。当实施隐藏表面移除时,应该针对每个像素以相同顺序处理与像素网格540相交的图形图元以避免产生视觉赝像(artifact)。如图5B所示,三个图元542、544和546与像素网格540相交。假设三个图元542、544和546处于同一深度,则在隐藏表面移除期间改变对图元进行处理的顺序可产生不同的图像。
表2示出可以用来实现隐藏表面移除操作的有序的关键代码段的示例。
表2
屏障BARRIER.TOP.OCS.IDX配置为使用4个不同的索引0、1、2和3,其被映射到像素网格540的不同的4×4像素区域,如图5B所示。BAR_03是屏障标识符并且R8是包含索引的输入寄存器。
对线程进行分配以处理每个像素,并且,随着每个参与线程抵达BARRIER.TOP.OCS.IDX处,已经到达有索引的屏障的线程的计数被增量并且用于参与线程的线程状态510被设置为“休眠”。在一个实施例中,指示已经达到屏障的参与线程的计数的屏障信息状态和参考计数被维护在屏障状态502中用于具有被设置为主要屏障标识符的第一字段和被设置为0的子屏障索引的屏障标识符。
假设8位6.2格式的屏障标识符(6位主要屏障标识符和2位索引字段),其中主要屏障标识符等于3(二进制格式的000011),参考计数被指定用于屏障标识符0×3<<2(二进制格式的00001100),假设2位子屏障索引。当主要屏障标识符与2位子屏障索引结合时,产生屏障标识符00001100、00001101、00001110和00001111(即十进制格式的12、13、14和15),以使得唯一的屏障标识符与子屏障索引中的每一个相对应。在另一个实施例中,子屏障索引可以与像素屏幕坐标相对应。例如,(x,y)像素坐标的低2位可以用来指定4位子屏障索引,其中子屏障索引=((pixel.y&3)<<2)|(pixel.x&3)。
从屏障调度单元430的角度来看,具有2位子屏障索引字段的有索引的屏障与四个不同的屏障相对应,其中不同的子组与不同屏障中的每一个相关联。因此,在每个子组内的线程被串行执行的同时,屏障调度单元430可以调度子组用于并行执行。一旦参与有索引的屏障的所有线程到达有索引的屏障时(即当计数等于参考计数时),调度单元425就将四个屏障标识符的状态改变为“动态”并且将CTA标识符和屏障标识符输出到屏障调度单元430。为了使能子组的并行执行,由调度单元425将分开的屏障标识符输出到屏障调度单元430用于由参与线程中的至少一个所指定的每个子屏障索引。通过将用于整体屏障名称的子屏障索引遮住,子屏障可以作为子组被控制。这允许调度器单元425例如在释放子屏障中的任何一个之前等待所有子屏障被执行。
当同一像素位置在参与线程的子组中出现多于一次时,相应的线程将作为同一子组的一部分以逻辑顺序执行,该逻辑顺序是输入顺序(即图元542、544和546被接收的顺序)。当特定子组中的最后参与线程到达底屏障时,屏障调度单元430更新线程状态510以指示特定子组中的所有参与线程“清醒”。屏障调度单元430还将用于与子组相对应的特定屏障标识符的屏障状态502从“动态”更新为“空闲”(即既非“静态”也非“动态”)。当不同子组中的所有参与线程已经被调度时,调度单元425将已经更新屏障状态502以指示四个屏障标识符(例如12、13、14和15)是“空闲”(即既非“静态”也非“动态”)。调度单元425之后能够以任何顺序调度参与线程中的一个或多个用于执行。
屏障调度单元430还可以配置为利用(有索引的或无索引的)非阻塞式底屏障来调度排他的关键代码段和有序的关键代码段。屏障调度单元430通过首先等待任何其他关键代码段或排他的关键代码段的执行完结来调度参与排他的关键代码段的第一线程。调度用于排他的关键代码段的屏障用于排他的执行。排他的关键代码段可以是排他的有序的关键代码段或排他的无序的关键代码段。注意未参与屏障的线程可以与执行排他的关键代码段的线程同时执行。排他的关键代码段可以当在参与不同屏障的线程之间可能发生资源访问冲突时使用。
屏障调度单元430通过允许线程继续执行紧跟在底屏障之后的随后的指令而不等待所有参与线程执行关键代码段来利用非阻塞式底屏障来调度参与关键代码段的线程。一旦由屏障调度单元430更新用于参与线程的线程状态510以指示线程清醒,线程就在到达底屏障之后保持清醒。之后调度单元425能够调度已经完结关键代码段的执行的参与线程用于与(用于有索引的屏障的每个子组中的)当前正在执行关键代码段的一个其他参与线程同时执行。当所有参与线程已经到达底屏障时,屏障的执行是完整的并且屏障调度单元430更新屏障状态502以指示屏障标识符(或用于有索引的屏障的屏障标识符)既非“静态”也非“动态”。
在一个实施例中,调度单元425实施动态屏障记分板检查以确定是否可以在将第一指令输出到解码单元450之前发出第一指示。当第一指令与屏障标识符相关联时,调度单元425等待在以下情况下发出第一指令:当(静态或动态状态中的)屏障与第一指令相比具有相同的屏障标识符和不同的标签时或当(动态状态中的)屏障具有相同的标识符和相同的标签时。
解码单元450从指令调度单元420接收要被分派的下一个指令。解码单元450实施指令的全解码并且将经解码的指令传送到分派单元470。另外,在一些实施例中,指令可以被双倍或四倍地发出并且解码单元450可以实现分开的解码逻辑用于每个所发出的指令。分派单元470实现FIFO并且将经解码的值写到本地寄存器堆304用于由执行单元302或加载/存储单元303执行。在同时发出多个指令的实施例中,分派单元470可以将每个指令发出到SM310的功能单元的不同部分。记分板单元480管理并且追踪每线程组已经被解码并且被分派的指令的数目。
在一些情况下,不一定所有参与线程在线程中一些开始执行无序的关键代码段之前到达屏障指令。例如,屏障可以起到“减速带”的作用以激励一些线程的分组而不要求线程等待参与屏障的所有线程到达屏障。因此,被期望具有局部化存储器访问样式的线程的至少一部分可以被分组用于改善的高速缓存访问性能。当由调度单元425动态生成子屏障索引用于屏障的不同版本时,有索引的屏障可以用来执行无序的关键的代码。
调度单元425可以配置为将有索引的屏障转变为“动态”状态并且生成屏障的“版本”而不一定等待参与屏障的所有线程到达有索引的屏障指令。每个有索引的屏障可以指定是否使能版本化(versioning)用于屏障。超时(即最大持续时间)可以被指定用于屏障,其被用来控制何时生成新的子屏障索引以创建屏障的新版本。从到达屏障的第一参与线程或从到达屏障的最近参与线程测量超时。在一个实施例中,调度单元425可以在生成新的子屏障索引用于参与线程的子组之前等待最小数目的参与线程到达有索引的屏障。超时和/或最小数目的参与线程是版本生成条件。
当版本化被使能用于有索引的屏障并且版本生成条件被满足时,调度单元425将与所生成的子屏障索引相对应的屏障标识符从“静态”转变为“动态”状态并且将由版本子组中的每个线程所引用的子屏障索引设置为子屏障索引。当使用经版本化的有索引的屏障时,索引不再由用户所提供的索引寄存器(例如表2所示的输入寄存器R8)控制,而是由调度单元425以串行方式生成。有索引的屏障由此被处理而不等待所有参与线程到达屏障。子屏障索引被初始化为0并且被增量(以索引计数为模)用于所生成的每个版本。因为唯一子屏障索引的数目是有限的,所以调度单元425可能需要在重新使用子屏障索引生成另一版本之前等待与先前所生成的版本相对应的子组完结执行(即从“动态”转变为“空闲”)。子组(即版本)的执行可以针对每个子组索引被并行实施。当计数等于参考计数时,将生成最后版本,并且当所有参与线程均被执行时,有索引的屏障的执行是完整的。
图5C是根据本公开的一个示范性实施例的、图5A的调度单元425和屏障调度单元430的一部分的框图。线程屏障抵达追踪单元500更新存储在屏障状态502中的、用于被分配到CTA的每个屏障的屏障状态信息。如先前所解释的,屏障状态信息指示哪些屏障标识符是“静态”、“动态”或空闲(既非“静态”也非“动态”)。当屏障标识符从“静态”转变为“动态”时,将屏障标识符和CTA标识符输出到FIFO505。如果屏障是有索引的屏障并且调度单元425不被配置为生成版本,则具有相同主要屏障标识符的屏障标识符被输出一次用于每个唯一的子屏障索引。当调度单元425配置为生成用于有索引的屏障的版本时,当生成版本时输出用于与版本相对应的子屏障索引的屏障标识符并且如果版本的数目大于唯一的子屏障索引的数目并且版本是空闲的,则可以重复利用子屏障索引。随着参与屏障的CTA的每个线程到达屏障指令,调度单元425更新存储在线程状态510中的参与线程的状态以指示参与线程“休眠”。
当在屏障执行槽515中执行槽不可用时,FIFO505缓存动态屏障。在一个实施例中,屏障执行槽515包括16个槽,每个槽可以由一个动态屏障占用。当在屏障执行槽515中槽可用时,从FIFO505取出动态屏障并且将其插入到槽中。屏障仲裁单元520在占用屏障执行槽515的槽的不同动态屏障之间进行仲裁。可以由屏障仲裁单元520采用各种优先级方案以在不同动态屏障之间进行仲裁。屏障仲裁单元520为线程选择单元530提供动态屏障,可以由线程选择单元530从该动态屏障选择线程用于调度。
线程选择单元530按由与线程阵列(即分配到CTA的)中的每个线程相关联的逻辑标识符所指定的顺序选择线程。线程选择单元530访问屏障参与追踪信息532以确定哪些线程参与动态屏障。线程选择单元530访问线程状态510和存储在屏障状态502中的屏障状态信息以标识任何迟抵达的参与线程。
并非被分配到CTA的一个或多个线程块中的所有线程都一定参与由CTA所使用的每个屏障。如先前所解释的,屏障由屏障标识符指定并且每个线程通过引用与有索引的屏障相对应的主要屏障标识符来指示它是否参与有索引的屏障中的一个或多个。线程选择单元530在有索引的屏障的处理期间为每个子组标识参与线程一次并且之后继续选择具有相同子屏障索引的每个参与线程用于串行执行。线程选择单元530在选择过程期间跳过非参与线程。
在为特定屏障选择第一线程用于执行之前,线程选择单元530确定屏障是否是描绘排他的关键代码段的排他屏障。如果屏障是排他的,那么线程选择单元530确定是否任何其他的线程阵列正在执行关键代码段或排他的关键代码段,并且如果是,则线程选择单元530在为排他屏障选择第一线程用于执行之前等待直到那些线程阵列中的线程完结执行为止。在一个实施例中,在动态屏障占用屏障执行槽515中的槽时FIFO505不取出排他屏障,并且在排他屏障占用屏障执行槽515中的槽时FIFO505不取出屏障。
线程选择单元530可以基于用于每个子组的参与线程生成执行掩码。参与线程指定与随屏障指令所提供的屏障标识符匹配的屏障标识符。线程选择单元530按逻辑标识符顺序搜索执行掩码以找出第一线程,以选择用于执行直到子组中的所有线程已经被选择。随着每个参与线程被选择,清除与参与线程相对应的执行掩码的位并且将线程标记为完成。在一个实施例中,当多个线程块被分配到CTA时,线程选择单元530一次生成用于一个线程块的执行掩码,由此将执行掩码中的位的数目限制于线程块中的线程的数目。
当线程选择单元530选择参与线程用于执行时,线程选择单元530更新存储在线程状态510中的线程的状态以指示线程“清醒”。之后调度单元425将发出线程用于执行并且继续发出线程用于关键代码段中的每个指令直到到达屏障底。当到达底屏障时,调度单元425通知线程选择单元530并且线程选择单元530确定屏障是否要求线程在继续执行按程序顺序在关键代码段之后的指令之前等待参与屏障的所有其他线程来执行关键代码段(即线程选择单元530确定底屏障是否是非阻塞式底屏障)。当屏障是非阻塞式屏障时,线程选择单元530可以选择下一个参与线程用于执行而不将当前所选择的参与线程置于“睡眠”。相反,存储在线程状态510中的下一个参与线程的状态被更新为“清醒”并且已经完结关键代码段的执行的任何参与线程按程序顺序继续执行程序的随后的指令。随着每个参与线程到达底屏障,线程选择单元530还设置各自的完成标志。
在一个实施例中,屏障用来确保用于使用纹理单元315处理数据的特定CTA的线程被实施而不允许来自不同CTA的线程干预。确保用于一个CTA的线程由纹理单元315一起处理增加高速缓存命中的可能性,因为纹理访问在CTA内被局部化。纹理单元315是共享资源的示例并且屏障可以用来控制哪些线程访问共享资源或可从局部性受益的资源。虽然线程可能不需要按特定顺序执行,但是描绘作为排他的关键代码段从存储器读取纹理数据的纹理加载指令提供用于增加纹理读将在L1.5高速缓存335中命中的可能性的机制。控制特定资源的(例如纹理单元315)的排他的关键代码段中的指令能够在与不使用相同资源的关键代码段和/或排他的关键代码段相同的时间执行。屏障执行槽515可以包括专用于描绘由纹理单元315执行的指令的屏障的槽,或用于优选局部化的受控制的访问的任何资源的槽。由纹理单元315执行的线程可以与由执行单元302执行的线程同时被调度用于执行。可以为不同的屏障标识符指定调度优先级并且使用屏障指令所描绘的纹理加载指令可以或可以不利用高于其他屏障的优先级被调度。
图5D示出了根据本公开的一个示范性实施例的、用于调度有索引的屏障指令用于执行的方法的流程图550。如先前所描述的,子屏障索引可以由每线程寄存器指定或当版本生成条件被满足时可以由调度单元425动态生成。尽管结合图1、2、3A-3C、5A和5C的系统描述了该方法步骤,但是本领域普通技术人员将理解配置为以任何顺序实施该方法步骤的任何系统均在本公开的范围内。
方法550始于步骤555,其中将被分配到CTA的线程与逻辑标识符相关联。在线程的执行期间可以将逻辑标识符映射到由SM310所引用的物理标识符。在步骤560,发起程序执行并且调度单元425接收指令。对于在有索引的屏障指令之前的指令,调度单元425通过将指令输出到解码单元450来继续程序的执行。在步骤565,参与有索引的屏障的至少一个线程到达屏障指令,并且在步骤570,参与线程的执行被暂停。调度单元425更新已经到达有索引的屏障指令的线程的计数用于被暂停的每个参与线程。当对于CTA的第一线程来说到达有索引的屏障指令时,调度单元425还更新主要屏障标识符的状态以指示屏障是“静态”。当不参与有索引的屏障指令的线程到达有索引的屏障指令时,线程继续程序的执行。
在步骤572,调度单元425确定有索引的屏障是否可以被调度。如果版本化未被使能,则当所有参与线程已经到达屏障指令(即计数等于参考计数)时,有索引的屏障可被调度。如果版本化被使能,那么当为屏障所指定的版本生成条件被满足(即最小数目的参与线程已经到达屏障或超时已经发生)时,有索引的屏障可被调度。
如果在步骤572,调度单元425确定有索引的屏障不能被调度,那么在步骤588,程序的执行继续。否则,在并行步骤585中的每一个步骤处,执行用于与子屏障索引之一相对应的子组中的一个线程的关键代码段。可以以串行方式执行用于子组中的线程的关键代码段。如图5D所示,可以并行执行子组中的一个或多个。当版本化未被使能时,关键代码段可以是有序的关键代码段,因为有索引的屏障直到所有参与线程已经到达有索引的屏障之后才被调度。因为可能不一定按逻辑标识符的顺序执行参与线程,所以版本化不应该被使能用于有序的关键代码段。当子组中的参与线程完结关键代码段的执行时,在步骤588,程序执行继续。
图6A示出了根据本公开的一个实施例的、用于基于逻辑标识符调度有索引的屏障指令用于执行的方法的流程图600。尽管结合图1、2、3A-3C、5A和5C的系统描述了该方法步骤,但是本领域普通技术人员将理解配置为以任何顺序实施该方法步骤的任何系统均在本公开的范围内。
方法600始于步骤605,其中分配到CTA的线程与逻辑标识符相关联。逻辑标识符在线程的执行期间被映射到由SM310引用的物理标识符。在步骤610,发起程序执行并且调度单元425接收指令。在步骤615,调度单元425确定指令是否是屏障指令,并且如果指令不是屏障指令,则在步骤658,调度单元425通过将指令输出到解码单元450来继续程序的执行。
如果在步骤615,调度单元425确定指令是屏障指令,并且如果是,那么在步骤616,调度单元425根据用于屏障的成员条件来更新屏障成员。当对于CTA的第一线程来说到达屏障指令时,调度单元425还更新屏障的状态以指示屏障是“静态”(假设线程造成与参考计数相比的屏障成员计数器的增量)。那么在步骤617,调度单元425确定线程是否参与有索引的屏障指令。当屏障指令是有索引的屏障指令时,可以忽略由每个线程所指定的屏障标识符的子屏障索引字段以确定参与。如果线程不参与有索引的屏障指令,那么调度单元425前进至步骤658,并且线程继续程序的执行。否则,线程参与有索引的屏障指令,并且在步骤620,调度单元425将线程的状态更新为“休眠”。当有索引的屏障指令描绘(有序的或无序的)关键代码段的开始并且版本化未被使能时,调度单元425成员条件应该要求CTA中的所有参与线程在允许任何参与线程执行关键代码段之前到达有索引的屏障指令。
在步骤622,调度单元425根据可以用来确定成员完整的各种不同条件来确定成员是否完整。当版本化被使能用于有索引的屏障时,调度单元425不需要在允许参与线程的子组被调度用于执行之前等待所有参与线程到达屏障指令。换言之,调度单元425不需要等待成员完整。如果成员并非完整的,那么在步骤623,调度单元425确定版本生成条件是否被满足。如果版本化未被使能用于有索引的屏障,则版本生成条件不能被满足。如果在步骤623,版本生成条件未被满足,那么在步骤658,在调度单元425继续程序的执行的同时,已经到达有索引的屏障的参与线程保持休眠。如果版本生成被使能用于有索引的屏障并且如果超时已经到期或如果最小数目的参与线程已经到达有索引的屏障,则版本生成条件可以被满足。如果在步骤623,调度单元425确定版本生成条件被满足,那么在步骤624,调度单元425更新用于屏障的子屏障索引。调度单元425将目标子屏障索引提供到每个参与线程,以使得线程可以节约线程状态510中的正确的屏障标识符。一旦参与线程就绪用于执行,就将屏障标识符+索引发送到屏障调度单元430,并且更新索引用于下一个版本。如果下一个索引目前正在使用,那么记分板单元480防止发出直到下一个索引空闲。在步骤627,调度单元425在前进至步骤655之前将与子屏障索引相对应的屏障标识符的状态从“静态”更新为“动态”并且将线程的屏障标识符和CTA标识符输出到屏障调度单元430。
如果在步骤622,调度单元425确定成员是完整的,那么在步骤625,调度单元425确定版本生成是否被使能。如果版本生成被使能,那么调度单元425前进至步骤624以生成用于屏障的最后版本。否则,在步骤627,调度单元425在前进至步骤655之前将与主要屏障标识符相对应的屏障标识符的状态从“静态”更新为“动态”并且将与子屏障索引中的每一个相对应的屏障标识符和线程的CTA标识符输出到屏障调度单元430。
在步骤655,屏障调度单元430选择每个子组内的参与线程用于串行执行。可以并行执行来自每个不同子组的一个线程。当所有参与线程已经完结关键代码段的执行时,程序执行在步骤658继续。结合图6B描述步骤655的附加细节。在一个实施例中,如果屏障变成“悬挂”使得线程不能被执行,则屏障可以用与被无效的屏障可被重置的相同方式即经由特殊的指令被重置。
在一个实施例中,有条件的屏障用来使在屏障指令处的参与线程的执行同步,并且在步骤620,用于每个参与线程的线程状态被设置为休眠并且当在步骤622成员完整时,调度单元425将屏障的状态从“静态”更新为“动态”并且将存储在线程状态510中的所有参与线程的状态更新为“清醒”。在步骤655,之后参与线程继续程序的执行并且屏障调度单元430将屏障的状态更新为既非“静态”也非“动态”,即指示对于线程的至少一部分来说该屏障的执行是完整的。
图6B示出了根据本公开的一个实施例的、用于实施图6A所示的步骤655的方法。尽管结合图1、2、3A-3C、5A和5C的系统描述了该方法步骤,但是本领域普通技术人员将理解配置为以任何顺序实施该方法步骤的任何系统均在本公开的范围内。
在步骤630,屏障调度单元430基于与参与屏障的线程相关联的逻辑标识符选择线程用于执行。将所选择的线程的状态从“休眠”更新为“清醒”,以使得线程有资格执行。结合图6C描述步骤630的附加细节。当版本化被使能时,屏障调度单元430可以选择线程用于与逻辑标识符相比失序地执行。
在步骤635,关键代码段内的指令由分派单元470分派并且被执行用于所选择的线程。在步骤636,调度单元312接收与屏障标识符相关联的底屏障指令并且更新线程的状态以设置完成标志。在步骤638,屏障调度单元430确定底屏障指令是否是阻塞式底屏障指令。当在步骤638调度单元312确定底屏障指令是阻塞式时,那么在步骤640,屏障调度单元430确定参与屏障的另一个线程是否需要执行关键代码段。如果另一个线程需要执行关键代码段,那么在步骤643,屏障调度单元430更新已经到达底屏障指令的线程的状态,将其从“清醒”更新为“休眠”,以使得线程没有资格执行。否则,在步骤650,屏障调度单元430更新线程状态510以指示子组中的所有线程是“清醒”的并且索引可以被重新使用。在另一个实施例中,屏障调度单元430直到所有线程已经到达底屏障指令为止才更新线程状态510以指示子组中的线程是清醒的。在步骤652,屏障调度单元430将(用于子组的)屏障标识符和CTA标识符从屏障执行槽515中的执行槽移除,更新屏障标识符的状态以指示有索引的屏障既非“静态”也非“动态”。注意随着每个子组完结执行,更新与子组相对应的特定屏障标识符的状态。
之后调度单元425前进以继续程序的执行。在用于一个CTA屏障的关键代码段的执行期间,同一CTA的其他屏障的其他线程以及其他CTA的线程屏障还可以继续其他代码的执行。然而,如果屏障是排他的,则仅不包括在关键代码内的程序指令可以被执行用于其他屏障。
图6C示出了根据本公开的一个实施例的、用于实施图6A所示的步骤630的方法。尽管结合图1、2、3A-3C、5A和5C的系统描述了该方法步骤,但是本领域普通技术人员将理解配置为以任何顺序实施该方法步骤的任何系统均在本公开的范围内。
对于每个调度循环,步骤630由屏障调度单元430实施。在步骤660,屏障调度单元430标识屏障执行槽515中的任何挂起屏障,该屏障执行槽515存储动态屏障并且具有可被调度的下一个线程。如果排他屏障正在被执行,那么屏障调度单元430在标识任何挂起屏障之前等待直到排他屏障的执行是完整的。在步骤622,屏障调度单元430选择最高优先级的动态屏障。在步骤665,屏障调度单元430确定所选择的动态屏障是否是排他屏障,并且如果是排他屏障,则在步骤668,屏障调度单元430在前进至步骤670之前等待直到线程没有正在执行描绘(有序的或无序的)关键代码段的任何其他屏障为止。应该理解屏障调度单元430可以在(串行地)执行参与排他屏障的线程之前等待所有参与线程完结其他关键代码段的执行或仅等待当前正在执行的线程完结关键代码段的执行。应该理解可以针对多个CTA并行地执行多个非排他屏障,但是一次仅可以执行一个排他屏障。
在步骤670,屏障调度单元430通过确定每个线程是否按名称指定屏障来标识参与所选择的屏障的线程。在步骤675,屏障调度单元430通过检查与尚未执行关键代码段的每个参与线程相关联的逻辑标识符来搜索下一个参与线程。在步骤680,屏障调度单元430在前进至步骤635之前更新存储在线程状态510中的、用于所选择的参与线程子组的线程状态以指示线程是“清醒”的。应该理解,步骤670可以每线程块实施一次或每循环实施一次,以标识子组中的参与线程,因为屏障调度单元430可以配置为维护用于每个子组的执行掩码。屏障调度单元430随着每个先前的参与线程完结关键代码段的执行而高效地按逻辑顺序唤醒参与线程,并且更新用于子组的执行掩码。在一个实施例中,为每个线程块计算执行掩码。
虽然以上已经描述了各种实施例,但是应该理解它们仅通过示例而非限制的方式进行了呈现。因此,优选实施例的宽度和范围不应该由以上所描述的示例性实施例所限制,而应该仅根据跟随的权利要求及其等同物被定义。
Claims (20)
1.一种方法,包括:
发起多个线程的执行以处理包括屏障指令的程序的指令;
对于所述多个线程中的每个线程,当所述线程到达所述屏障指令时暂停指令的执行;
确定所述屏障指令能够被调度用于执行;
将所述多个线程中的所述线程的第一子组与第一子屏障索引相关联;
将所述多个线程中的所述线程的第二子组与第二子屏障索引相关联;以及
串行地执行所述第一子组中的线程并且串行地执行所述第二子组中的线程,其中所述第一子组中的至少一个线程与所述第二子组中的至少一个线程并行地执行。
2.如权利要求1所述的方法,进一步包括,对于所述多个线程中的每个线程,当在所述线程的执行期间所述线程到达所述屏障指令时确定所述线程是否参与所述屏障指令。
3.如权利要求1所述的方法,其中所述确定所述屏障指令能够被调度用于执行包括确定线程抵达计数等于参考计数,其中在参与所述屏障指令的每个线程的执行期间当所述线程到达所述屏障指令时,更新所述线程抵达计数。
4.如权利要求3所述的方法,其中所述参考计数等于参与所述屏障指令的线程的数目。
5.如权利要求1所述的方法,所述确定所述屏障指令能够被调度用于执行包括确定版本生成条件被满足。
6.如权利要求5所述的方法,其中当小于参与所述屏障指令的线程的数目的最小数目的参与线程已经到达所述屏障指令时,所述版本生成条件被满足。
7.如权利要求5所述的方法,其中当最大的持续时间已经发生时,所述版本生成条件被满足。
8.如权利要求5所述的方法,其中所述确定所述版本生成条件被满足包括将所述最大持续时间与自所述多个线程中的第一参与线程到达所述屏障指令时起的延迟相比较。
9.如权利要求5所述的方法,其中所述确定所述版本生成条件被满足包括将所述最大持续时间与自所述多个线程中的最近参与线程到达所述屏障指令时起的延迟相比较。
10.如权利要求1所述的方法,进一步包括将所述线程与被映射到物理标识符的逻辑标识符相关联,其中所述物理标识符在所述线程的执行期间由多线程处理核心引用。
11.如权利要求1所述的方法,进一步包括:
基于与所述屏障指令相对应的程序计数器或存储器地址生成标签;以及
将所述标签与所述屏障指令相关联。
12.如权利要求1所述的方法,其中所述第一子屏障索引和所述第二子屏障索引基于像素屏幕坐标或与所述像素屏幕坐标相对应的所存储的内容的存储器地址来确定。
13.如权利要求1所述的方法,其中所述屏障指令描绘关键代码段。
14.如权利要求1所述的方法,其中每个线程为所述线程参与的每个屏障指令指定屏障标识符。
15.一种处理子系统,包括:
指令调度单元,其配置为:
发起多个线程的执行以处理包括屏障指令的程序的指令;
对于所述多个线程中的每个线程,当所述线程到达所述屏障指令时暂停指令的执行;
确定所述屏障指令能够被调度用于执行;
将所述多个线程中的所述线程的第一子组与第一子屏障索引相关联;
将所述多个线程中的所述线程的第二子组与第二子屏障索引相关联;以及
多线程处理核心,其配置为串行地执行所述第一子组中的线程并且串行地执行所述第二子组中的线程,其中所述第一子组中的至少一个线程与所述第二子组中的至少一个线程并行地执行。
16.如权利要求15所述的处理子系统,其中所述指令调度单元进一步配置为,对于所述多个线程中的每个线程,当在所述线程的执行期间所述线程到达所述屏障指令时确定所述线程是否参与所述屏障指令。
17.如权利要求15所述的处理子系统,其中所述指令调度单元进一步配置为,在确定所述屏障指令能够被调度用于执行之前,确定线程抵达计数等于参考计数,其中在每个参与线程的执行期间当所述线程到达所述屏障指令时,更新所述线程抵达计数。
18.如权利要求17所述的处理子系统,其中所述参考计数等于参与所述屏障指令的线程的数目。
19.如权利要求15所述的处理子系统,其中所述指令调度单元进一步配置为当版本生成条件被满足时确定所述屏障指令能够被调度用于执行。
20.如权利要求15所述的处理子系统,其中所述指令调度单元进一步配置为基于像素屏幕坐标或与所述像素屏幕坐标相对应的所存储的内容的存储器地址确定所述第一子屏障索引和所述第二子屏障索引。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US13/844,541 US9442755B2 (en) | 2013-03-15 | 2013-03-15 | System and method for hardware scheduling of indexed barriers |
US13/844,541 | 2013-03-15 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN104050033A true CN104050033A (zh) | 2014-09-17 |
Family
ID=51418666
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310745810.5A Pending CN104050033A (zh) | 2013-03-15 | 2013-12-30 | 用于有索引的屏障的硬件调度的系统和方法 |
Country Status (4)
Country | Link |
---|---|
US (1) | US9442755B2 (zh) |
CN (1) | CN104050033A (zh) |
DE (1) | DE102013114072B4 (zh) |
TW (1) | TWI512630B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107102582A (zh) * | 2017-04-07 | 2017-08-29 | 深圳怡化电脑股份有限公司 | 一种子系统命令的同步方法及装置 |
CN108139903A (zh) * | 2015-07-21 | 2018-06-08 | Macom连接解决有限公司 | 依dmb操作用加载/存储操作实施加载撷取/存储释放指令 |
CN108334407A (zh) * | 2016-12-30 | 2018-07-27 | 德州仪器公司 | 在硬件线程调度程序上调度基于并行块的数据处理任务 |
CN113721987A (zh) * | 2021-09-02 | 2021-11-30 | 海光信息技术股份有限公司 | 指令执行方法和指令执行装置 |
CN117311995A (zh) * | 2023-11-28 | 2023-12-29 | 苏州元脑智能科技有限公司 | 一种存储系统的后台任务执行方法及其系统、控制器 |
Families Citing this family (26)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9448803B2 (en) | 2013-03-11 | 2016-09-20 | Nvidia Corporation | System and method for hardware scheduling of conditional barriers and impatient barriers |
US9984430B2 (en) * | 2013-04-15 | 2018-05-29 | Intel Corporation | Ordering threads as groups in a multi-threaded, multi-core graphics compute system |
US9842111B2 (en) * | 2013-12-22 | 2017-12-12 | Varonis Systems, Ltd. | On-demand indexing |
FR3021429B1 (fr) * | 2014-05-23 | 2018-05-18 | Kalray | Barriere de synchronisation materielle entre elements de traitement |
US10241958B2 (en) * | 2014-08-29 | 2019-03-26 | Microsoft Technology Licensing, Llc | Configurable synchronized processing of multiple operations |
US9519944B2 (en) * | 2014-09-02 | 2016-12-13 | Apple Inc. | Pipeline dependency resolution |
US9298807B1 (en) * | 2014-09-09 | 2016-03-29 | Sas Institute Inc. | Techniques for dynamic partitioning in a distributed parallel computational environment |
US10558464B2 (en) * | 2017-02-09 | 2020-02-11 | International Business Machines Corporation | Infinite processor thread balancing |
US10325341B2 (en) * | 2017-04-21 | 2019-06-18 | Intel Corporation | Handling pipeline submissions across many compute units |
US11353868B2 (en) * | 2017-04-24 | 2022-06-07 | Intel Corporation | Barriers and synchronization for machine learning at autonomous machines |
GB2560059B (en) | 2017-06-16 | 2019-03-06 | Imagination Tech Ltd | Scheduling tasks |
GB2563587B (en) * | 2017-06-16 | 2021-01-06 | Imagination Tech Ltd | Scheduling tasks |
US10558418B2 (en) * | 2017-07-27 | 2020-02-11 | Advanced Micro Devices, Inc. | Monitor support on accelerated processing device |
US11061742B2 (en) * | 2018-06-27 | 2021-07-13 | Intel Corporation | System, apparatus and method for barrier synchronization in a multi-threaded processor |
DE102020127704A1 (de) | 2019-10-29 | 2021-04-29 | Nvidia Corporation | Techniken zum effizienten transferieren von daten an einem prozessor |
US11080051B2 (en) | 2019-10-29 | 2021-08-03 | Nvidia Corporation | Techniques for efficiently transferring data to a processor |
US11409579B2 (en) * | 2020-02-24 | 2022-08-09 | Intel Corporation | Multiple independent synchonization named barrier within a thread group |
DE112021000305T5 (de) | 2020-03-20 | 2022-12-01 | Nvidia Corporation | Programmiermodell für ressourcenbeschränkte Planung |
US20210382717A1 (en) * | 2020-06-03 | 2021-12-09 | Intel Corporation | Hierarchical thread scheduling |
US11977895B2 (en) | 2020-06-03 | 2024-05-07 | Intel Corporation | Hierarchical thread scheduling based on multiple barriers |
US11204774B1 (en) * | 2020-08-31 | 2021-12-21 | Apple Inc. | Thread-group-scoped gate instruction |
US11720360B2 (en) * | 2020-09-11 | 2023-08-08 | Apple Inc. | DSB operation with excluded region |
US11656796B2 (en) | 2021-03-31 | 2023-05-23 | Advanced Micro Devices, Inc. | Adaptive memory consistency in disaggregated datacenters |
US20230289242A1 (en) | 2022-03-10 | 2023-09-14 | Nvidia Corporation | Hardware accelerated synchronization with asynchronous transaction support |
US20230315655A1 (en) | 2022-03-10 | 2023-10-05 | Nvidia Corporation | Fast data synchronization in processors and memory |
US11954492B1 (en) | 2022-09-19 | 2024-04-09 | Apple Inc. | Fence enforcement techniques based on stall characteristics |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20110078417A1 (en) * | 2009-09-25 | 2011-03-31 | Brian Fahs | Cooperative thread array reduction and scan operations |
CN102508712A (zh) * | 2011-09-29 | 2012-06-20 | 中国科学技术大学苏州研究院 | 异构多核可重构混合系统中的中间件系统及任务执行方法 |
US8209702B1 (en) * | 2007-09-27 | 2012-06-26 | Emc Corporation | Task execution using multiple pools of processing threads, each pool dedicated to execute different types of sub-tasks |
Family Cites Families (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7310722B2 (en) * | 2003-12-18 | 2007-12-18 | Nvidia Corporation | Across-thread out of order instruction dispatch in a multithreaded graphics processor |
US7669203B2 (en) * | 2003-12-19 | 2010-02-23 | Intel Corporation | Virtual multithreading translation mechanism including retrofit capability |
US7555607B2 (en) | 2005-11-10 | 2009-06-30 | Hewlett-Packard Development Company, L.P. | Program thread syncronization for instruction cachelines |
CN101542442B (zh) | 2007-04-09 | 2012-12-19 | 松下电器产业株式会社 | 多处理器控制装置、其控制方法及集成电路 |
US7941791B2 (en) | 2007-04-13 | 2011-05-10 | Perry Wang | Programming environment for heterogeneous processor resource integration |
US8661226B2 (en) * | 2007-11-15 | 2014-02-25 | Nvidia Corporation | System, method, and computer program product for performing a scan operation on a sequence of single-bit values using a parallel processor architecture |
US9678775B1 (en) * | 2008-04-09 | 2017-06-13 | Nvidia Corporation | Allocating memory for local variables of a multi-threaded program for execution in a single-threaded environment |
US8423750B2 (en) | 2010-05-12 | 2013-04-16 | International Business Machines Corporation | Hardware assist thread for increasing code parallelism |
US8799454B2 (en) | 2010-12-15 | 2014-08-05 | International Business Machines Corporation | Behavior based client selection for disparate treatment |
US9158595B2 (en) | 2012-10-25 | 2015-10-13 | Nvidia Corporation | Hardware scheduling of ordered critical code sections |
US9448803B2 (en) | 2013-03-11 | 2016-09-20 | Nvidia Corporation | System and method for hardware scheduling of conditional barriers and impatient barriers |
-
2013
- 2013-03-15 US US13/844,541 patent/US9442755B2/en active Active
- 2013-11-13 TW TW102141297A patent/TWI512630B/zh active
- 2013-12-16 DE DE102013114072.6A patent/DE102013114072B4/de active Active
- 2013-12-30 CN CN201310745810.5A patent/CN104050033A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8209702B1 (en) * | 2007-09-27 | 2012-06-26 | Emc Corporation | Task execution using multiple pools of processing threads, each pool dedicated to execute different types of sub-tasks |
US20110078417A1 (en) * | 2009-09-25 | 2011-03-31 | Brian Fahs | Cooperative thread array reduction and scan operations |
CN102508712A (zh) * | 2011-09-29 | 2012-06-20 | 中国科学技术大学苏州研究院 | 异构多核可重构混合系统中的中间件系统及任务执行方法 |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108139903A (zh) * | 2015-07-21 | 2018-06-08 | Macom连接解决有限公司 | 依dmb操作用加载/存储操作实施加载撷取/存储释放指令 |
CN108139903B (zh) * | 2015-07-21 | 2019-11-15 | 安培计算有限责任公司 | 依dmb操作用加载/存储操作实施加载撷取/存储释放指令 |
CN108334407A (zh) * | 2016-12-30 | 2018-07-27 | 德州仪器公司 | 在硬件线程调度程序上调度基于并行块的数据处理任务 |
CN108334407B (zh) * | 2016-12-30 | 2023-08-08 | 德州仪器公司 | 在硬件线程调度程序上调度基于并行块的数据处理任务 |
CN107102582A (zh) * | 2017-04-07 | 2017-08-29 | 深圳怡化电脑股份有限公司 | 一种子系统命令的同步方法及装置 |
CN113721987A (zh) * | 2021-09-02 | 2021-11-30 | 海光信息技术股份有限公司 | 指令执行方法和指令执行装置 |
CN113721987B (zh) * | 2021-09-02 | 2022-07-05 | 海光信息技术股份有限公司 | 指令执行方法和指令执行装置 |
CN117311995A (zh) * | 2023-11-28 | 2023-12-29 | 苏州元脑智能科技有限公司 | 一种存储系统的后台任务执行方法及其系统、控制器 |
CN117311995B (zh) * | 2023-11-28 | 2024-02-23 | 苏州元脑智能科技有限公司 | 一种存储系统的后台任务执行方法及其系统、控制器 |
Also Published As
Publication number | Publication date |
---|---|
TWI512630B (zh) | 2015-12-11 |
US9442755B2 (en) | 2016-09-13 |
TW201435746A (zh) | 2014-09-16 |
DE102013114072A1 (de) | 2014-09-18 |
US20140282566A1 (en) | 2014-09-18 |
DE102013114072B4 (de) | 2024-08-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104050033A (zh) | 用于有索引的屏障的硬件调度的系统和方法 | |
CN104050032A (zh) | 用于有条件的屏障和急迫的屏障的硬件调度的系统和方法 | |
CN103365631B (zh) | 用于存储器访问的动态库模式寻址 | |
US8639882B2 (en) | Methods and apparatus for source operand collector caching | |
US9158595B2 (en) | Hardware scheduling of ordered critical code sections | |
US10255228B2 (en) | System and method for performing shaped memory access operations | |
CN103226463A (zh) | 用于使用预解码数据调度指令的方法和装置 | |
CN103729167A (zh) | 用于改进多线程处理单元中的性能的技术 | |
CN103226481A (zh) | 自动从属任务启动 | |
CN103279379A (zh) | 用于在没有指令解码的情况下调度指令的方法和装置 | |
CN103425533A (zh) | 用于管理嵌套执行流的方法和系统 | |
CN103309702A (zh) | 用于并行线程子集的一致加载处理 | |
CN103294753A (zh) | 无锁先入先出 | |
US9069609B2 (en) | Scheduling and execution of compute tasks | |
CN103559088A (zh) | 维持公平性和顺序的资源管理子系统 | |
CN103778072A (zh) | 多线程处理单元中的高效存储器虚拟化 | |
CN103207774A (zh) | 用于解决线程发散的方法和系统 | |
CN103886547A (zh) | 用于存储共享顶点的技术 | |
CN103389944A (zh) | 用于具有存储器分配限制的协处理器的虚拟存储器结构 | |
CN103885902A (zh) | 用于经由纹理硬件实施存储器访问操作的技术 | |
CN104050706A (zh) | 用于低功率图形渲染的像素着色器旁路 | |
CN103294536A (zh) | 控制用于处理任务的工作分布 | |
CN103810743A (zh) | 在上游着色器中设置下游渲染状态 | |
CN103176848A (zh) | 计算工作分布参考计数器 | |
CN103886538A (zh) | 用于存储共享顶点的技术 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20140917 |
|
WD01 | Invention patent application deemed withdrawn after publication |