CN103870246A - 用于线程的simd执行的编译器控制区调度 - Google Patents

用于线程的simd执行的编译器控制区调度 Download PDF

Info

Publication number
CN103870246A
CN103870246A CN201310666892.4A CN201310666892A CN103870246A CN 103870246 A CN103870246 A CN 103870246A CN 201310666892 A CN201310666892 A CN 201310666892A CN 103870246 A CN103870246 A CN 103870246A
Authority
CN
China
Prior art keywords
district
thread
branch
instruction
control flow
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
Application number
CN201310666892.4A
Other languages
English (en)
Inventor
格雷戈里·迪亚蒙斯
穆杰塔巴·梅哈拉
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nvidia Corp
Original Assignee
Nvidia Corp
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Nvidia Corp filed Critical Nvidia Corp
Publication of CN103870246A publication Critical patent/CN103870246A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30076Arrangements for executing specific machine instructions to perform miscellaneous control operations, e.g. NOP
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/453Data distribution
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3851Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution from multiple instruction streams, e.g. multistreaming

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Multimedia (AREA)
  • Devices For Executing Special Programs (AREA)
  • Advance Control (AREA)

Abstract

用于调度线程以执行程序的不同区的编译器控制技术。编译器分析程序代码以确定用于程序代码的控制流图。控制流图包含区和区之间的有向边。区与执行优先级相关联。有向边指示程序控制流的方向。每个区具有线程边界,其包含一个或多个区。编译器在区的结束处插入一个或多个更新断言掩码变量指令。编译器还在区的结束处插入一个或多个条件句分支指令。条件句分支指令按照区的线程边界中的区的执行优先级顺序来布置,以强制运行时区的执行优先级。

Description

