CN104050032A - 用于有条件的屏障和急迫的屏障的硬件调度的系统和方法 - Google Patents
用于有条件的屏障和急迫的屏障的硬件调度的系统和方法 Download PDFInfo
- Publication number
- CN104050032A CN104050032A CN201310745800.1A CN201310745800A CN104050032A CN 104050032 A CN104050032 A CN 104050032A CN 201310745800 A CN201310745800 A CN 201310745800A CN 104050032 A CN104050032 A CN 104050032A
- Authority
- CN
- China
- Prior art keywords
- thread
- instruction
- barrier
- barrier instruction
- execution
- 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 515
- 238000000034 method Methods 0.000 title claims abstract description 86
- 230000008569 process Effects 0.000 claims abstract description 36
- 238000012545 processing Methods 0.000 claims description 102
- 230000002618 waking effect Effects 0.000 claims description 3
- 238000003860 storage Methods 0.000 description 54
- 230000003068 static effect Effects 0.000 description 20
- 238000010586 diagram Methods 0.000 description 16
- 238000004891 communication Methods 0.000 description 15
- 230000000295 complement effect Effects 0.000 description 11
- 230000005059 dormancy Effects 0.000 description 10
- 230000006870 function Effects 0.000 description 10
- 238000013316 zoning Methods 0.000 description 9
- 238000007726 management method Methods 0.000 description 8
- 230000008859 change Effects 0.000 description 6
- 238000005516 engineering process Methods 0.000 description 6
- 230000001360 synchronised effect Effects 0.000 description 6
- 230000007246 mechanism Effects 0.000 description 5
- 238000013507 mapping Methods 0.000 description 4
- 230000005540 biological transmission Effects 0.000 description 3
- 238000013519 translation Methods 0.000 description 3
- 241000208340 Araliaceae Species 0.000 description 2
- 235000005035 Panax pseudoginseng ssp. pseudoginseng Nutrition 0.000 description 2
- 235000003140 Panax quinquefolius Nutrition 0.000 description 2
- 230000006399 behavior Effects 0.000 description 2
- 235000008434 ginseng Nutrition 0.000 description 2
- 238000012423 maintenance Methods 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
- 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
- 230000003111 delayed effect Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 230000001066 destructive effect Effects 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
- 230000000977 initiatory effect Effects 0.000 description 1
- 239000004973 liquid crystal related substance Substances 0.000 description 1
- 230000004807 localization Effects 0.000 description 1
- 230000014759 maintenance of location Effects 0.000 description 1
- 239000000203 mixture Substances 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
- 238000012546 transfer Methods 0.000 description 1
- 210000003462 vein Anatomy 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/30072—Arrangements for executing specific machine instructions to perform conditional operations, e.g. using predicates or guards
-
- 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
-
- 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/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
- G06F9/4881—Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
-
- 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)
Abstract
提供用于屏障指令的硬件调度的方法和系统。发起多个线程的执行以处理包括屏障指令的程序的指令,并且当在程序的执行期间每个线程到达屏障指令时,确定线程是否参与屏障指令。之后串行地执行参与屏障指令的线程以处理跟随在屏障指令之后的程序的一个或多个指令。还提供用于屏障指令的急迫调度的方法和系统。当大于最小数目的线程并且小于多个线程中的所有线程的线程的一部分到达屏障指令时,串行地执行该部分中的线程中的每一个以处理跟随在屏障指令之后的程序的一个或多个指令。
Description
技术领域
本发明涉及程序执行,并且更具体地,涉及有条件的或急迫的(impatient)屏障(barrier)。
背景技术
常规的并行处理架构支持多个线程的执行。在程序的执行期间使用常规的并行处理架构实施的特定操作可能要求多个线程的同步。屏障指令(或栅栏(fence)指令)用来在这类程序的执行期间使多个线程的执行同步。并行处理架构内的调度单元识别屏障指令并且确保所有线程在任何线程执行该特定屏障指令以后的指令之前到达该特定屏障指令。在一些情况下,不一定使屏障指令处的所有线程同步并且不要求同步的线程的执行一定被延迟。
因此,存在对于解决调度执行线程以处理屏障指令的问题和/或与现有技术相关联的其他问题的需求。
发明内容
提供用于调度有条件的屏障的执行的系统和方法。发起多个线程的执行以处理包括屏障指令的程序的指令,并且当在程序的执行期间每个线程到达屏障指令时,确定线程是否参与屏障指令。之后串行地执行参与屏障指令的线程以处理跟随在屏障指令之后的程序的一个或多个指令。
还提供用于屏障指令的急迫调度的方法和系统。发起多个线程的执行以处理包括屏障指令的程序的指令,并且当大于最小数目的线程并且小于多个线程中的所有线程的线程的一部分到达屏障指令时,串行地执行该部分中的线程中的每一个以处理跟随在屏障指令之后的程序的一个或多个指令。
附图说明
图1是示出了配置为实现本公开的一个或多个方面的计算机系统的框图;
图2是根据本公开的一个实施例的、用于图1的计算机系统的并行处理子系统的框图;
图3A是根据本公开的一个实施例的、图2的前端的框图;
图3B是根据本公开的一个实施例的、图2的并行处理单元之一内的通用处理集群的框图;
图3C是根据本公开的一个实施例的、图3B的流多处理器的一部分的框图;以及
图4是根据本公开的一个示范性实施例的、示出了CTA的线程块的示意图;
图5A是根据本公开的一个示范性实施例的、图3C的线程束(warp)调度器和指令单元的框图;
图5B是根据本公开的一个示范性实施例的、图5A的调度单元和屏障调度单元的一部分的框图;
图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、线程状态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
BARRIER.TOP.OCS //开始有序的关键段
LD R0,[address]; //对于本地工作,将CTA计数器加载到R0中
IMAD R2,R0,R1,R3; //使用线程值来增量
ST[address],R2 //将来自R2的CTA计数器存储到存储器
BARRIER.BOT.OCS; //结束有序的关键段
屏障指令还可以用来描绘不具有顺序约束的关键代码段,即无序的关键代码部分。无序的关键代码段可以由屏障调度单元430以任意顺序调度,或者逻辑标识符可被用来以逻辑标识符顺序调度关键代码段,正如有序的关键代码段被调度一样。屏障调度单元430将仅调度(有序的和无序的)关键代码段用于由参与屏障的线程执行。在一个实施例中,屏障指令不描绘关键代码段并且用作(简单的)有条件的屏障以使在屏障指令处的参与线程的执行同步。换言之,仅存在单个的屏障指令而非顶和底指令。
在一些情况下,可以使能急迫的屏障调度并且调度单元425配置为将屏障转变为动态状态而不一定等待参与屏障的所有线程到达屏障指令。换言之,参与线程的子集可以在至少一个其他参与线程已经到达屏障之前开始屏障的执行。每个屏障可以指定是否为屏障使能急迫的调度。当使能急迫的屏障调度时,可以使用附加的条件来确定成员完整。
如先前所解释的,调度单元425配置为使用各种不同的条件来确定用于特定屏障的成员完整。第四条件是发生超时。可以以各种不同的方式测量超时。可以从第一(参与)线程到达屏障来测量超时。可以从第一(参与或非参与)线程到达屏障来测量超时。可以从最近(参与)线程到达屏障来测量超时。可以从最近(参与或非参与)线程到达屏障来测量超时。第五条件是发生超时或最小数目的线程已经到达屏障。
急迫的屏障起到“减速带”的作用以激励一些线程的分组,而不要求线程等待参与屏障的所有线程到达屏障。因此,被期望具有本地化存储器访问样式的线程的至少一部分可以被分组用于改善的高速缓存访问性能。急迫的屏障可以用来执行无序的关键的代码。急迫的屏障可以用来执行有序的关键的代码,然而,参与急迫的屏障的线程可能不一定按顺序执行,因为较早(根据顺序)的线程可能在较迟(根据顺序)的线程已经被执行之后到达屏障。
当屏障作为急迫的屏障被调度时(即仅参与线程的一部分已经到达屏障),调度单元425可以配置为使屏障无效,以使得在屏障转变为动态状态之后抵达的任何参与线程忽略屏障并且不等待其他参与线程。一般地,当屏障用来描绘代码的关键段时,屏障不应该被无效。应该仅对不描绘关键代码段的有条件的屏障实施无效以允许迟抵达的线程继续执行,如本文所进一步描述的。如果线程迟于代码的经无效的关键段抵达,则不应该允许迟抵达的线程(例如,经由预测)执行所描绘的代码以防止相消干扰。
迟抵达的线程处置
当为屏障使能急迫的调度时,在屏障已经从静态转变为动态之后抵达的线程稍后可以或可以不被允许“加入”屏障。迟抵达的线程是否可以加入急迫的屏障,可以针对每个屏障加以指定或者可以针对可作为急迫的屏障被调度的所有屏障加以使能。维护完成标志,以使得屏障调度单元430可以辨别尚未被调度的迟抵达的线程(done=0并且asleep=1)和已经执行关键代码段的(无论是否迟抵达的)线程(done=1),但是其按逻辑顺序在迟抵达的线程之后。当每个参与线程到达屏障指令时清除完成标志并且当线程执行描绘关键代码段的底屏障指令时设置完成标志。
当迟抵达的参与线程加入急迫的屏障时,调度单元425将线程状态设置为done=0并且asleep=1,指示迟抵达的参与线程被停止并且没有正在执行指令。调度单元425还设置用于屏障的重新扫描标志。重新扫描标志指示迟抵达的参与线程已经加入急迫的屏障。当设置重新扫描标志时,屏障调度单元430将重新扫描线程状态510以标识并且调度任何迟抵达的参与线程,即其线程状态不被设置为done=1的线程。重新扫描将最佳地在当前扫描的执行终结时被实施,但是可以在直到当前扫描终结时的任何时间实施。如果急迫的屏障没有正在接受迟抵达的线程,则将由屏障记分板逻辑(未示出)防止线程发出。一旦屏障转变回空闲,就允许线程发出并且重新开始屏障。
在一个实施例中,调度单元425配置为允许任何迟抵达的参与线程在等待参与线程的到达屏障的部分执行之后忽略屏障。调度单元425保持迟抵达的参与线程“休眠”(利用所清除的完成标志)直到参与线程到达屏障的部分的执行完整之后为止。当参与线程的该部分完结屏障的执行之后,调度单元425将用于迟抵达的参与线程的线程状态510更新为“清醒(awake)”,并且为所有参与线程设置完成标志。之后迟抵达的参与线程和参与线程的该部分中的线程继续执行。调度单元425可以将迟抵达的线程配置为执行由屏障所描绘的代码或者配置为在与完结屏障的执行的线程的相同点处恢复执行。
屏障调度
屏障调度单元430通过唤醒第一线程来调度参与屏障的线程,其中第一线程是具有最低逻辑标识符值的参与线程(除非使用不同的排序约定)。屏障调度单元430更新线程状态510以指示第一线程清醒。因此,因为第一线程现在有资格被执行,所以调度单元425将调度第一线程用于执行。当第一线程到达底屏障时,屏障调度单元430由调度单元425通知并且线程状态510由屏障调度单元430或调度单元425更新以指示第一线程休眠。当第一线程到达底屏障时,线程状态510中的完成标志也由屏障调度单元430或调度单元425更新以指示第一线程完成。
之后屏障调度单元430唤醒下一个参与线程,这使能用于下一个参与线程的关键代码段的执行。屏障调度单元430继续按逻辑顺序唤醒每个参与线程直到最后的参与线程到达底屏障为止。当最后的参与线程到达底屏障时,屏障调度单元430可以配置为检查迟抵达的线程,并且在确认所有参与线程具有被设置的完成标志之后,屏障的执行是完整的并且屏障调度单元430更新线程状态510以指示所有参与线程清醒。当针对下一个参与线程的搜索失败时,屏障调度单元430可以确定最后的参与线程已经被调度。调度单元425更新屏障状态以指示屏障标识符是“空闲”,例如既非“静态”也非“动态”。
当至少一个迟抵达的参与线程已经加入急迫的屏障时,重新扫描标志被设置在屏障状态中。屏障调度单元430可以配置为当唤醒下一个参与线程时搜索迟抵达的线程。因为迟抵达的线程可能根据逻辑顺序是“乱序的”,所以屏障调度单元430可以按并非严格地是逻辑顺序的顺序唤醒参与线程。当最后的参与线程到达底屏障并且重新扫描标志被设置时,屏障调度单元430应该在更新屏障标识符状态之前检查迟抵达的参与线程以指示屏障标识符是空闲的。屏障调度单元430清除重新扫描标志,无论屏障调度单元430何时完结对搜索迟抵达的线程的重新扫描。
当屏障是急迫的有条件的屏障并且屏障标识符状态被从静态改变为动态时,调度单元425可以配置为使屏障标识符无效,以使得没有迟抵达的参与线程可以加入急迫的屏障。可以仅使被调度而不等待所有参与线程的急迫的有条件的屏障无效。在一个实施例中,当每个迟抵达的线程加入急迫的屏障时调度单元425对为有条件的屏障的屏障标识符所维护的计数进行更新,并且仅当计数不等于参考值和/或发生屏障超时时使屏障标识符无效,此时屏障标识符从动态转变为空闲。在又一个实施例中,屏障标识符不被无效并且如果任何其他参与线程到达屏障,则更新计数并且当计数等于参考值或屏障再次作为急迫的屏障被处理以调度参与线程的另一部分时调度单元425将屏障从静态转变为动态状态。
屏障调度单元430还可以配置为利用非阻塞式底屏障来调度排他的关键代码段和有序的关键代码段。屏障调度单元430通过首先等待任何其他关键代码段或排他的关键代码段的执行完结来调度参与排他的关键代码段的第一线程。调度用于排他的关键代码段的屏障用于排他的执行。排他的关键代码段可以是排他的有序的关键代码段或排他的无序的关键代码段。注意未参与屏障的线程可以与执行排他的关键代码段的线程同时执行。排他的关键代码段可以当在参与不同屏障的线程之间可能发生资源访问冲突时使用。
屏障调度单元430通过允许线程继续执行紧跟在底屏障之后的随后的指令而不等待所有参与线程执行关键代码段来利用非阻塞式底屏障来调度参与关键代码段的线程。一旦由屏障调度单元430更新用于参与线程的线程状态510以指示线程清醒,线程就在到达底屏障之后保持清醒。之后调度单元425能够调度已经完结关键代码段的执行的参与线程用于与当前正在执行关键代码段的一个其他参与线程同时执行。当所有参与线程已经到达底屏障时,屏障的执行是完整的并且屏障调度单元430更新屏障状态以指示屏障标识符既非“静态”也非“动态”。
在一个实施例中,调度单元425实施动态屏障记分板检查以确定是否可以在将第一指令输出到解码单元450之前发出第一指示。当第一指令与屏障标识符相关联时,调度单元425等待在以下情况下发出第一指令:当(静态或动态状态中的)屏障与第一指令相比具有相同的屏障标识符和不同的标签时或当(动态状态中的)屏障具有相同的标识符和相同的标签并且迟抵达的线程不被屏障标识符所接受时。
解码单元450从指令调度单元420接收要被分派的下一个指令。解码单元450实施指令的全解码并且将经解码的指令传送到分派单元470。另外,在一些实施例中,指令可以被双倍或四倍地发出并且解码单元450可以实现分开的解码逻辑用于每个所发出的指令。分派单元470实现FIFO并且将经解码的值写到本地寄存器堆304用于由执行单元302或加载/存储单元303执行。在同时发出多个指令的实施例中,分派单元470可以将每个指令发出到SM310的功能单元的不同部分。记分板单元480管理并且追踪每线程组已经被解码并且被分派的指令的数目。
图5B是根据本公开的一个示范性实施例的、图5A的调度单元425和屏障调度单元430的一部分的框图。线程屏障抵达追踪单元500更新用于被分配到CTA的每个屏障的屏障状态信息。如先前所解释的,屏障状态信息指示哪些屏障标识符是“静态”、“动态”或空闲(既非“静态”也非“动态”)并且包括用于每个屏障标识符的重新扫描标志,该重新扫描标志当至少一个迟抵达的参与线程已经加入急迫的屏障时被设置。当屏障标识符从“静态”转变为“动态”时,将屏障标识符和CTA标识符输出到FIFO505。随着参与屏障的CTA的每个线程到达屏障指令,调度单元425更新存储在线程状态510中的参与线程的状态以指示参与线程“休眠”。
当在屏障执行槽515中执行槽不可用时,FIFO505缓存动态屏障。在一个实施例中,屏障执行槽515包括16个槽,每个槽可以由一个动态屏障占用。当在屏障执行槽515中槽可用时,从FIFO505取出动态屏障并且将其插入到槽中。屏障仲裁单元520在占用屏障执行槽515的槽的不同动态屏障之间进行仲裁。可以由屏障仲裁单元520采用各种优先级方案以在不同动态屏障之间进行仲裁。屏障仲裁单元520为线程选择单元530提供动态屏障,可以由线程选择单元530从该动态屏障选择线程用于调度。
线程选择单元530按由与线程阵列(即分配到CTA的)中的每个线程相关联的逻辑标识符所指定的顺序选择线程。线程选择单元530访问屏障参与追踪信息532以确定哪些线程参与动态屏障。线程选择单元530访问线程状态510和屏障状态信息(未示出)以标识任何迟抵达的参与线程。
并非被分配到CTA的一个或多个线程块中的所有线程都一定参与由CTA所使用的每个屏障。如先前所解释的,屏障由屏障标识符指定并且每个线程指示它是否参与屏障之一。线程选择单元530在屏障的处理期间标识参与线程一次并且之后继续选择每个参与线程用于串行执行。线程选择单元530在选择过程期间跳过非参与线程。当屏障是急迫的时,在选择过程期间线程选择单元530跳过非参与线程和尚未抵达屏障处的线程(或如果迟抵达的线程不能加入屏障则当屏障变成动态时未抵达的线程)。
在为特定屏障选择第一线程用于执行之前,线程选择单元530确定屏障是否是描绘排他的关键代码段的排他屏障。如果屏障是排他的,那么线程选择单元530确定是否任何其他的线程阵列正在执行关键代码段或排他的关键代码段,并且如果是,则线程选择单元530在为排他屏障选择第一线程用于执行之前等待直到那些线程阵列中的线程完结执行为止。在一个实施例中,在动态屏障占用屏障执行槽515中的槽时FIFO505不取出排他屏障,并且在排他屏障占用屏障执行槽515中的槽时FIFO505不取出屏障。
线程选择单元530可以基于参与线程生成执行掩码。参与线程指定与随屏障指令所提供的屏障标识符匹配的屏障标识符。当允许迟抵达的线程加入屏障时,线程选择单元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执行的线程同时被调度用于执行。可以为不同的屏障标识符指定调度优先级并且使用屏障指令所描绘的纹理加载指令可以或可以不利用高于其他屏障的优先级被调度。
图6A示出了根据本公开的一个实施例的、用于基于逻辑标识符调度指令用于执行的方法的流程图600。尽管结合图1、2、3A-3C、5A和5B的系统描述了该方法步骤,但是本领域普通技术人员将理解配置为以任何顺序实施该方法步骤的任何系统均在本公开的范围内。
方法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中的所有参与线程在允许任何参与线程执行关键代码段之前到达屏障指令。
当屏障是急迫的屏障时,调度单元425不需要在允许参与线程的一部分被调度用于执行之前等待所有参与线程到达屏障指令。因此,在步骤621,调度单元425确定线程是否参与其状态已经从静态转变为动态的急迫的屏障,以及是否允许迟抵达的线程加入屏障。换言之,调度单元425确定线程是否是可以加入急迫的屏障的迟抵达的线程,并且如果线程是可以加入急迫的屏障的迟抵达的线程,则在步骤625,调度单元425为急迫的屏障设置重新扫描标志。将已经为迟抵达的线程清除完成标志。之后屏障调度单元430将检测并且能够选择迟抵达的线程用于调度。如果在步骤621,调度单元425确定线程是可以不加入急迫的屏障的迟抵达的线程,那么调度单元425前进至步骤622。当屏障不是急迫的屏障时,调度单元425还将前进至步骤622。在一个实施例中,屏障的记分板可以用来指示急迫的屏障是否正在接受迟抵达的线程。
在步骤622,调度单元425根据可以用来确定成员完整的各种不同条件来确定成员是否完整,并且如果并非完整,则在步骤658,已经到达屏障的参与线程保持休眠,而调度单元425继续程序的执行。否则,在前进至步骤655之前,调度单元425将屏障的状态从“静态”更新为“动态”并且将线程的屏障标识符和CTA标识符输出到屏障调度单元430。
在步骤655,屏障调度单元430选择参与线程用于执行。当所有参与线程已经完结关键代码段的执行时,程序执行在步骤658继续。结合图6B描述步骤655的附加细节。在一个实施例中,如果屏障变成“悬挂”使得线程不能被执行,则屏障可以用与被无效的屏障可被重置的相同方式即经由特殊的指令被重置。
在一个实施例中,有条件的屏障用来使在屏障指令处的参与线程的执行同步,并且在步骤620,用于每个参与线程的线程状态被设置为休眠并且当在步骤622成员完整时,调度单元425将屏障的状态从“静态”更新为“动态”并且将存储在线程状态510中的所有参与线程的状态更新为“清醒”。在步骤655,之后参与线程(或当有条件的屏障被急迫地调度时参与线程的一部分)继续程序的执行并且屏障调度单元430将屏障的状态更新为既非“静态”也非“动态”,即指示对于线程的至少一部分来说该屏障的执行是完整的。
图6B示出了根据本公开的一个实施例的、用于实施图6A所示的步骤655的方法。尽管结合图1、2、3A-3C、5A和5B的系统描述了该方法步骤,但是本领域普通技术人员将理解配置为以任何顺序实施该方法步骤的任何系统均在本公开的范围内。
在步骤630,屏障调度单元430基于与参与屏障的线程相关联的逻辑标识符选择线程用于执行。将所选择的线程的状态从“休眠”更新为“清醒”,以使得线程有资格执行。结合图6C描述步骤630的附加细节。当重新扫描标志被设置时,屏障调度单元430检测任何迟抵达的线程并且可以选择线程用于与逻辑标识符相比失序地执行。更具体地,当屏障调度单元430调度“最后的”线程并且重新扫描标志被设置时,屏障调度单元430重新扫描执行掩码,其忽略具有被设置的“完成”标志的线程,并且调度任何迟抵达的线程。
在步骤635,关键代码段内的指令由分派单元470分派并且被执行用于所选择的线程。在步骤636,调度单元312接收与屏障标识符相关联的底屏障指令并且更新线程的状态以设置完成标志。在步骤638,调度单元312确定底屏障指令是否是阻塞式底屏障指令。当在步骤638调度单元312确定底屏障指令是阻塞式时,那么在步骤640,屏障调度单元430确定参与屏障的另一个线程是否需要执行关键代码段。如果另一个线程需要执行关键代码段,那么在步骤643,屏障调度单元430更新已经到达底屏障指令的线程的状态,将其从“清醒”更新为“休眠”,以使得线程没有资格执行。否则,在步骤650,屏障调度单元430在前进至步骤652之前更新线程状态510以指示参与屏障的所有线程是“清醒”的。
如果在步骤638底屏障指令不是阻塞式底屏障指令,那么在步骤642,屏障调度单元430确定参与屏障的另一个线程是否需要执行关键代码段。如果另一个线程需要执行关键代码段,则屏障调度单元430返回步骤630。否则,在步骤652,屏障调度单元430从屏障执行槽515中的执行槽移除屏障和CTA标识符并且更新屏障的状态以指示屏障既非“静态”也非“动态”。在该点处,当屏障是急迫的屏障时,如果屏障不描绘关键代码段(即屏障是有条件的屏障时),调度单元425可以使屏障标识符无效,以使得迟抵达的线程可不再加入屏障。
之后调度单元425前进以继续程序的执行。在用于一个CTA屏障的关键代码段的执行期间,同一CTA的其他屏障的其他线程以及其他CTA的线程屏障还可以继续其他代码的执行。然而,如果屏障是排他的,则仅不包括在关键代码内的程序指令可以被执行用于其他屏障。
图6C示出了根据本公开的一个实施例的、用于实施图6A所示的步骤630的方法。尽管结合图1、2、3A-3C、5A和5B的系统描述了该方法步骤,但是本领域普通技术人员将理解配置为以任何顺序实施该方法步骤的任何系统均在本公开的范围内。
对于每个调度循环,步骤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随着每个先前的参与线程完结关键代码段的执行而高效地按逻辑顺序唤醒参与线程,并且更新执行掩码。在一个实施例中,为每个线程块计算执行掩码。当重新扫描标志被设置时,步骤670可以每循环实施一次以标识已经到达屏障的参与线程。
虽然以上已经描述了各种实施例,但是应该理解它们仅通过示例而非限制的方式进行了呈现。因此,优选实施例的宽度和范围不应该由以上所描述的示例性实施例所限制,而应该仅根据跟随的权利要求及其等同物被定义。
Claims (33)
1.一种方法,包括:
发起多个线程的执行以处理包括屏障指令的程序的指令;
对于所述多个线程中的每个线程,当在所述线程的执行期间所述线程到达所述屏障指令时确定所述线程是否参与所述屏障指令;以及
串行地执行参与所述屏障指令的所述线程中的每一个以处理跟随在所述屏障指令之后的所述程序的一个或多个指令。
2.如权利要求1所述的方法,进一步包括,在执行参与所述屏障指令的所述线程中的每一个之前,等待参与所述屏障指令的最后抵达线程,其中所述最后抵达线程相对于参与所述屏障指令的所述多个线程中的其他线程最后到达所述屏障指令。
3.如权利要求1所述的方法,进一步包括,在执行参与所述屏障指令的所述线程中的每一个之前,等待参与所述屏障指令的所述线程的一部分到达所述屏障指令并且等待允许作为急迫的屏障来调度所述屏障指令的条件被满足。
4.如权利要求3所述的方法,进一步包括,在参与所述屏障指令的所述线程中的每一个的执行期间:
将附加线程标识为参与所述屏障指令并且不包括在所述线程的所述部分中的迟抵达线程;以及
执行所述附加线程以处理跟随在所述屏障指令之后的所述程序的所述一个或多个指令。
5.如权利要求3所述的方法,进一步包括,在执行参与所述屏障指令的所述线程的所述部分中的所述线程中的每一个之后,使与所述屏障指令相对应的屏障标识符无效。
6.如权利要求3所述的方法,其中允许作为急迫的屏障来调度所述屏障指令的所述条件包括参与所述屏障指令的所述线程的所述部分包括大于最小数目的线程的若干线程。
7.如权利要求3所述的方法,其中允许作为急迫的屏障来调度所述屏障指令的所述条件包括超时到期。
8.如权利要求1所述的方法,其中所述屏障指令描绘关键代码段。
9.如权利要求8所述的方法,进一步包括,在选择另一个线程执行所述关键代码段之前等待第一线程执行所述关键代码段内的全部指令。
10.如权利要求1所述的方法,进一步包括将所述线程与被映射到物理标识符的逻辑标识符相关联,其中所述物理标识符在所述线程的执行期间由多线程处理核心引用。
11.如权利要求10所述的方法,其中执行参与所述屏障指令的所述线程中的每一个包括基于所述逻辑标识符选择所述线程用于串行执行。
12.如权利要求1所述的方法,进一步包括将标签附加到与所述屏障指令相对应的屏障标识符以当所述屏障标识符用在所述程序中的多个地方时唯一地标识所述屏障指令的每次出现。
13.一种处理子系统,包括:
指令调度单元,其配置为:
接收程序的指令用于由多个线程执行,其中所述程序包括屏障指令;
当在每个线程的执行期间所述线程到达所述屏障指令时,确定所述线程是否参与所述屏障指令;以及
使能参与所述屏障指令的所述线程被选择用于执行;以及
多线程处理核心,其配置为串行地执行参与所述屏障指令的所述线程中的每一个以处理跟随在所述屏障指令之后的所述程序的一个或多个指令。
14.如权利要求13所述的处理子系统,其中所述指令调度单元进一步配置为,在使能参与所述屏障指令的所述线程中的每一个之前,等待参与所述屏障指令的最后抵达线程,其中所述最后抵达线程相对于参与所述屏障指令的所述多个线程中的其他线程最后到达所述屏障指令。
15.如权利要求13所述的处理子系统,其中所述指令调度单元进一步配置为,在使能参与所述屏障指令的所述线程中的每一个之前,等待参与所述屏障指令的所述线程的一部分到达所述屏障指令,其中所述部分包括大于或等于最小数目的线程的若干线程。
16.如权利要求15所述的处理子系统,其中所述指令调度单元进一步配置为,在参与所述屏障指令的所使能线程的所述执行期间:
将附加线程标识为参与所述屏障指令的迟抵达线程;以及
使能所述附加线程被选择用于执行。
17.如权利要求15所述的处理子系统,其中所述指令调度单元进一步配置为,在执行参与所述屏障指令的所述线程的所述部分中的每个线程之后,使与所述屏障指令相对应的屏障标识符无效。
18.如权利要求13所述的处理子系统,其中所述屏障指令描绘关键代码段。
19.如权利要求18所述的处理子系统,其中所述指令调度单元进一步配置为,在选择另一个线程执行所述关键代码段之前等待第一线程执行所述关键代码段内的全部指令。
20.如权利要求13所述的处理子系统,其中所述线程与被映射到物理标识符的逻辑标识符相关联,并且其中所述物理标识符在参与所述屏障指令的所述线程的执行期间由所述多线程处理核心引用。
21.如权利要求20所述的处理子系统,其中所述指令调度单元进一步配置为基于所述逻辑标识符选择参与所述屏障指令的所述线程用于串行执行。
22.一种方法,包括:
发起多个线程的执行以处理包括屏障指令的程序的指令;
等待所述多个线程中的所述线程的一部分到达所述屏障指令,其中所述部分包括大于最小数目的线程并且小于所述多个线程中的所述线程的全部的若干线程;以及
串行地执行所述部分中的所述线程中的每一个以处理跟随在所述屏障指令之后的所述程序的一个或多个指令。
23.如权利要求22所述的方法,进一步包括,在所述部分中的所述线程中的每一个的执行期间:
将到达所述屏障指令的附加线程标识为迟抵达线程;以及
执行所述附加线程以处理跟随在所述屏障指令之后的所述程序的所述一个或多个指令。
24.如权利要求22所述的方法,进一步包括,在执行所述部分中的所述线程中的每一个之后,使与所述屏障指令相对应的屏障标识符无效。
25.如权利要求22所述的方法,进一步包括,在执行所述部分中的所述线程中的每一个之后,串行地执行至少一个附加线程以处理跟随在所述屏障指令之后的所述程序的所述一个或多个指令。
26.一种处理子系统,包括:
指令调度单元,其配置为:
接收程序的指令用于由多个线程执行,其中所述程序包括屏障指令;
等待所述多个线程中的所述线程的一部分到达所述屏障指令,其中所述部分包括大于最小数目的线程并且小于所述多个线程中的所述线程的全部的若干线程;以及
使能所述部分中的所述线程被选择用于执行;以及
多线程处理核心,其配置为串行地执行参与所述屏障指令的所述线程中的每一个以处理跟随在所述屏障指令之后的所述程序的一个或多个指令。
27.如权利要求26所述的处理子系统,其中所述指令调度单元进一步配置为,在所述部分中的所使能的线程的所述执行期间:
将到达所述屏障指令的附加线程标识为迟抵达线程;以及
使能所述附加线程被选择用于执行。
28.一种方法,包括:
发起多个线程的执行以处理包括屏障指令的程序的指令;
对于所述多个线程中的每个线程,当在所述线程的执行期间所述线程到达所述屏障指令时确定所述线程是否参与所述屏障指令;以及
在参与所述屏障指令的所述线程的全部已经到达所述屏障指令之后,执行参与所述屏障指令的所述线程中的每一个以处理跟随在所述屏障指令之后的所述程序的一个或多个指令。
29.如权利要求28所述的方法,其中当每个线程到达所述屏障指令时,参与所述屏障指令的所述线程更新为休眠状态。
30.如权利要求28所述的方法,其中当参与所述屏障指令的所述线程的全部已经到达所述屏障指令时,参与所述屏障指令的每个线程更新为清醒状态。
31.如权利要求28所述的方法,进一步包括将标签附加到与所述屏障指令相对应的屏障标识符以当所述屏障标识符用在所述程序中的多个地方时唯一地标识所述屏障指令的每次出现。
32.如权利要求28所述的方法,进一步包括当不参与所述屏障指令的至少一个线程到达所述屏障指令时,继续所述至少一个线程的执行。
33.一种处理子系统,包括:
指令调度单元,其配置为:
接收程序的指令用于由多个线程执行,其中所述程序包括屏障指令;
当在所述线程的执行期间每个线程到达所述屏障指令时,确定所述线程是否参与所述屏障指令;以及
使能参与所述屏障指令的所述线程被选择用于执行;以及
多线程处理核心,其配置为在参与所述屏障指令的所述线程的全部到达所述屏障指令之后,执行参与所述屏障指令的所述线程中的每一个以处理跟随在所述屏障指令之后的所述程序的一个或多个指令。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US13/794,578 US9448803B2 (en) | 2013-03-11 | 2013-03-11 | System and method for hardware scheduling of conditional barriers and impatient barriers |
US13/794,578 | 2013-03-11 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN104050032A true CN104050032A (zh) | 2014-09-17 |
Family
ID=51385449
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310745800.1A Pending CN104050032A (zh) | 2013-03-11 | 2013-12-30 | 用于有条件的屏障和急迫的屏障的硬件调度的系统和方法 |
Country Status (4)
Country | Link |
---|---|
US (1) | US9448803B2 (zh) |
CN (1) | CN104050032A (zh) |
DE (1) | DE102013114351A1 (zh) |
TW (1) | TW201435734A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107077384A (zh) * | 2014-11-13 | 2017-08-18 | Arm 有限公司 | 上下文敏感的屏障指令的执行 |
CN109997112A (zh) * | 2016-11-28 | 2019-07-09 | Arm有限公司 | 数据处理 |
Families Citing this family (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9442755B2 (en) | 2013-03-15 | 2016-09-13 | Nvidia Corporation | System and method for hardware scheduling of indexed barriers |
US9519944B2 (en) * | 2014-09-02 | 2016-12-13 | Apple Inc. | Pipeline dependency resolution |
US10671426B2 (en) | 2016-11-28 | 2020-06-02 | Arm Limited | Data processing |
US10552212B2 (en) | 2016-11-28 | 2020-02-04 | Arm Limited | Data processing |
US10394641B2 (en) * | 2017-04-10 | 2019-08-27 | Arm Limited | Apparatus and method for handling memory access operations |
US10558418B2 (en) * | 2017-07-27 | 2020-02-11 | Advanced Micro Devices, Inc. | Monitor support on accelerated processing device |
US11107263B2 (en) * | 2018-11-13 | 2021-08-31 | Intel Corporation | Techniques to manage execution of divergent shaders |
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 |
GB2597078B (en) * | 2020-07-14 | 2022-07-13 | Graphcore Ltd | Communication between host and accelerator over network |
US20230205608A1 (en) * | 2021-12-27 | 2023-06-29 | Advanced Micro Devices, Inc. | Hardware supported split barrier |
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 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070113232A1 (en) * | 2005-11-10 | 2007-05-17 | Collard Jean-Francois C P | Program thread syncronization |
US20110078417A1 (en) * | 2009-09-25 | 2011-03-31 | Brian Fahs | Cooperative thread array reduction and scan operations |
US20120158886A1 (en) * | 2010-12-15 | 2012-06-21 | International Business Machines Corporation | Behavior based client selection for disparate treatment |
CN102648449A (zh) * | 2009-09-29 | 2012-08-22 | 辉达公司 | 用于并行处理单元的陷阱处理器架构 |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7669203B2 (en) | 2003-12-19 | 2010-02-23 | Intel Corporation | Virtual multithreading translation mechanism including retrofit capability |
WO2008129786A1 (ja) * | 2007-04-09 | 2008-10-30 | Panasonic Corporation | マルチプロセッサ制御装置、その制御方法および集積回路 |
US7941791B2 (en) * | 2007-04-13 | 2011-05-10 | Perry Wang | Programming environment for heterogeneous processor resource integration |
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 |
US8423750B2 (en) | 2010-05-12 | 2013-04-16 | International Business Machines Corporation | Hardware assist thread for increasing code parallelism |
US9158595B2 (en) * | 2012-10-25 | 2015-10-13 | Nvidia Corporation | Hardware scheduling of ordered critical code sections |
US9442755B2 (en) | 2013-03-15 | 2016-09-13 | Nvidia Corporation | System and method for hardware scheduling of indexed barriers |
-
2013
- 2013-03-11 US US13/794,578 patent/US9448803B2/en active Active
- 2013-11-25 TW TW102142872A patent/TW201435734A/zh unknown
- 2013-12-18 DE DE102013114351.2A patent/DE102013114351A1/de active Pending
- 2013-12-30 CN CN201310745800.1A patent/CN104050032A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070113232A1 (en) * | 2005-11-10 | 2007-05-17 | Collard Jean-Francois C P | Program thread syncronization |
US20110078417A1 (en) * | 2009-09-25 | 2011-03-31 | Brian Fahs | Cooperative thread array reduction and scan operations |
CN102648449A (zh) * | 2009-09-29 | 2012-08-22 | 辉达公司 | 用于并行处理单元的陷阱处理器架构 |
US20120158886A1 (en) * | 2010-12-15 | 2012-06-21 | International Business Machines Corporation | Behavior based client selection for disparate treatment |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107077384A (zh) * | 2014-11-13 | 2017-08-18 | Arm 有限公司 | 上下文敏感的屏障指令的执行 |
CN107077384B (zh) * | 2014-11-13 | 2020-11-17 | Arm 有限公司 | 上下文敏感的屏障指令的执行 |
CN109997112A (zh) * | 2016-11-28 | 2019-07-09 | Arm有限公司 | 数据处理 |
CN109997112B (zh) * | 2016-11-28 | 2023-08-18 | Arm有限公司 | 数据处理 |
Also Published As
Publication number | Publication date |
---|---|
US9448803B2 (en) | 2016-09-20 |
DE102013114351A1 (de) | 2014-09-11 |
TW201435734A (zh) | 2014-09-16 |
US20140258693A1 (en) | 2014-09-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104050033A (zh) | 用于有索引的屏障的硬件调度的系统和方法 | |
CN104050032A (zh) | 用于有条件的屏障和急迫的屏障的硬件调度的系统和方法 | |
US8639882B2 (en) | Methods and apparatus for source operand collector caching | |
CN103365631B (zh) | 用于存储器访问的动态库模式寻址 | |
CN103309786B (zh) | 用于在非可抢占式图形处理单元上交互调试的方法和装置 | |
US9158595B2 (en) | Hardware scheduling of ordered critical code sections | |
US10255228B2 (en) | System and method for performing shaped memory access operations | |
US10007527B2 (en) | Uniform load processing for parallel thread sub-sets | |
CN103207774B (zh) | 用于解决线程发散的方法和系统 | |
CN103226463A (zh) | 用于使用预解码数据调度指令的方法和装置 | |
CN103729167A (zh) | 用于改进多线程处理单元中的性能的技术 | |
CN103777926A (zh) | 多线程处理单元中的高效存储器虚拟化 | |
CN103778072A (zh) | 多线程处理单元中的高效存储器虚拟化 | |
CN103279379A (zh) | 用于在没有指令解码的情况下调度指令的方法和装置 | |
US9069609B2 (en) | Scheduling and execution of compute tasks | |
CN103425533A (zh) | 用于管理嵌套执行流的方法和系统 | |
CN103294753A (zh) | 无锁先入先出 | |
CN103559088A (zh) | 维持公平性和顺序的资源管理子系统 | |
CN103559014A (zh) | 用于处理嵌套流事件的方法和系统 | |
CN103885893A (zh) | 用于访问内容寻址存储器的技术 | |
CN103885902A (zh) | 用于经由纹理硬件实施存储器访问操作的技术 | |
CN103176848A (zh) | 计算工作分布参考计数器 | |
CN103294536A (zh) | 控制用于处理任务的工作分布 | |
CN103197955A (zh) | 处理系统中动态生成的任务的信令、排序和执行 | |
CN103870309A (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 |