用于线程的SIMD执行的编译器控制区调度
技术领域
本发明总体涉及并行计算,并且更具体地涉及用于线程的SIMD(单指令多数据)执行的编译器控制区调度。
背景技术
单指令多数据(SIMD)处理器是执行指令集的处理器,指令集的每个指令针对多个不同的数据值同时进行操作。为SIMD处理器所写的应用程序可以逻辑上分为“线程束(warp)”,其中每个线程束是在SIMD处理器上合作并同时执行的“线程”组。通常,线程束中的每个线程针对不同的数据值执行指令,但是和线程束中的其他线程一样执行相同指令。
线程束中的线程的执行可以发散。如果程序指令指示线程束中的一个或多个线程采用第一路径,而线程束中的一个或多个其他线程采用第二路径,那么线程束中的线程发散。线程发散可能因为多种原因而发生。例如,因为线程束中条件句分支的可能性,其中基于分支条件的结果每个线程可以分支或者可以不分支,以及因为分支条件的评估可以基于对于每个线程可以是不同的数据值,所以评估分支条件的线程可以得到不同的分支条件结果并且可能发散。本文中这样的发散的执行可以称为“发散的控制流”。
因为线程束中的所有线程一般执行相同的指令,所以具有发散的控制流的程序的执行涉及在每个线程流到的所有控制流路径上的执行。以这样的方式在所有控制流路径上的执行可能涉及执行低效(execution down)多路径,其中一些线程是“激活的”(当前执行),而其他线程是“非激活的”(等待执行)。执行低效多路径可能造成(并且一般确实造成)整个线程束的执行时间大于用于任何一个单个线程的执行时间。存在用于确定在哪个时间应该执行哪些发散的线程的技术。然而,一些存在的技术可能与经优化的流不相关,可能没有有效地调度线程或者可能不确保提早重新汇聚线程。
如上所述,需要更有效的技术,用于管理贯穿程序的不同区的线程束中的线程的执行。
发明内容
本发明的一个实施例阐述了用于修改程序代码以调度线程来执行程序的不同的区的方法。方法包括以下步骤:分析基于程序代码并且包括多个区的控制流图,其中每个区代表程序代码的一部分、每个区被指派执行优先级并且每个区具有包含一个或多个线程边界区的线程边界;在包括在多个区中的第一区的结束处插入一个或多个更新断言掩码变量指令(updatepredicate mask variable instruction);以及在第一个分区的结束处插入一个或多个条件句分支指令,其布置为反映第一区的线程边界中的一个或多个线程边界的执行优先级。
所公开的技术的优点之一在于,所公开的技术可以用于确定哪些线程在什么时间应该执行程序的哪些区。另一个优点在于,所公开的技术使得线程能够在早期重新汇聚。
附图说明
因此,可以详细地理解本发明的上述特征,并且可以参考实施例得到对如上面所简要概括的本发明更具体的描述,其中一些实施例在附图中示出。然而,应当注意的是,附图仅示出了本发明的典型实施例,因此不应被认为是对其范围的限制,本发明可以具有其他等效的实施例。
图1是示出了配置为实现本发明的一个或多个方面的计算机系统的框图;
图2是根据本发明的一个实施例的、用于图1的计算机系统的并行处理子系统的框图;
图3是根据本发明的一个实施例的、图2的通用处理集群内的流多处理器的一部分的框图;
图4是根据本发明一个实施例的、用于提供指令以调度线程用于执行程序的不同区的方法步骤的流程图;
图5A是根据本发明一个实施例的、阐述程序的不同区的经优先化的执行的控制流图;
图5B是根据本发明一个实施例的、示范性断言掩码变量的概念图;
图5C是根据本发明一个实施例的、包括掩码更新指令和控制流转移指令的检查框的示范性布局的概念图;
图6是根据本发明一个实施例的、用于插入指令以更新断言掩码变量的方法步骤的流程图;以及
图7是根据本发明一个实施例的、用于确定将要插入程序的程序代码中的检查和条件句分支指令的方法步骤的流程图。
具体实施方式
在下面的描述中,将阐述大量的具体细节以提供对本发明更透彻的理解。然而,本领域的技术人员应该清楚,本发明可以在没有一个或多个这些具体细节的情况下得以实施。在其他实例中,未描述公知特征以避免对本发明造成混淆。
系统概述
图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的图形子系统,显示设备110可以是任何常规的阴极射线管、液晶显示器、发光二级管显示器等。系统盘114也连接到I/O桥107并可以配置为存储内容、应用程序和数据,由CPU102和并行处理子系统112使用。系统盘114提供用于应用程序和数据的非易失性存储,并且可以包括固定的或者可移动的硬盘驱动器、闪存设备和CD-ROM(光盘只读存储器)、DVD-ROM(数字通用光盘-ROM)、蓝光光盘、HD-DVD(高清DVD)或者其他磁的、光的或固态存储设备。
交换器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)。
编译器101可以嵌入在设备驱动程序103中。编译器101根据并行处理子系统112的执行的需要来对程序指令进行编译。在这样的编译期间,编译器101可以在编译的各个阶段将变换应用到程序指令。在本发明的另一个实施例中,编译器101可以是独立的应用程序。
应该理解,本文所示系统是示例性的,并且变化和修改都是可能的。连接拓扑,包括桥的数目和布置、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。这些PPU202可以是同样的或不同的,并且每个PPU202可具有一个或多个专用并行处理存储器设备或不具有专用并行处理存储器设备。并行处理子系统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执行。
图3是根据本发明的一个实施例的、图2的GPC208内的流多处理器(SM)310的框图。每个GPC208可配置为并行执行大量线程,其中术语“线程”是指在特定输入数据集上执行的特定程序的实例。在一些实施例中,单指令、多数据(SIMD)指令发出技术用于在不提供多个独立指令单元的情况下支持大量线程的并行执行。在其他实施例中,单指令、多线程(SIMT)技术用于使用配置为向GPC208中的每一个内的处理引擎集发出指令的公共指令单元来支持大量一般来说同步的线程的并行执行。不同于所有处理引擎通常都执行同样指令的SIMD执行机制,SIMT执行通过给定线程程序允许不同线程更容易跟随分散执行路径。本领域普通技术人员应该理解SIMD处理机制代表SIMT处理机制的功能子集。
经由将处理任务分布到一个或多个流多处理器(SMs)310的管线管理器(未示出)来有利地控制GPC208的操作,其中每个SM310配置为处理一个或多个线程组。每个SM310包括指令L1高速缓存370,其配置为经由GPC208内的L1.5高速缓存(未示出)接收指令和常数。线程束调度器和指令单元312从指令L1高速缓存370接收指令和常数,并且根据指令和常数来控制本来寄存器堆304和SM310功能单元。SM310功能单元包括N个exec(执行或处理)单元302和P个加载-存储单元(LSU)303。如本领域已知的,SM功能单元可以是管线化的,允许在前一个指令完成之前发出新指令。可提供功能执行单元的任何组合。在一个实施例中,功能单元支持各种各样的操作,包括整数和浮点运算(例如加法和乘法)、比较操作、布尔操作(AND、OR、XOR)、移位和各种代数函数的计算(例如平面插值、三角函数、指数函数和对数函数等等);以及相同功能单元硬件可均衡地用来实施不同的操作。
如本文之前所定义的,传送到特定GPC208的一系列指令构成线程,并且跨SM310内的并行处理引擎(未示出)的某一数目的并发执行线程的集合在本文中称为“线程束(warp)”或“线程组”。如本文所使用的,“线程组”是指对不同输入数据并发执行相同程序的一组线程,所述组的一个线程被指派到SM310内的不同处理引擎。线程组可以包括比SM310内的处理引擎数目少的线程,在这种情况下一些处理引擎将在该线程组正在被处理的周期期间处于闲置状态。线程组还可以包括比SM310内的处理引擎数目多的线程,在这种情况下处理将在连续的时钟周期内发生。因为每个SM310可以并发支持多达G个线程组,结果是在包括M个流多处理器310的GPC208中,在任何给定时间在GPC208中可以执行多达G*M个线程组的系统。
此外,多个相关线程组可以在SM310内同时活动(在执行的不同阶段)。该线程组集合在本文中称为“协作线程阵列”(“CTA”)或“线程阵列”。特定CTA的大小等于m*k,其中k是线程组中并发执行线程的数目并且通常是SM310内的并行处理引擎数目的整数倍,以及m是SM310内同时活动的线程组的数目。CTA的大小一般由编程者以及可用于CTA的硬件资源诸如存储器或寄存器的容量来确定。
在本发明的实施例中,使用计算系统的PPU202或其他处理器来使用线程阵列执行通用计算是可取的。为线程阵列中的每个线程指派在线程的执行期间对于线程可访问的唯一的线程标识符(“线程ID”)。可被定义为一维或多维数值的线程ID控制线程处理行为的各方面。例如,线程ID可用于确定线程将要处理输入数据集的哪部分和/或确定线程将要产生或写输出数据集的哪部分。
每线程指令序列可包括定义线程阵列的代表性线程和一个或多个其他线程之间的协作行为的至少一个指令。例如,每线程指令序列可能包括在序列中的特定点处挂起用于代表性线程的操作执行直到诸如其他线程的一个或多个到达该特定点的时间为止的指令、用于代表性线程将数据存储在其他线程的一个或多个有权访问的共享存储器中的指令、用于代表性线程原子地读取和更新存储在其他线程的一个或多个基于它们的线程ID有权访问的共享存储器中的数据的指令等等。CTA程序还可以包括计算数据将从其读取的共享存储器中的地址的指令,该地址是线程ID的函数。通过定义合适的函数并提供同步技术,可以以可预测的方式由CTA的一个线程将数据写入共享存储器中的给定位置并由同一个CTA的不同线程从该位置读取数据。因此,数据在线程之间共享的任何期望模式可以得到支持,以及CTA中的任何线程可以与同一个CTA中的任何其他线程共享数据。如果存在数据在CTA的线程之间的共享,则其范围由CTA程序确定;因此,应该理解的是,在使用CTA的特定应用中,CTA的线程可能会或可能不会真正互相共享数据,这取决于CTA程序,术语“CTA”和“线程阵列”在本文作为同义词使用。
SM310提供具有不同级别的可访问性的片上(内部)数据存储。特殊寄存器(未示出)对于LSU303可读但不可写并且用于存储定义每个线程的“位置”的参数。在一个实施例中,特殊寄存器包括每线程(或SM310内的每exec单元302)一个的存储线程ID的寄存器;每个线程ID寄存器仅由各自的exec单元302可访问。特殊寄存器还可以包括附加寄存器,其对于执行由TMD所代表的同一个处理任务的所有线程(或由所有LSU303)可读,其存储CTA标识符、CTA维数、CTA所属网格(grid)的维数(或队列位置,如果TMD编码队列任务而不是网格任务的话)、以及CTA被指派到的TMD的标识符。
如果TMD是网格TMD,则TMD的执行会启动和执行固定数目的CTA以处理存储在队列中的固定量的数据。将CTA的数目指定为网格宽度、高度和深度的乘积。可以将固定量的数据存储在TMD中或TMD可以存储指向将由CTA所处理的数据的指针。TMD还存储由CTA所执行的程序的开始地址。
如果TMD是队列TMD,那么使用TMD的队列特点,这意味着将要被处理的数据量不一定是固定的。队列条目存储用于由指派到TMD的CTA所处理的数据。队列条目还可以代表在线程执行期间由另一个TMD所生成的子任务,从而提供嵌套并行性。通常线程或包括线程的CTA的执行被挂起直到子任务的执行完成。可以将队列存储在TMD中或与TMD分开存储,在该情况下TMD存储指向该队列的队列指针。有利地,当代表子任务的TMD正在执行时可以将由子任务所生成的数据写到队列。队列可以实现为循环队列以使得数据的总量不限于队列的大小。
属于网格的CTA具有指示网格内各自CTA的位置的隐含网格宽度、高度和深度参数。在初始化期间响应于经由前端212从设备驱动程序103所接收的命令来写特殊寄存器并且在处理任务的执行期间特殊寄存器不改变。前端212调度每个处理任务用于执行。每个CTA与具体TMD相关联用于一个或多个任务的并发执行。此外,单个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高速缓存320存储用于N个exec单元302和P个下载-存储单元LSU303的每个通道的一致值或常数值。
共享存储器306对于单个CTA内的线程可访问;换言之,共享存储器306中的任何位置对于同一个CTA内的任何线程(或对于SM310内的任何处理引擎)可访问。共享存储器306可以实现为具有允许任何处理引擎对共享存储器中的任何位置读取或写入的互连的共享寄存器堆或共享片上高速缓存存储器。在其他实施例中,共享状态空间可能映射到片外存储器的每CTA区上并被高速缓存在L1高速缓存320中。参数存储器可以实现为在实现共享存储器306的同一个共享寄存器堆或共享高速缓存存储器内的指定部分,或者实现为LSU303对其具有只读访问权限的分开的共享寄存器堆或片上高速缓存存储器。在一个实施例中,实现参数存储器的区域还用于存储CTA ID和任务ID,以及CTA和网格维数或队列位置,实现特殊寄存器的各部分。SM310中的每个LSU303耦连到统一地址映射单元352,统一地址映射单元352将为在统一存储器空间中所指定的加载和存储指令所提供的地址转换为每个各异存储器空间中的地址。因此,指令可以用于通过指定统一存储器空间中的地址来访问本地、共享或全局存储器空间中的任何一个。
每个SM310中的L1高速缓存320可以用于高速缓存私有的每线程本地数据还有每应用全局数据。在一些实施例中,可以将每CTA共享数据高速缓存在L1高速缓存320中。LSU303经由存储器和高速缓存互连380耦连到共享存储器306和L1高速缓存320。
应该理解本文所述的内核架构是示例性的并且变化和修改都是可能的。任何数目的处理单元例如SM310可以包括在GPC208内。进一步地,如图2所示,PPU202可以包括任何数目的GPC208,所述GPC208有利地在功能上彼此相似以使得执行行为不取决于哪个GPC208接收特定处理任务。进一步地,每个GPC208有利地使用分开且各异的处理单元、L1高速缓存来独立于其他GPC208操作以为一个或多个应用程序执行任务。
本领域普通技术人员应该理解图1-3所描述的架构决不限制本发明的范围并且在不脱离本发明范围的情况下本文所教导的技术可以在任何经适当配置的处理单元上实现,所述处理单元包括但不限于一个或多个CPU、一个或多个多核CPU、一个或多个PPU202、一个或多个GPC208、一个或多个图形或专用处理单元等等。
用于线程的SIMD执行的编译器控制区调度
如上所述,线程束是在SM310上执行的线程组。有时线程束可能发散,意味着线程束中的线程被指令为跟随不同的控制流路径。这些不同的控制流路径一般不能在SM310上同时执行。因此,在不同的时间执行不同的控制流路径。技术一般用于调度在不同控制流路径上执行的线程。本文所提供的技术是编译器控制技术,其修改程序代码以插入通过使用断言(选择性禁止线程的执行)和分支指令来调度线程的指令。断言和分支指令有助于实现通过程序的预确定的优先化控制流。
图4是根据本发明的一个实施例的、具有用于编译器101的步骤的方法400的流程图,编译器101将指令插入程序代码中以调度在不同的控制流路径上执行的线程。图4中所示的方法400的描述可以参照图5A-5C,其描绘了示范性控制流图500、示范性断言掩码变量520和示范性检查框510。虽然结合图1-3和5A-C来描述方法步骤,本领域技术人员应该理解,配置为以任何顺序实施方法步骤的任何系统均落入本发明范围内。贯穿本公开,编译器101描述为针对正被分析的区实施某些步骤。如贯穿本公开所使用的,符号“R”指正被分析的区,本文中也称之为“分析区”。
如所示,方法400开始于步骤402,其中如已知的,编译器101可以使用控制流分析来分析程序代码,以生成控制流图,诸如图5A所示的控制流图500。控制流图500概念性示出了用于包括程序中的特定指令序列的程序代码的控制流。
参考图5A,控制流图500包括一个或多个“区”,诸如具有执行边界504并且通过有向边506连接的区1-8502-1——502-8。控制流图是由线程在其执行期间通过程序可能穿过的所有路径的、使用图形符号的表示。基本框是具有一个入口点和一个出口点的有限指令序列。区是控制流图的相连的子图。区包含至少一个基本框。一起进入单个区502的线程通常不发散,至少直到其已经完成执行单个区502。如果在区502结束处出现发散的代码(诸如条件句分支指令),那么已经一起执行了区502的线程可能发散。例如在区1502-1的结束处线程的发散是可能的。如由有向边506-1和506-2所指示的,一些线程可以前往区2502-2,而其他线程可以前往区3502-3。一般而言,线程按照由有向边506-1——506-10的箭头所指示的方向前往。在控制流图500中的一些箭头诸如箭头506-1和506-2指示发散的路径的同时,其他箭头诸如506-9和506-10指示收敛的路径。从区域7502-7和4502-4两者离开的线程在区8502-8中汇聚。区可以有前任(predecessor)和后继者(successor)。如果有向边从第一区指向第二区,那么第一区是第二区的前任。另外,如果有向边从第二区指向第一区,那么第一区是第二区的后继者。在本文中前任和后继者还可以称为“前任区”和“后继区”。
优选地,区尽可能大。然而,如本领域已知的,由控制流分析所创建的区可能包括单个基本框,这可能比可取的小。为了从单个基本框创建大的区,通过汇聚分析来识别统一分支。随后选择并分析用于增大的区。如果是用于增大的区的前任的所有基本框都以统一分支结束并且是同一个区(称之为“前任区”)的所有部分,那么将前任区增加到用于增大的区。可以为所有区递归重复该增大过程,以获得大的区尺寸。优选地,图5A所描绘的控制流图500包括以该方式尽可能增大的区。
执行优先级504-1——504-8确定对区进行执行的顺序。在图5A所示的控制流图500中,较大的数字指示较高的执行优先级。换言之,如果提供抉择,那么具有较高的优先级的区中的线程在具有较低的优先级的区中的线程之前执行。因此,在图5A所示的示例中,如果存在等待执行具有优先级7的区2的线程,以及等待执行具有优先级6的区3的线程,那么等待执行区2的线程在等待执行区3的线程之前执行。可以使用任何常规的算法来确定控制流图中的区的执行优先级。
实现对区的执行优先级进行强制所需要的控制流,可能需要使用隐含分支诸如分支508-1——508-3。这些分支508通过在不一定是由原始程序代码链接在一起的区502之间提供路径,来确保区502按优先级顺序执行。例如,如果一些线程已经通过区2502-2,其刚才已经完成执行,但是存在等待执行区4502-4和区3502-3两者的一些线程,那么通常先执行区3502-3。然而,不存在从区2502-2到区3502-3的有向边。因此,隐含分支508-1可以用于从区2502-2转移控制到区3502-3。
返回参考图4,在步骤404,编译器101为每个区502确定线程边界。对于每个区,线程边界包括其中线程可能等待执行的所有区502,并且考虑图中的有向边506以及执行优先级506。本文中线程边界中的区502可以称为“线程边界区”。
例如,再参考图5A,在控制流图500的顶部,在区1502-1的开始处,线程边界不包括区。这是因为当线程正在执行区1时,任何线程都不可能已经到达任何其他区,如区1502-1是控制流图500开始的位置。然而在区1502-1的结束处,线程有可能前进到区2502-2或者区3502-3。因此,在区1的结束处的线程边界包括区2502-2和区3502-3。
在区2502-1的结束处,线程边界包括区4502-4、5502-5和3502-3。这是因为两个原因:由箭头506-3和506-4所指示的、在区2502-2的结束处的发散的控制流,以及由于区2-502的优先级504-2高于区3的优先级504-3因此一些线程可能等待执行区3502-3。因此,存在线程可能等待执行的三个地方:其中从区1502-1分支的线程可能等待的区3502-3,以及分支目标502-4和502-5。
继续示例,在区3502-3的结束处,线程边界包括区4502-4,5502-5,和6502-6,但是不包括区2502-2。不包括区2502-2是因为,其具有的比区3502-3的优先级(6)更高的优先级(7)。因此,在区3502-3的结束处,已经进入区2502-2的所有线程已经完成执行,并且不存在等待执行区2502-2的线程。然而,由于与包括区4502-4和5502-5的区2502-2的两个分支目标区相比,3502-3具有更高的优先级,因此一些线程可以在控制转移到区3503-3之前,从区2502-2流动区4502-4和5502-5,并且在线程正执行区3502-3时,可能存在等待执行区4502-4或者502-5的线程。此外,因为区6502-6是区3-502-3自己的分支目标,所以线程可以从区3502-3流到区6502-6并且因此线程可能等待执行区6506-6。因此,区3502-3的线程边界包括区4502-4、5502-5和6502-6。
跳过前面,用于区7502-7的线程边界包括区4502-4和8502-8。区4502-4包括在线程边界中是因为,可能存在从区2502-2分支等待执行区4502-4的线程。因为区4504-4具有优先级2,其低于具有优先级3的区7502-7的优先级,所以任何等待执行区4502-4的线程在区7502-2的执行之前仍没有机会执行。区8502-8是区7502-7的后继者,但其优先级低于区4502-4的优先级,因此线程也可能在区8502-8中等待。可以以任何已知的方法来确定线程边界。
返回参考图4,在步骤406,编译器101插入指令以将断言掩码变量初始化为0。断言掩码针对每个区存在并且指示哪些线程正在执行或者等待执行与断言掩码变量对应的区。具有值为0的断言掩码变量指示当前没有线程正在执行或者等待执行对应的区。当程序开始时,由于没有线程已经进入任何区,因此所有断言掩码变量都初始化为0。专用断言掩码变量“m”,本文也称之为当前区断言掩码,用来为当前正执行的区设置断言掩码。当控制流到新的区时,变量m设置为等于用于新的区的断言掩码变量,并且基于变量m来断言指令。
图5B是示范性断言掩码变量520A、520B的概念版本的例示。断言掩码变量520A、520B包括比特掩码,其具有与线程束中的线程数目相等的若干比特524A、524B。在图5B中,每个断言掩码变量520A、520B具有4个比特524A-1——524A-4、524B-1——524B-4。比特掩码中的每个比特代表线程束中的不同线程。因此,断言掩码变量520A、520B可以结合具有4个线程的线程束来使用。每个比特524与哪个线程对应的指示在图5B中利用文字“(Tx)”在每个比特的上方示出,其中“x”是识别线程的数字。
比特掩码中的值1意味着对应的线程当前正在执行或者等待执行对应的区,而值0意味着对应的线程当前没有在执行并且没有等待执行对应的区。
在图5B中,比特524A、524B的每个具有值522A-1——524A-4、522B-1——522B-4。当变量520A中的所有比特524A都设置为0时,变量520A代表其中没有线程正在执行或者等待执行的区。在变量520B中,比特522B-1和522B-4设置为0,而比特522B-2和522-3设置为1。因此,线程T2和T3当前正在执行或者等待执行由断言掩码变量520B代表的区,而线程T1和T4当前既没有正在执行也没有等待执行由断言掩码变量520B代表的区。
返回参考图4,在步骤407,编译器101在每个区的开始处插入指令,以将比特掩码变量“m”设置为等于用于对应区的断言掩码变量。比特掩码变量“m”包含关于哪些线程正在执行当前执行区的信息,并且以类似于图5B中所示的比特掩码变量520A和520B类似的格式摆放。具体地,m中的“1”指示出各自的线程正在执行当前执行区,而m中的“0”指示出各自的线程当前没有执行当前执行区。
在步骤408,编译器101对区进行分析,本文称为“分析区”或者参考为符号“R”,并且插入指令到图5A所示的、分析区R中的检查框510,以更新用于分析区R的后继者的、图5B所示的断言掩码变量520。在步骤408,插入指令到用于正被分析的、控制流图(诸如图5A中的控制流图500)中的所有区的检查框510(图5A所示)。
再参考图5A,区例如区2502-2的后继者包括,是区2-502-2的结束处的分支指令的目标的区,以及有向边506指示控制应该流到的任何区,但是不包括由隐含分支508指出的区。这是因为,分支508仅代表当前控制转移到在另一个区中等待的线程,但由于线程可能仅流过图中的有向边506,因此并不代表线程实际转移到该区。区2502-2的后继者包括区4502-4和5502-5,但不包括区3503-3。
仍参考图5A,检查框510存在于区502的结束处。图5C示出了示例性检查框510,其包括掩码更新指令530(以下针对步骤408对其描述),随后是控制流转移指令532(以下针对步骤410和412对其描述)。更新断言掩码变量520的指令(本文也称为“掩码更新指令”530)允许在运行时即程序执行期间更新断言掩码变量520。
返回参考图4,在步骤410和412,编译器101插入检查指令和条件句分支指令,条件句分支指令是检查指令上的条件句并且指向等待被执行的区。将这些检查指令和条件句分支指令插入到图5C所示的、检查框510的控制流转移指令532。以下针对图7更详细地描述步骤410和412,图7描绘了用于为分析区插入检查和分支指令的方法。可以为检查和分支指令将要插入的每个区重复图7所描绘的方法。
在步骤414,为提供效率,优化方法400中所插入的指令。一旦编译器101用操纵断言掩码的指令替换了分支指令,就可以进一步优化代码。可以使用许多优化技术,诸如“公共子表达式消除”、“常数传播”、“强度消减”、“循环不变量代码移动”以及“部分冗余消除”。这些优化技术可以移除在区的结束处插入的一些指令。
图6和图7表示编译器101通过其对区进行分析并执行图4所示的步骤404、410和412的示范性方法。更具体的,图6表示用于针对一个区执行步骤408的示范性方法,以及图7呈现用于针对一个区执行步骤410和412的示范性方法。由于执行图6和7中所描绘的方法步骤的编译器101在一个区中插入指令,因此编译器101可以为所有的区重复图6和7所描绘的方法。
针对图6和7所提供的公开可以参照某些伪代码表达式。这些伪代码表达式意在从概念上代表程序指令,但是不必以任何特定语言或者指令集来代表指令。针对图6和7所提供的描述可以参照某些符号。这样的符号包括:“R”——也称为“分析区”并且其是在图6和7所描述的方法由编译器进行分析的区,“s”——用于后继者或者分析区的分支采用(branch-taken)目标区的断言掩码变量,“n”——用分析区的非分支采用(branch-not-taken)目标区的断言掩码变量,以及“C”——用于在分析区的结束处的任何分支的分支条件比特掩码变量。
图6是根据本发明的一个实施例的、用于插入指令以更新用于特定区的断言掩码变量的方法步骤的流程图。虽然结合图1-3和5A-5C来描述方法步骤,但本领域技术人员应该理解,配置为以任何顺序实施方法步骤的任何系统均落入本发明的范围内。
图6所描绘的方法600确定所要插入到单个区的指令,其中该单个区由编译器101分析,也称为分析区或区R。为了确定所要插入到控制图中的每个区的指令,为所有这样的区重复图6中的方法。
使用图6所示的方法600的步骤,编译器101对分析区即区R进行分析并且确定将指令插入R的结束处的检查框510。在步骤402和404已经分别生成控制流图和线程边界。这些控制流图和线程边界可以由编译器101使用以执行图6所示的步骤601——622。
如图所示,方法600开始于步骤601,其中编译器101选择将进行分析的区——分析区,也称为区R。在步骤602,编译器101确定区R是否结束于分支指令。跟随从图6中的步骤602延伸出的“yes”和“no”箭头所到达的路径反映出事实:如果分析区确实结束于分支指令,那么分析区具有两个后继者,并且因此用于两个不同区——两个后继者,也称为分支采用目标和分支未采用目标的断言掩码变量被更新,然而如果分析区不是结束于分支指令,那么分析区仅有一个后继者,并且因此只有一个断言掩码变量被更新。步骤604、606和608代表用于设置用于分支采用目标的断言掩码变量的流逻辑,而步骤610、612和614代表用于设置用于分支未采用目标的断言掩码变量的流逻辑。步骤618和620表示用于设置用于非分支后继者的断言掩码变量的流逻辑。
如果分析区结束于分支指令,那么编译器101进行到步骤603,其中编译器101移除分支指令,并且编译器101插入确定分支条件比特掩码变量的值的指令,分支条件比特掩码变量本文参考为符号“C”。分支条件比特掩码变量是包含其每个比特都对应于不同线程的比特的比特掩码。以图5B中的断言比特掩码变量520A和520B类似的方式来格式化分支条件比特掩码变量。对于分支条件比特掩码变量中的每个比特,评估所移除的分支指令的分支条件为真的线程由值“1”来反映,而评估分支条件为假的线程由值“0”来反映。因此,C包含关于哪些线程“采用”分支(由1指示)的信息,以及哪些线程“未采用”分支(由0指示)。
在步骤604,编译器101检查分析区的分支采用目标,以查看是否分支采用目标有多个前任。如果分支采用目标确实有多个前任,那么方法600进行到步骤606。如果分支采用目标确实有多个前任,那么存在来自不同区的线程的可能的汇聚。换言之,执行分析区的线程以及执行分支采用目标的任何其他前任的线程可能在分支采用目标处汇聚。因此,在步骤606,编译器101插入指令以将来自采用分支的分析区的线程和等待执行分支采用目标的线程合并。
编译器101可以通过插入与伪代码s|=m&C对应的指令来实施步骤606,其中“s”是用于分支采用目标的断言掩码变量(与图5B所示的一个类似),“|=”是按位OR复合设定运算符,m是用于分析区R的断言掩码变量(与图5B所述的一个类似),“&”是按位AND操作符,以及“C”是用于步骤602所检测到的分支的分支条件比特掩码变量。
表达式“m&C”提供结果比特掩码,其中“&”是按位AND操作符,这对于由结果比特掩码中的比特所代表的每个线程,只有对应的线程正在执行R并且采用步骤602中所引用的分支,才存在“1”。因此,表达式“m&C”产生比特掩码,其指示哪些来自R的线程采用分支。
表达式s|=m&C中的按位OR操作符指示,将采用从分析区移除的分支的线程和来自分支采用目标的其他前任的线程合并。按位OR操作符保持用的断言掩码变量(也参考为符号“s”)中的1指示的所有之前的线程用于分支采用目标,并且从添加来自分析区的新的线程。编译器101为所有其他的区执行在图6的流程图中表示的方法600,包括参考上述的分支采用目标的前任。因此,指令存在于分支采用目标的所有前任中,用于更新用于分支采用目标的断言掩码变量。按位OR确保由分支采用目标的所有前任中的更新掩码变量指令所指示的所有线程在分支采用目标处被合并。
如果分支采用目标没有多个前任,那么方法600进行到步骤608,并且插入指令以指派采用从分析区移除的分支的线程到分支采用目标。
编译器101可以通过插入与伪代码s=m&C对应的指令来实施步骤608。在步骤608,不存在来自分支采用目标的其他前任区的线程的汇聚。因此,编译器101可以不需要按位OR操作符,并且编译器101可以简单指派值“m&C”(其指示来自分析区的哪些线程采用分支)给对用于分支采用目标的断言比特掩码变量,其应于符号“s”。
编译器101接下来进行到步骤610。在步骤610,编译器101查看是否分支未采用目标有多个前任。如果分支未采用目标确实有多个前任,那么编译器101进行到步骤612,并且插入指令以将未采用分支的线程和等待执行分支未采用目标的线程进行合并。
编译器可以通过插入与伪代码n|=m&~C对应的指令来实施步骤612,其中“n”是用于分支未采用目标的断言掩码变量,并且“~”是按位NOT操作符。表达式“m&~C”表示来自未采用分支的当前区的线程。表达式“~C”是分支条件比特掩码变量C的按位NOT,并且表示未采用分支的线程。概念上,由于按位NOT操作反转比特掩码中的所有比特(即从0到1以及从1到0),并且由于比特掩码C中的所有比特表示哪些线程采用分支,因此表达式“~C”表示未采用分支的所有线程。例如,如果C的第二比特为1,其指示第二线程采用分支,那么C的按位NOT的第二比特即~C等于0,其指示第二线程未采用分支。因此,表达式“m&~C”指示执行R的哪些线程未采用分支。表达式n|=m&~C将来自分支未采用目标的线程和来自未采用分支的分析区的线程,以针对步骤606和608所描述的类似的方式进行合并。
如果分支采用目标没有多个前任,那么编译器101进行到步骤614,并且插入指令以指派来自未采用分支的分析区线程到分支未采用目标。
编译器101可以通过插入与伪代码n=m&~C对应的指令来实施步骤614。如上针对步骤606、608和612所解释的,该表达式指示将未采用分支的线程(m&~C)简单指派到分支未采用目标。
返回参考步骤602,如果在步骤602编译器101在分析区的结束处没有检测到分支,那么分析区仅有一个后继者,并且方法进行到步骤616。由于不存在分支,因此来自区R的所有线程传递到其后继区。因此,编译器101插入指令以合并或者指派来自当前区所有线程到后继区。另外,由于仅存在一个后继者,因此编译器101仅插入用于指派一个比特掩码变量的值的指令,即用于后继者的比特掩码变量s。
在步骤616,编译器101查看R的后继者是否有多个前任。编译器101在步骤618或者620指派s的值,取决于是否R的后继者有多个前任。逻辑和针对步骤606和612的类似。换言之,如果对于R的后继者存在多个前任,那么编译器101插入指令以将来自R的线程与来自多个前任的线程进行合并。如果对于R的后继者不存在多个前任,那么编译器101简单指派执行R的线程到后继者中的线程。
在步骤616,如果分析区的后继者确实有多个前任,那么方法600进行到步骤618,并且插入指令以将执行分析区的线程和等待执行后继区的线程合并。在步骤618,由于后继者有多个前任,因此编译器101插入指令以使用按位OR操作,来将等待执行分析区的后继者的线程即变量s所指示的线程,和当前正执行分析区的后继者的线程即变量m所指示的线程进行结合。编译器101可以通过插入对应于伪代码s|=m的指令来实施步骤618。
如果在步骤616,编译器101确定后继者没有多个前任,那么方法600前进到步骤620。在步骤620,由于后继者仅有一个前任即区R,因此可能没有其他线程等待执行后续者,并且来自R的所有线程传递到后继者。编译器101可以插入对应于表达式s=m的指令来实施步骤620。在编译器101已经完成步骤612、614、618或者620之后,方法600在步骤622终止。
为了示例性目标,下面将图6的方法600应用于图5A的控制流图中所示的区2502-2,并且参照图5A和图6两者。示范性伪代码表达式用于帮助示出编译器101实施的步骤。
在步骤602,编译器101检查区2502-2以查看是否区2502-2结束于分支。如通过箭头506-3和506-4可以看到,区2502-2确实结束于分支。因此,编译器101进行到步骤604。在步骤604,编译器101检查区2502-2的分支采用目标,以查看是否分支采用目标有多个前任。区2502-2的分支采用目标是区4502-4(为了简洁起见,在图5A中,在区的左侧的所有分支目标被认为是分支采用目标,并且在区的右侧的所有分支目标被认为是分支未采用目标)。如可以看到的,分支采用目标区4504-4仅有一个前任,该前任是区2502-2。因此,编译器101进行到步骤608。
在步骤608,编译器101将对应于伪代码s=m&C的指令插入到区2502-2的检查框510-2。该语句将区4502-4的断言掩码变量,此处指示为“s”,设置为等于按位AND用于区2502-2的断言掩码和区2502-2结束处的分支的条件。逻辑上,这意味着在区2502-2结束处采用分支的所有线程流到区4502-4。
在步骤610,编译器101检查区5502-5,以查看是否区5502-5有多个前任。由于区3502-3和区2502-2两者都是区5502-5的前任,因此区5502-5确实有多个前任。编译器101进行到步骤612并且插入对应于伪代码n|=m&~C的指令。这些指令将区5502-5的断言掩码变量,在此指示为“n”,设置为等于将“n”之前的值与将用于区2502-2的断言掩码即“m”与分支条件C的按位NOT的值进行按位AND的结果进行按位OR。逻辑上,这与将等待执行区5502-5的线程与从区2502-2传递到区5502-5的线程进行合并对应。
编译器101进行到步骤622并且结束图6所示的方法。在该示例中由编译器101插入区2502-2的检查框510-2的指令包括如下:
s=m&C
n|=m&~C
根据这些指令,当由控制流图500所代表的程序运行时,检查框510-2更新区4和5的断言掩码变量。这些指令放置在图5A和5C所示的检查框510-2的掩码更新指令中。
图7是根据本发明一个实施例的、用于确定针对图4中的步骤410和412描述的检查和条件分支指令的方法步骤的流程图。虽然结合图1-3和5A-5C描述方法步骤,但是本领域技术人员应该理解,以任何顺序实施方法步骤的任何系统都落入本发明的范围内。
图7所描绘的方法700为单个区确定检查和条件句分支指令,该单个区是正由编译器101分析的区,也称为分析区或区R。为了为控制图中的每个区确定检查和条件句分支指令,为所有这样的区重复图7中的方法。
为避免混淆,由实施图7所示的步骤的编译器101分析的除R之外的区本文称之为“线程边界”或者参考为符号“[Rx]”,并且用于线程边界区的断言掩码变量称之为“[x]”,其中x可以由图5A中的区的区号代替。
如图所示,方法700开始于步骤701,其中编译器101从控制流图(诸如图5A中描绘的控制流图500)选择分析区。编译器101已经知道用于所述分析区的线程边界,这是因为已经执行了图4中的步骤404。在步骤702,编译器101确定所述线程边界区作为分析区的线程边界中、具有最高优先级的区。
在步骤704,如果用于具有最高优先级的边界区的断言掩码变量指示具有最高优先级的线程边界区内存在等待执行的线程,那么编译器101将指令插入以分支到线程边界区。编译器101可以使用对应于伪代码if[x]goto[Rx]的指令用于步骤704。概念上,这陈述了“如果存在在线程边界区中等待的任何线程,那么转移程序控制到线程边界区”。语句“if[x]”可以通过采取跨变量[x]中的所有比特按位OR来实施,如果在[x]中存在任何1,那么这产生1(真),并且如果在[x]中不存在1,那么这产生0(假)。
在步骤706,编译器101查看线程边界中是否存在任何仍然没分析的区。如果存在,则方法700进行到步骤708,否则方法在步骤710结束。
为了示例的目的,现在将图7所示的方法应用到图5A中的控制流图500所示的区2502-2,并且参照图5A和7。示范性伪代码表达式用于帮助示出编译器101采用的步骤。
对于步骤702,编译器101审查图5A所示的示范性控制流图500中的区2502-2的线程边界。区2502-2的边界包括区3503-3、区4502-4和区5502-5。除此之外,具有最高优先级的区是区3502-3,其具有优先级6504-3。
编译器101前进到步骤704,并且在区2502-2结束处的检查框510插入检查和分支指令。在图5所示的示范性控制流图500中,因为区3具有最高优先级,所以插入对应于区3的指令。对应伪代码为“if[3]goto[R3]”。
接下来,在步骤706,编译器101查看在仍然没分析的线程边界中是否存在任何线程。在示范性控制流图500中,仍然存在没分析的、区5502-5的线程边界中的两个区,两个区是区4502-4和5502-5。除此之外,区5502-5具有最高优先级。方法进行到步骤704,其中编译器101插入对应的if和goto指令:if[5]goto[R5]。方法进行到步骤706,并且确定在线程边界中仍然存在一个线程。此后,方法再返回步骤704,并且插入指令if[4]goto[R4]。最后,因为在线程边界中没有区剩下,所以方法进行到步骤710并且结束分析区的分析。
从该过程产生的用于示范性控制流图500的伪代码如下:
If[3]goto[R3]
If[5]goto[R5]
If[4]goto[R4]
如可以看到的,当由控制流图500代表的程序运行时,检查框510-2首先查看在区3中是否存在等待的线程,并且如果是,则去区3;随后检查在区5中是否存在等待的线程,并且如果是,则去区5;并且随后查看在区4中是否存在等待的线程,并且如果是,则去区4。通过按优先级顺序来排序语句,强制了区的执行优先级。
可以移除最后的“if”语句。这是因为如果在经检查的所有其他区中不存在等待的线程,那么控制流到最后剩下的区。这产生伪代码:
If[3]goto[R3]
If[5]goto[R5]
goto[R4]
此外,如果R的所有后继者的优先级都高于R的线程边界中的所有其他区,那么控制转移到R的后继者之一,并且对于不是R的后继者的、线程边界中的区不需要if和goto语句。
应该理解,图6和7中参考的伪代码从概念上表示计算机程序指令,但是不必以任何特定编程语言或者指令集等来表示指令。
综上,本文提供编译器实现的技术,用于强制程序结构中的区的优先级顺序。使用这些技术,编译器通过插入指令来修改程序代码,以在每个区中实施一系列的检查和分支。对于每个区,系列检查和分支确定接下来控制应该流到何处。按优先级顺序指派检查和分支,这有助于强制执行的优先级顺序。编译器还插入指令以更新用于每个区的断言掩码变量,以确保在每个区中正执行正确的线程。更新断言掩码变量的指令也帮助强制执行的优先级顺序。
本文提供的技术的优点在于,按优先级顺序执行区。本文公开的技术的附加的优点在于,提早重新汇聚发散的线程。而另一个优点在于,因为由编译器实现技术,所以不要求专门的硬件支持。
本发明的一个实施例可被实施为与计算机系统一起使用的程序产品。该程序产品的程序定义实施例的各功能(包括本文中描述的方法)并且可以被包含在各种计算机可读存储介质上。示例性计算机可读存储介质包括但不限于:(i)不可写的存储介质(例如,计算机内的只读存储器设备,诸如可由CD-ROM驱动器读取的光盘只读存储器(CD-ROM)盘、闪存、只读存储器(ROM)芯片或任何类型的固态非易失性半导体存储器),在其上存储永久性信息;和(ii)可写的存储介质(例如,磁盘驱动器或硬盘驱动器内的软盘或者任何类型的固态随机存取半导体存储器),在其上存储可更改的信息。
以上已参照特定实施例对本发明进行了描述。然而,本领域普通技术人员将理解的是,可对此做出各种修改和变化而不脱离如随附权利要求书中所阐述的本发明的较宽精神和范围。因此,前面的描述以及附图应被视为是例示性而非限制性的意义。
因此,本发明的实施例的范围在随后的权利要求中阐述。

Claims (10)

1.一种用于调度线程以执行程序的不同区的方法,所述方法包括:
分析控制流图,所述控制流图基于程序代码并且包括多个区,其中每个区代表所述程序代码的不同部分,被指派有执行优先级,并且具有包括一个或多个线程边界区的线程边界,每个线程边界区是所述控制流图中的所述多个区中的一个;
基于所述控制流图和所述程序代码,在包括于所述多个区中的第一区的结束处,插入一个或多个更新断言掩码变量指令;以及
在所述第一区的结束处插入一个或多个条件句分支指令,所述条件句分支指令布置为反映所述第一区的所述线程边界中的所述一个或多个线程边界区的执行优先级。
2.根据权利要求1所述的方法,进一步包括,确定在所述第一区的结束处包括分支指令,并且用配置为为所述第一区计算分支条件比特掩码变量的指令来代替所述分支指令。
3.根据权利要求2所述的方法,其中所述控制流图中的每个区具有一个或多个后继区和一个或多个前任区,每个后继区均为所述控制流图中的区,并且每个前任区均为所述控制流图中的区,以及其中所述第一区的结束处的所述分支指令具有分支采用目标区和分支未采用目标区,所述分支采用目标区是所述控制流图中的所述多个区中的区,所述分支未采用目标区是所述控制流图中的所述多个区中的区,以及插入一个或多个更新断言掩码变量指令进一步包括:
确定所述分支采用目标区具有多个前任区,并且插入配置为将采用所述第一区中的所述分支的线程与等待执行所述分支采用目标区的线程合并的指令;或者
确定所述分支采用目标区不具有多个前任区,并且插入配置为指派采用所述第一区中的所述分支的线程到所述分支采用目标区的指令。
4.根据权利要求3所述的方法,进一步包括:
确定所述分支未采用目标区具有多个前任区,并且插入配置为将未采用所述第一区中的所述分支的线程与等待执行所述分支未采用目标区的线程合并的指令;或者
确定所述分支未采用目标区不具有多个前任区,并且插入配置为指派未采用所述第一区中的所述分支的线程到所述分支未采用目标区的指令。
5.根据权利要求1所述的方法,其中所述控制流图中的每个区具有一个或多个后继区以及一个或多个前任区,每个后继区是所述控制流图中的区,并且每个前任区是所述控制流图中的区,以及其中插入第一更新断言掩码变量指令集进一步包括:
确定在所述第一区的结束处不包括分支指令;以及,或者确定所述第一区的后继区具有多个前任区,并且插入配置为将执行所述第一区的线程与等待执行所述后继区的线程合并的指令,或者确定所述第一区的后继区不具有多个前任区,并且插入配置为指派执行所述第一区的线程到所述第一区的所述后继区的指令。
6.根据权利要求1所述的方法,其中插入所述一个或多个条件句分支指令进一步包括:
按照所述第一区的所述线程边界中的所述线程边界区的执行优先级顺序,在所述第一区的结束处插入多个条件句分支指令,每个条件句分支指令具有各自的目标线程边界区,每个条件句分支指令配置为:
确定线程是否等待执行所述第一区中的所述线程边界中的所述各自的目标线程边界区,并且如果线程等待执行所述各自的目标线程边界区,那么分支到所述目标线程边界区。
7.根据权利要求1所述的方法,进一步包括,在所述第一区的开始处插入一个或多个指令以设置用于所述第一区的断言掩码。
8.根据权利要求1所述的方法,进一步包括,通过实施一个或多个无用代码消除和循环不变量代码移动,来优化所述一个或多个更新断言掩码变量指令和所述一个或多个条件句分支指令。
9.根据权利要求1所述的方法,进一步包括:
在所述多个区中的第二区的结束处插入一个或多个更新断言掩码变量指令;以及
在所述第二区的结束处插入一个或多个条件句分支指令,所述条件句分支指令按照所述第二区的线程边界中的所述线程边界区的执行优先级顺序布置。
10.一种用于调度线程以执行程序的不同区的计算设备,所述计算设备包括:
处理器;以及
耦连到所述处理器的存储器,其中所述存储器包括具有指令的编译器,当所述指令由所述处理器执行时,所述指令使得所述处理器:
分析控制流图,所述控制流图基于程序代码并且包括多个区,其中每个区代表所述程序代码的不同部分,被指派有执行优先级,并且具有包括一个或多个线程边界区的线程边界,每个线程边界区是所述控制流图中的所述多个区中的一个;
基于所述控制流图和所述程序代码,在包括于所述多个区中的第一区的结束处,插入一个或多个更新断言掩码变量指令;以及
在所述第一区的结束处插入一个或多个条件句分支指令,所述条件句分支指令布置为反映所述第一区的所述线程边界中的所述一个或多个线程边界区的执行优先级。
CN201310666892.4A 2012-12-10 2013-12-10 用于线程的simd执行的编译器控制区调度 Pending CN103870246A (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US13/710,279 2012-12-10
US13/710,279 US9424038B2 (en) 2012-12-10 2012-12-10 Compiler-controlled region scheduling for SIMD execution of threads

Publications (1)

Publication Number Publication Date
CN103870246A true CN103870246A (zh) 2014-06-18

Family

ID=50778225

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201310666892.4A Pending CN103870246A (zh) 2012-12-10 2013-12-10 用于线程的simd执行的编译器控制区调度

Country Status (4)

Country Link
US (1) US9424038B2 (zh)
CN (1) CN103870246A (zh)
DE (1) DE102013017982A1 (zh)
TW (1) TWI552108B (zh)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108541321A (zh) * 2016-02-26 2018-09-14 谷歌有限责任公司 将程序代码映射到高性能、高功效的可编程图像处理硬件平台的编译技术
CN108701022A (zh) * 2016-02-19 2018-10-23 高通股份有限公司 用于图形处理单元的着色器中的统一断言
CN110866861A (zh) * 2017-04-24 2020-03-06 英特尔公司 计算优化机制
CN114937109A (zh) * 2019-05-31 2022-08-23 想象技术有限公司 控制渲染操作的方法和系统

Families Citing this family (23)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9378179B2 (en) 2012-11-21 2016-06-28 International Business Machines Corporation RDMA-optimized high-performance distributed cache
US9569400B2 (en) 2012-11-21 2017-02-14 International Business Machines Corporation RDMA-optimized high-performance distributed cache
US9332083B2 (en) * 2012-11-21 2016-05-03 International Business Machines Corporation High performance, distributed, shared, data grid for distributed Java virtual machine runtime artifacts
US9384019B2 (en) 2014-03-25 2016-07-05 International Business Machines Corporation Dynamic code injection
US10405784B2 (en) 2014-05-14 2019-09-10 Stryker Corporation Tissue monitoring apparatus and method
US9223551B1 (en) * 2014-07-22 2015-12-29 Here Global B.V. Rendergraph compilation method and use thereof for low-latency execution
KR102279027B1 (ko) 2014-12-03 2021-07-19 삼성전자주식회사 멀티 스레드를 실행하는 방법 및 장치
US9928034B2 (en) * 2014-12-17 2018-03-27 Nvidia Corporation Work-efficient, load-balanced, merge-based parallelized consumption of sequences of sequences
US9898287B2 (en) * 2015-02-13 2018-02-20 Advanced Micro Devices, Inc. Dynamic wavefront creation for processing units using a hybrid compactor
US10152452B2 (en) * 2015-05-29 2018-12-11 Intel Corporation Source operand read suppression for graphics processors
EP3106982B1 (en) * 2015-06-18 2021-03-10 ARM Limited Determination of branch convergence in a sequence of program instructions
JP6668638B2 (ja) * 2015-08-24 2020-03-18 富士通株式会社 情報処理装置、コンパイル方法及びコンパイラ
US9921838B2 (en) * 2015-10-02 2018-03-20 Mediatek Inc. System and method for managing static divergence in a SIMD computing architecture
US11424931B2 (en) 2016-01-27 2022-08-23 Blackberry Limited Trusted execution environment
US10599409B2 (en) * 2016-02-02 2020-03-24 Blackberry Limited Application lifecycle operation queueing
EP3367606B1 (en) * 2017-02-24 2019-09-18 Secure-IC SAS Automatic insertion of masking into an algorithm
US10133561B1 (en) 2017-08-30 2018-11-20 International Business Machines Corporation Partial redundancy elimination with a fixed number of temporaries
US11442795B2 (en) 2018-09-11 2022-09-13 Nvidia Corp. Convergence among concurrently executing threads
CN110032407B (zh) 2019-03-08 2020-12-22 创新先进技术有限公司 提升cpu并行性能的方法及装置和电子设备
US11455153B2 (en) * 2019-03-18 2022-09-27 Advanced Micro Devices, Inc. Dynamic instances semantics
US11934867B2 (en) 2020-07-23 2024-03-19 Nvidia Corp. Techniques for divergent thread group execution scheduling
US20230115044A1 (en) * 2021-10-08 2023-04-13 Nvidia Corp. Software-directed divergent branch target prioritization
CN117311988B (zh) * 2023-11-27 2024-03-12 沐曦集成电路(南京)有限公司 一种带掩码的规约操作优化方法、装置、设备及介质

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20070050603A1 (en) * 2002-08-07 2007-03-01 Martin Vorbach Data processing method and device
US20090240931A1 (en) * 2008-03-24 2009-09-24 Coon Brett W Indirect Function Call Instructions in a Synchronous Parallel Thread Processor
US20110072248A1 (en) * 2009-09-24 2011-03-24 Nickolls John R Unanimous branch instructions in a parallel thread processor
US20110078418A1 (en) * 2009-09-28 2011-03-31 Guillermo Juan Rozas Support for Non-Local Returns in Parallel Thread SIMD Engine

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8196127B2 (en) * 2006-08-04 2012-06-05 International Business Machines Corporation Pervasively data parallel information handling system and methodology for generating data parallel select operations
US8806458B2 (en) * 2012-02-16 2014-08-12 Microsoft Corporation Vectorization of shaders
US9851977B2 (en) * 2012-12-06 2017-12-26 Kalray Apparatus and method for combining thread warps with compatible execution masks for simultaneous execution and increased lane utilization

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20070050603A1 (en) * 2002-08-07 2007-03-01 Martin Vorbach Data processing method and device
US20090240931A1 (en) * 2008-03-24 2009-09-24 Coon Brett W Indirect Function Call Instructions in a Synchronous Parallel Thread Processor
US20110072248A1 (en) * 2009-09-24 2011-03-24 Nickolls John R Unanimous branch instructions in a parallel thread processor
US20110078418A1 (en) * 2009-09-28 2011-03-31 Guillermo Juan Rozas Support for Non-Local Returns in Parallel Thread SIMD Engine

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
GREGORY DIAMOS, ET.AL.: "SIMD Re-Convergence At Thread Frontiers", 《PROCEEDINGS OF THE 44TH ANNUAL IEEE/ACM INTERNATIONAL SYMPOSIUM ON MICROARCHITECTURE》 *
NICOLAS BRUNIE, ET.AL.: "Simultaneous Branch andWarp Interweaving for Sustained GPU Performance", 《COMPUTER ARCHITECTURE(ISCA),2012 39TH ANNUAL INTERNATIONAL SYMPOSIUM》 *

Cited By (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108701022A (zh) * 2016-02-19 2018-10-23 高通股份有限公司 用于图形处理单元的着色器中的统一断言
CN108701022B (zh) * 2016-02-19 2020-05-08 高通股份有限公司 用于图形处理单元的着色器中的统一断言
US10706494B2 (en) 2016-02-19 2020-07-07 Qualcomm Incorporated Uniform predicates in shaders for graphics processing units
CN108541321A (zh) * 2016-02-26 2018-09-14 谷歌有限责任公司 将程序代码映射到高性能、高功效的可编程图像处理硬件平台的编译技术
CN108541321B (zh) * 2016-02-26 2023-04-18 谷歌有限责任公司 将程序代码映射到高性能、高功效的可编程图像处理硬件平台的编译技术
CN110866861A (zh) * 2017-04-24 2020-03-06 英特尔公司 计算优化机制
CN110866861B (zh) * 2017-04-24 2023-08-01 英特尔公司 计算优化机制
CN114937109A (zh) * 2019-05-31 2022-08-23 想象技术有限公司 控制渲染操作的方法和系统
US11676323B2 (en) 2019-05-31 2023-06-13 Imagination Technologies Limited Controlling rendering operations by shader buffer identification
CN114937109B (zh) * 2019-05-31 2023-11-07 想象技术有限公司 控制渲染操作的方法和系统

Also Published As

Publication number Publication date
TWI552108B (zh) 2016-10-01
US9424038B2 (en) 2016-08-23
US20140165049A1 (en) 2014-06-12
DE102013017982A1 (de) 2014-06-12
TW201443825A (zh) 2014-11-16

Similar Documents

Publication Publication Date Title
CN103870246A (zh) 用于线程的simd执行的编译器控制区调度
CN101556544B (zh) 为了由通用处理器执行而对应用程序重定目标的计算系统
JP6159825B2 (ja) ハードウェアポインタを使用したsimdコア内での分岐ブランチに対するソリューション
EP2710467B1 (en) Automatic kernel migration for heterogeneous cores
EP2707797B1 (en) Automatic load balancing for heterogeneous cores
US20130226535A1 (en) Concurrent simulation system using graphic processing units (gpu) and method thereof
US9361079B2 (en) Method for compiling a parallel thread execution program for general execution
CN103460188A (zh) 用于基于活跃分析的再具体化以减少寄存器不足并提高并行度的技术
CN103425533A (zh) 用于管理嵌套执行流的方法和系统
CN104050033A (zh) 用于有索引的屏障的硬件调度的系统和方法
CN103309786A (zh) 用于在非可抢占式图形处理单元上交互调试的方法和装置
CN103309702A (zh) 用于并行线程子集的一致加载处理
CN104050706A (zh) 用于低功率图形渲染的像素着色器旁路
CN103886547A (zh) 用于存储共享顶点的技术
CN103870309A (zh) 用于集群多级寄存器堆的寄存器分配
US9645802B2 (en) Technique for grouping instructions into independent strands
US8615770B1 (en) System and method for dynamically spawning thread blocks within multi-threaded processing systems
CN104050032A (zh) 用于有条件的屏障和急迫的屏障的硬件调度的系统和方法
Kowalik Using OpenCL: Programming Massively Parallel Computers
CN103870213A (zh) 经由管线化的状态包触发性能事件捕获
CN103996216A (zh) 用于曲面细分和几何着色器的电力高效属性处置
CN105074657A (zh) 并行管道中的发散分支的硬件和软件解决方案
CN103793206A (zh) 基于工作队列的图形处理单元工作创建
WO2023072386A1 (en) System for auto-parallelization of processing codes for multi-processor systems with optimized latency, and method thereof
US11262989B2 (en) Automatic generation of efficient vector code with low overhead in a time-efficient manner independent of vector width

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C02 Deemed withdrawal of patent application after publication (patent law 2001)
WD01 Invention patent application deemed withdrawn after publication

Application publication date: 20140618