CN106373083B - 图形处理 - Google Patents

图形处理 Download PDF

Info

Publication number
CN106373083B
CN106373083B CN201610576737.7A CN201610576737A CN106373083B CN 106373083 B CN106373083 B CN 106373083B CN 201610576737 A CN201610576737 A CN 201610576737A CN 106373083 B CN106373083 B CN 106373083B
Authority
CN
China
Prior art keywords
shader program
execution
instructions
thread
shader
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.)
Active
Application number
CN201610576737.7A
Other languages
English (en)
Other versions
CN106373083A (zh
Inventor
P·哈里斯
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.)
ARM Ltd
Original Assignee
ARM Ltd
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 ARM Ltd filed Critical ARM Ltd
Publication of CN106373083A publication Critical patent/CN106373083A/zh
Application granted granted Critical
Publication of CN106373083B publication Critical patent/CN106373083B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T1/00General purpose image data processing
    • G06T1/20Processor architectures; Processor configuration, e.g. pipelining
    • 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
    • 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/46Multiprogramming arrangements
    • G06F9/48Program initiating; Program switching, e.g. by interrupt
    • G06F9/4806Task transfer initiation or dispatching
    • G06F9/4843Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • Image Generation (AREA)
  • Image Processing (AREA)
  • Computer Graphics (AREA)

Abstract

本申请涉及图形处理。具体地,要由图形处理单元的着色器核心执行的着色器程序(60)的一系列指令被划分为,执行着色器程序的“全局”公用表达的初始指令组(61)、着色器程序中的执行着色器程序要处理的工作项组内的给定工作组公用的表达的指令组(62)、以及需要对于各工作项单独执行的主指令序列(63)。然后,执行线程能够在全局公用表达开始时(64)、或在工作组公用表达开始时(65)、或在主指令序列开始时(66)开始执行着色器程序。

Description

图形处理
技术领域
本发明涉及图形处理系统,具体地涉及包括一个或更多个可编程处理阶段(“着色器(shader)”)的图形处理系统的操作。
背景技术
图形处理通常以流水线形式来进行,一个或更多个流水线阶段对数据进行操作,以产生最终的渲染输出(例如,显示的帧)。现在,许多图形处理流水线包括一个或更多个可编程处理阶段(通常称为“着色器”)。例如,图形处理流水线可以包括几何着色器、顶点着色器以及片段(像素)着色器中的一个或更多个(并且通常为全部)。这些着色器为对输入数据值执行着色器程序,以产生用于由图形流水线的剩余部分处理和/或用于输出的所期望的一组输出数据(例如,在片段着色器的情况下为适当着色且渲染的片段数据)。图形处理流水线的着色器可以共享可编程处理电路,或者它们可以各为不同的可编程处理单元。
将由需要通过图形处理流水线使用高级着色器编程语言(诸如GLSL、HLSL、OpenCL等)进行的处理的应用,来提供要由图形处理流水线的给定“着色器”执行的着色器程序。该着色器程序将由指示相关语言标准(规范)中所定义的期望编程步骤的“表达”构成。然后,高级着色器程序由着色器语言编译器翻译为用于目标图形处理流水线的二进制代码。该二进制代码将由用于给定目标图形处理流水线的指令组规范中所指定的“指令”构成。如技术领域中已知的,用于将着色器语言表达转换成二进制代码指令的编译处理,可以经由编译器内的程序的若干中间表示来进行。由此,以高级着色器语言编写的程序可以翻译成编译器特定中间表示(并且,可以存在编译器内的数个连续中间表示),最终的中间表示翻译成用于目标图形处理流水线的二进制代码指令。
由此,对“表达”的参照在这里(除非场境另外需要)涉及要编译成目标图形处理器二进制代码(即,要被表达为硬件微指令)的着色器语言结构。(如技术领域中已知的,这种着色器语言结构可以根据讨论中的着色器语言而被称为“表达”、“语句(statement)”等。为方便起见,这里将使用术语“表达”,但这旨在包含所有等同的着色器语言结构(诸如GLSL的“语句”))。“指令”对应地涉及被发出为执行“表达”的实际硬件指令(代码)。
由此,图形处理流水线着色器通过对于要生成的输出(诸如渲染目标(例如,帧))中的各“工作项”(这种情况下的“工作项”将通常为顶点或采样位置(例如,在片段着色器的情况下))运行小程序来执行处理。在图形处理流水线用于“计算着色”(例如在OpenCL或DirectCompute下)的情况下,那么工作项将为适当的计算着色工作项。因为典型渲染输出(例如帧)是各可以被单独处理的相当大量的工作项(例如,顶点或片段)的特征,所以该着色器操作通常使得能够具有高并行度。
在图形着色器操作中,经由将对于讨论中的工作项执行讨论中的着色器程序的执行线程,来处理各工作项。因为通常存在要对给定着色器程序处理的大量工作项(例如,顶点或采样位置)以及由此而存在大量的对应线程,所以图形处理系统可以被认为是大型多线程系统。
申请人已经认识到,许多图形着色器程序将包括将对于(例如,对于绘制调用中的各线程)要执行的多组多个线程产生相同值的操作(表达)。
例如,因为数据输入是一致变量,所以OpenCL ES顶点着色器:
Figure BDA0001054647180000021
将对于各线程(其中,各线程表示给定顶点)产生相同的“a*b*c”计算值。由此,如果该计算可以执行一次且结果可在多个线程之间共享,则可以使得着色器程序的执行更有效。
申请人之前在其更早的英国第GB-A-2516358号专利申请中,提出了如下各项的使用:“导航(pilot)”着色器程序的使用,其执行一次将对于(例如,绘制调用的)一组多个线程产生相同值的表达;和然后的“主”着色器程序的使用,其使用“导航着色器”的结果代替每次重新计算公用表达,对于各工作项来执行。
然而,尽管如此,但申请人相信仍然,存在改进包括一个或更多个着色器阶段的图形处理流水线中的着色器程序的执行的余地。
发明内容
根据本发明的第一方面,提供了一种操作图形处理流水线的方法,该图形处理流水线包括可编程着色阶段,该可编程着色阶段执行指令以执行着色操作,所述方法包括以下步骤:
当所述着色器阶段要执行着色器程序以执行着色操作时,包括要在执行所述着色器程序时执行的一系列指令的所述着色器程序进行如下操作:
向要执行所述着色器程序的所述着色器阶段发布多个执行线程,以便执行,
其中,
向所述着色器阶段发布所述执行线程以便所述着色器程序的执行的步骤被配置为,使得对于所述执行线程中的不同执行线程,所述着色器程序的执行可以在针对所述着色器程序的所述一系列指令内的不同指令处开始;以及
对于所述执行线程执行所述着色器程序,
其中,
对于所述执行线程执行所述着色器程序的步骤包括如下步骤:
对于在针对所述着色器程序的所述一系列指令中的第一点处开始的所述执行线程中的一个或更多个,执行所述着色器程序;以及
对于在针对所述着色器程序的所述一系列指令中的不同点处开始的所述执行线程中的另一个或多个,执行所述着色器程序。
根据本发明的第二方面,提供了一种图形处理流水线,该图形处理流水线包括可编程着色阶段,该可编程着色阶段执行指令以执行着色操作;其中,
所述图形处理流水线被配置为:
当所述着色器阶段要执行着色器程序以执行着色操作时,包括要在执行所述着色器程序时执行的一系列指令的所述着色器程序进行如下操作:
向要执行所述着色器程序的所述着色器阶段发布多个执行线程,以便执行,
其中,
向所述着色器阶段发布所述执行线程以便所述着色器程序的执行的步骤被配置为,使得对于所述执行线程中的不同执行线程,所述着色器程序的执行可以在针对所述着色器程序的所述一系列指令内的不同指令处开始;以及
对于所述执行线程执行所述着色器程序,
其中,
对于所述执行线程执行所述着色器程序的步骤包括如下步骤:
对于针对所述着色器程序的所述一系列指令中的第一点处开始的所述执行线程中的一个或更多个,执行所述着色器程序;以及
对于所述着色器程序的所述一系列指令中的不同点处开始的所述执行线程中的另一个或多个,执行所述着色器程序。
本发明涉及图形处理流水线中的着色器程序的执行。在本发明中,要执行着色器程序的不同执行线程可以在着色器程序中的不同开始点处开始执行着色器程序中的指令。换言之,着色器程序具有用于执行线程的多个可能“开始”(“进入”)点,使得线程可以在着色器程序内的不同点处(例如,并且优选地,在更适于讨论中的执行线程的点处)开始执行着色器程序。
在这一点上,申请人意识到,可以安排要在着色器程序的起点处或接近起点执行的着色器程序中的“公用”操作(表达)(即,在每次对于执行着色器程序的线程组中的一些或所有线程执行时,将产生相同值的表达(操作)),“非公用”操作(表达)(即,对于执行着色器程序的线程组中的各线程将(潜在地)产生不同值的表达(操作))在着色器程序中后面执行。
此外,通过允许执行线程在着色器程序的该系列指令内的不同点处“进入”(开始)着色器程序,一些线程可以从起点处执行着色器程序(从而例如执行着色器程序中的公用操作),其它线程被设置为,在后面的点处开始执行着色器程序(从而,例如,并且优选地避免对于这些线程执行公用操作)。那么,这可以具有减少执行“公用”操作(表达)的线程的数量,从而使得着色器程序的整体执行更有效。
由此,在本发明中,可以减少执行着色器程序中的“公用”表达的指令的线程的数量。然而,本发明不需要产生并执行单独的“导航着色器”程序以做到这一点,因此,避免随着执行导航着色器程序而出现的问题(诸如导航着色器仅可以在单个线程上执行(因此,导航着色器对通常大型的多线程图形处理流水线架构较低效))。
如下面将进一步讨论的,本发明还可以用于更有效地执行着色器(诸如计算着色器)的公用操作,其中,处理负载可以被组织为不同的“工作组”。
图形处理流水线的可编程着色阶段可以包括:图形处理流水线的任意合适且期望的可编程着色阶段(“着色器”)(和图形处理流水线可以包括或充当的可编程着色阶段(“着色器”))。由此,着色阶段可以为(可以操作为)例如顶点着色器、片段着色器或计算着色器。可编程着色阶段可以唯一地操作为一种类型的着色器,但在这一点上将理解的是,可编程着色阶段通常能够(并且优选地可以)运行多个不同类型的着色器(即,使得存在可以例如在不同时间被适当编程,以起一种类型的着色器的作用(例如,起片段着色器的作用(以执行片段着色操作))且以起其它形式(类型)的着色器的作用的图形处理流水线的一个或更多个可编程阶段)。
对应地,向(可编程)着色器阶段发布的着色器程序可以是,用于由可编程着色阶段执行的任意合适且期望的着色器程序。
本发明的技术可以涉及要例如对于给定处理操作(例如,绘制调用)执行的着色器中的一些但不是全部使用,但在实施方式中,本发明的技术可以涉及要对于给定处理操作(例如,绘制调用)执行的所有着色器程序来使用。
可编程着色阶段将并且优选地被实施为适当的可编程处理电路。优选地存在可操作为执行着色程序以执行处理操作的可编程执行单元。由此,可编程执行单元将接收要执行的执行线程,并且对于这些线程执行适当的着色程序,以产生期望的输出。
可以存在单个或多个可编程执行单元。在存在多个可编程执行单元的情况下,各执行单元优选地可以以本发明的方式来操作。
向着色阶段发布以执行着色器程序的执行线程,将表示讨论中的着色器程序的适当“工作项”。由此,它们例如可以表示顶点着色程序的顶点或片段着色程序的采样点(或像素)等。
将向着色阶段发布多个执行线程,以便执行。执行线程可以由操作为图形处理流水线的图形处理单元(图形处理器)的任意合适且期望的部件或元件来向着色阶段发布。优选地,存在操作以(例如优选地向对于执行线程执行着色器程序的图形处理单元的可编程执行单元)发布执行线程的线程产生器。
向着色阶段发布以便执行的多个执行线程优选地(至少部分地)并行(即,并发地)(同时地)执行。
向着色器阶段发布以便执行的多个执行线程可以包括:任意合适且期望的多个执行线程组。由此,它们例如可以包括要被执行以产生讨论中的期望输出(例如帧或帧的一部分(例如拼块))的所有线程,或者它们可以为整组线程(例如,要对于产生的整体输出的给定绘制调用执行的线程组)内的线程的子集。该线程组还可以是,要(例如在图形处理流水线执行计算着色操作时)执行着色器程序的给定工作组或一组工作组的线程。当然,其它布置将是可行的。
如上所讨论的,要执行着色器程序的执行线程能够在着色器程序中(在着色器程序的一系列指令中)的不同开始(进入)点处开始执行着色器程序。
多个执行线程中被执行为在着色器程序的一系列指令中的第一点处开始的一个或更多个,优选地与执行线程中被执行为在着色器程序的一系列指令中的另一(即,后面的)点处开始的一个或更多个(至少部分地)并行(即,并发地)(同时)执行。即,在着色器程序中的不同点处开始的多个线程优选地并行(即,并发地)(同时)执行。
由此,对于执行线程执行着色器程序优选地包括对于着色器程序的一系列指令中的第一点处开始的执行线程中的一个或更多个执行着色器程序和对于着色器程序的一系列指令中的不同点处开始的执行线程中的另一个或多个并发执行着色器程序。
以这种方式同时执行多个线程意味着,处理例如使用大型多线程图形处理流水线架构较有效。
因此,这将意味着,在一系列指令中看起来较后的、一系列指令中的至少一个或一些指令,可以与(对于另一个线程)执行在一系列指令中看起来较早的另一个指令或多个指令同时地、或在(对于另一个线程)执行在一系列指令中看起来较早的另一个指令或多个指令之前执行。
如下面将更详细描述的,在对于另一个线程执行(例如,后面的)指令或多个指令需要对于线程执行(例如,早期的)指令或多个指令的结果或多个结果的情况下,那么需要等待(阻止)对于线程中的一个或更多个执行着色器程序,直到对于线程中的另一个或多个执行讨论中的指令或多个指令为止(在优选实施方式中进行这一点)。
由此,在实施方式中,对于多个执行线程执行着色器程序包括:阻止(停止)对于线程中的一个或更多个执行着色器程序。
优选地,阻止(停止)对于在着色器程序的一系列指令中的后面点处开始的执行线程中的一个或更多个执行着色器程序,优选地直到完成对于在着色器程序的一系列指令中的早期点处开始的执行线程中的一个或更多个执行着色器程序的特定优选的指令或多个指令为止。由此,例如,在优选实施方式中,阻止(停止)对于(在着色器程序的一系列指令中的不同(后面)点处开始的)执行线程中的另一个或多个执行着色器程序,优选地直到完成对于(在早期例如第一点处开始的)执行线程中的一个或更多个执行着色器程序的特定优选的指令或多个指令为止。
一旦执行讨论中的指令或多个指令,那么优选地使用讨论中的指令或多个指令的执行结果,来优选地继续所阻止(停止)的对于一个或更多个线程执行着色器程序。
如上所讨论的,要执行着色器程序的执行线程能够在着色器程序中(在着色器程序的一系列指令中)的不同开始(进入)点处,开始执行着色器程序。
在着色器程序中,应存在用于执行线程的至少两个进入点。在一个优选实施方式中,仅存在着色器程序中的、用于执行线程的两个进入点。在其它实施方式中,存在着色器程序中的、用于执行线程的两个以上进入点。在优选的这种实施方式中,存在着色器程序中的、用于执行线程的三个进入点。着色器程序中所提供的用于执行线程的进入点可以被选择为期望的。进入点中的一个应为并且优选地为着色器程序的开始(即,进入点中的一个处于着色器程序的一系列指令中的第一指令处,并且根据该第一指令,线程可以在例如不依赖由任何其它线程输出的数据的情况下被正确执行为完成)。由此,该进入点可以包括着色器程序中的公用操作。
着色器程序中其它进入点或多个进入点的位置可以被选择为期望的。在特别优选的实施方式中,在着色器程序中存在处于着色器程序中的计算着色器程序中的公用表达的指令中的一些(并且优选地为全部)之后(即,将对于讨论中的一组多个线程(工作项)中的各线程(各工作项)产生相同的结果)的第二进入点。最优选地,着色器程序中存在处于执行着色器程序中的公用表达的所有指令之后(并且优选为紧接所有指令之后)的、用于执行线程的进入点。
申请人意识到,除了含有与要执行的一组多个线程中的(所有线程公用)所有线程(工作项)有关(将对于所有线程产生相同结果的)的公用表达的着色器程序之外,还可以存在仅与要执行的整组线程(工作项)中的线程(工作项)的子集有关(将对于子集产生相同结果的)公用表达。这可以是例如着色器程序的执行线程被分组到各工作组的情况(诸如可以是计算着色器(诸如OpenCL和DirectCompute)的情况)。在这种情况下,可以存在将对于工作组中的各线程(工作组)产生相同结果,但可以或将对于不同工作组产生不同结果的一组表达。
由此,在特别优选的实施方式中,可以使执行线程除了在着色器程序中执行对于执行着色器程序的一组线程(工作项)中的所有线程(工作项)公用的表达的多组指令之后开始执行着色器程序之外,还在执行着色器程序中将对于执行着色器程序的执行线程(工作项)组的子集或多个子集“公用”的表达的指令之后开始执行着色器程序。
由此,在特别优选的实施方式中,存在着色器程序中处于执行着色器程序中的公用表达的第一指令组之后的、用于执行线程的开始点,和着色器程序中处于执行着色器程序中的公用表达的第二指令组之后的另一个开始点。在这种情况下,开始点中的一个优选地处于执行着色器程序中将对于执行线程的子集(例如,优选地对于给定工作组中的执行线程)产生公用结果的表达的指令组之后。
对应地,在特别优选的实施方式中,存在用于执行线程的、着色器程序中的三个开始点,一个开始点处于着色器程序起点处,一个开始点处于执行着色器程序中的公用表达的第一指令组之后,并且第三开始点处于执行工作组中的公用表达的第二指令组之后。
在这种情况下,执行公用表达的第一指令组可以为(并且优选地为)总体上执行着色器程序的公用表达的指令,执行公用表达的第二指令组然后为执行各工作组的公用表达的指令。
该布置优选地可以适于,执行线程可以被分组到工作组中的着色器操作和着色器程序(诸如,可以为计算着色器(诸如OpenCL和DirectCompute)的情况)。
可以以任意合适且期望的方式且由整体数据处理系统的任意合适且期望的元件在着色器程序中或有关着色器程序,来确定并提供着色器程序线程执行“进入点”。
在特别优选的实施方式中,由用于图形处理流水线的编译器(着色器编译器)来确定并设置着色器程序线程执行开始点。由此,编译器优选地确定着色器程序中的适当开始点。使编译器识别线程执行开始点,具有编译器能够访问着色器程序以确定是否可以包括要执行的着色器程序中的后面开始点的优点。
在特别优选的实施方式中,编译器分析例如由需要由图形处理流水线进行的处理的主处理器上的应用提供的着色器程序代码,并且确定着色器程序执行中的多个开始点是否可以,并且如果可以,那么确定这些开始点应该在哪里。
在特别优选的实施方式中,编译器还可操作为(在这是可行的情况下)重新排序着色器程序中的表达(操作),以便例如提供在着色器程序执行中包括后面线程开始点的机会,和/或以便允许后面线程开始点在执行着色器程序中的更有效包含和使用。
在这一点上,编译器优选地操作为,将对于要执行着色器程序的一组线程(工作项)中所有线程(工作项)产生公用(相同)结果的任意着色器程序表达(操作)(的指令),置于着色器程序的执行顺序中的早期(并且优选地置于执行顺序的起点处)。优选地,编译器还识别并操作为,将对于要执行着色器程序的一组线程(工作项)中线程(工作项)的子集产生公用(相同)结果的任意着色器程序表达(操作)(的指令),置于着色器程序执行中的早期(朝向着色器程序执行的开始),并且优选地处于(并且优选地紧接)将对于一组线程(工作项)中所有线程(工作项)产生公用结果的任意表达(操作)(的指令)之后。
对应地,编译器优选地将(明确)需要对于各线程(工作项)单独执行(即,潜在地将对于各单独线程(工作项)产生不同的结果)的任意着色器程序表达(操作)(的指令),朝向着色器程序执行的末尾放置(并且至少在将对于多个线程(工作项)产生公用结果的着色器程序表达(操作)(的指令)的一些并且优选地为全部之后)。
最优选地,编译器操作为,将执行需要对于各工作项单独执行的表达的、依赖执行着色器程序中的公用表达的较早指令的结果的任意着色器程序指令,置于执行着色器程序中的公用表达之后(或者至少在执行着色器程序中这些指令所依赖的公用表达的指令之后)。这可以包括例如将指令简单地置于着色器程序中执行公用表达的所有指令之后,或者布置可以为使得将指令至少置于执行这些指令所依赖的公用表达的指令之后。
对应地,在特别优选的实施方式中,在着色器程序包括执行需要对于各工作项单独执行的表达的、但不依赖执行着色器程序中的公用表达的较早指令的结果的指令的情况下,那么不依赖执行着色器程序中的公用表达的较早指令的结果的这些指令,优选地被设置为在执行公用表达的指令之后但在依赖公用表达的任意“每工作项”指令之前地发生在着色器程序的一系列指令中。
对应地,着色器程序中公用表达指令执行之后的任意开始点优选地被设置为,处于不依赖公用表达的任何例如每一工作项、指令的起点处。那么,这可以允许例如要在着色器程序执行序列中的该后面点处开始的执行线程在完成执行公用表达的指令之前开始执行指令。
编译器可以例如(并且在优选实施方式中是)运行在包括图形处理流水线的整个数据处理系统的主处理器上(那么,该图形处理流水线处于与主处理器关联的另一个处理器上(诸如图形处理器)(使得编译器和所编译代码运行在整个数据处理系统内的单独处理器上))。然而,其它布置将是可以的,诸如编译器运行在与所编译代码相同的处理器上,或者编译器运行在(完全)独立的处理器上,诸如程序预先编译在独立的系统上且以编译形式分布。
可以(并且在一个实施方式中是)对于要由图形处理流水线执行的每一个着色器程序考虑以本发明的方式进行的识别,并提供要执行着色器程序中的多个线程执行开始点的操作。还将可行的是,尝试仅对于特定种类或类型的着色器程序但不对于其它种类或类型的着色器程序(例如在着色器程序的类型不太可能提供有用的多个线程执行开始点的情况下)识别并提供多个线程执行开始点。
不必每一个着色器程序必须具有它所包括的多个线程执行开始点(例如在编译器确定合适的多个线程执行开始点不存在,或无法在讨论中的着色器程序中如此有用)。
本发明还延伸至编译器本身。
由此,根据本发明的另一个方面,提供了一种编译器,该编译器编译程序以产生指令,该指令针对图形处理流水线的着色阶段,该着色阶段执行指令以执行着色操作;
其中,对于要由着色器阶段执行的着色器程序,所述编译器被配置为:
在所述着色器程序的执行顺序中,把针对将对于要执行所述着色器程序的工作项组中的所有工作项产生相同结果的着色器程序表达的指令,置于需要对于各工作项单独执行的着色器程序表达的指令之前。
根据本发明的另一个方面,提供了一种编译程序以产生指令的方法,该指令针对图形处理流水线的着色阶段,该着色阶段执行指令以执行着色操作;
对于要由着色器阶段执行的着色器程序,所述方法包括以下步骤:
在所述着色器程序的执行顺序中,把针对将对于要执行所述着色器程序的工作项组中的所有工作项产生相同结果的着色器程序表达的指令,置于需要对于各工作项单独执行的着色器程序表达的指令之前。
如本领域技术人员将理解的,本发明的这些方面可以并优选地包括这里所述的本发明的可选特征中的一个或多个或全部。
由此,例如,编译器还优选地识别并操作为,把针对将对于要执行着色器程序的工作项组中工作项的子集产生相同结果的任意着色器程序表达的指令,置于需要对于各工作项单独执行的着色器程序表达的指令之前,并且优选地置于(并且优选地紧接)将针对对于工作项组中所有工作项产生公用结果的表达的任意指令之后。
对应地,编译器操作为,将执行需要对于各工作项单独执行的表达的、依赖执行着色器程序中的公用表达的较早指令的结果的任意着色器程序指令,置于执行着色器程序中的公用表达之后(或者至少在执行着色器程序中这些指令所依赖的公用表达的指令之后)。
类似地,在特别优选的实施方式中,在着色器程序包括执行需要对于各工作项单独执行的表达的、但不依赖执行着色器程序中的公用表达的较早指令的结果的指令的情况下,那么不依赖执行着色器程序中的公用表达的较早指令的结果的这些指令优选地被设置为,在执行公用表达的指令之后但在依赖公用表达的任意“每工作项”指令之前地发生在着色器程序的一系列指令中。
执行线程可以被配置为,能够以任意合适且期望的方式在着色器程序中的后面阶段中开始执行着色器程序。例如,线程可以分配不同的初始程序相反值,以将它们设置到着色器程序的不同“进入点”(并且在一个优选实施方式中进行了这一点)。在这种情况下,着色器程序内的不同开始点可以经由不同的绝对程序相反值来执行,或者可以有例如指示着色器程序中的第一开始点的一个程序相反值,然后,与该程序相反值的偏移用于表示并触发着色器程序内的其它开始点。
另外地或另选地,仅要在线程在着色器程序中的特定开始点(例如在着色器程序的起点处)开始时执行的着色器程序中的指令(诸如对应于公用表达的指令)可以像这样地来表示(例如标记),执行线程对应地被配置为执行这些指令或不执行这些指令,视情况而定。
例如,对应于公用表达的指令可以像这样地来表示,那么执行线程检查指示在线程遇到标记后的“公用表达”指令时是否已完成这些指令的标记或其它指示,并且如果例如尚未设置指示完成这些指令的标记,则执行“公用表达”指令,或者如果设置指示由另一个线程完成公用表达指令的标记或其它指示,则跳过(省略)这些指令。
执行线程本身也可以或代替被配置为执行(或不执行)着色器程序中的特定指令。例如,线程可以表示为,将(并应当)执行对应于公用表达的指令的线程(反之亦然)。
可以使得执行线程以任意合适且期望的方式在着色器程序中的不同开始点处开始执行着色器程序。
例如,可以初始发布执行线程,以在着色器程序的起点处开始它们的执行,直到一个执行线程退出(完成着色器程序)为止,那么,其后发布的任意执行线程被配置为,在后面点处(例如,在着色器程序中的公用表达之后)开始着色器程序。在这种情况下,将可行的是,执行在着色器程序的起点处开始的单个线程,所有其它线程在着色器程序中的后面开始点处开始且受阻(或不发布),直到完成第一线程为止,或者另选地,可以连续发布在着色器程序的起点处开始的线程,直到一个线程完成为止,那么,其后发布的线程具有后面的开始点。由线程完成着色器程序可以以任意适当且期望的方式(例如,通过设置标记)来指示。
在特别优选的实施方式中,在着色器程序中的后面点处的指令依赖着色器程序中较早指令的完成的情况下,那么,而不是等待第一线程在开始执行要在着色器程序中稍后开始的线程之前完成着色器程序,追踪并监测由(早期)线程进行的着色器程序中的特定指令或多组指令的完成,并且当线程完成着色器程序中的相关指令或相关组指令时,那么释放要开始在后面开始点开始着色器程序的线程,以便执行。
由此,在特别优选的实施方式中,着色器程序中的指令或多组多个指令被表示为,依赖由线程进行的着色器程序中的较早指令的完成,并且一旦由线程完成较早指令时,则仅允许在着色器程序中的较早指令之后(但在依赖这些较早指令的指令或一组(多组)多个指令之前)开始着色器程序的线程开始执行讨论中的指令或一组(多组)多个指令。
当完成较早指令以指示满足依赖关系(使得然后可以由自己未完成较早指令的线程正确执行后面指令)时,可以依照要求例如通过设置适当的指示(诸如标记)来提供完成较早指令的指示。
后面指令对较早指令的依赖关系可以以着色器程序内的任意期望的粒度级别(分辨率)来追踪并使用。
例如,可以简单地存在这样的依赖关系,需要在依赖关系被认为(并指示为)被满足之前完成将产生后面指令所需的结果的所有较早指令(诸如并且优选地为与公用表达有关的所有较早指令)。
另选地或另外地,依赖关系可以被设置为,与例如单独较早指令或多组较早指令要获得的单独公用表达(值)有关的这些指令的等级,然后,允许在完成讨论中的早期公用表达时执行依赖讨论中的特定公用表达的后面指令。
例如,在根据不同(例如,定义的)的指令组(该组可以含有一个或多个指令)组织着色器程序的情况下,那么,各这种指令组可以被表示为,具有(例如,评价公用表达的)对着色器程序中的较早指令或指令组的依赖关系,对于尚未执行较早指令或指令组的线程阻止后面的指令组的执行,直到线程执行较早指令或指令组以对于该较早指令或指令组产生相关结果(数据值或多个数据值)为止。
在优选实施方式中,存在这样的线程调度器,其监测由线程完成着色器程序的指令,且释放要在注意到满足讨论中的线程或多个线程的相关早期依赖关系时释放要在着色器程序中的后面点开始的线程。
在特别优选的实施方式中,执行着色器程序中的公用表达的指令的线程的执行(和执行公用表达的这些指令的执行)被优先考虑为被执行的着色器程序,以便尝试在对于讨论中的线程组执行着色器程序期间尽早地产生这些公用表达的结果。然后,这将有助于确保可以更早地(并且优选地在对于讨论中的指令组执行着色器程序中尽早地)满足对着色器程序内的公用表达的任意依赖关系(即,更早提供所需的结果)。线程调度器可以例如(并且优选地是)被配置为,优先考虑执行着色器程序中的公用表达的指令的执行和完成,以便实现这一点。例如,优选地,执行着色器程序中的公用表达的第一线程被优先考虑在执行着色器程序的其它线程的执行之上。
在一个优选实施方式中,对于要处理的各工作项(例如,顶点、片段或计算着色器工作项)发布单个线程,使得在要对于工作项执行着色器程序的多个部分(例如包括公用表达的一部分或多部分和包括每工作项表达的一部分)的情况下,将对于工作项发布执行所有相关指令的单个线程。
在另一个优选实施方式中,可以对于给定工作项发布多个执行线程。在这种情况下,在要对于工作项执行着色器程序的多个部分的情况下,那么优选地,对于工作项发布多个执行线程,例如优选地,对于要对于工作项执行的着色器程序的各部分发布一个执行线程。由此,例如,在着色器程序(通过使不同的开始点处于着色器程序内)被划分为多个部分的情况下,优选地确定将需要对于工作项执行着色器程序的不同部分中的多少个,然后,针对要对于工作项执行的着色器程序的各部分发布一个执行线程。在这种情况下,优选地在它们要执行的着色器程序的部分的各相关开始点处开始多个线程,并且优选地一旦线程完成着色器程序的相关部分,则线程完成。
由此,在特别优选的实施方式中,着色器程序实际上被划分为多个部分,各部分处于着色器程序内的各对进入(开始)点之间,并且对于要对于讨论中的工作项执行的着色器程序的各部分的给定工作项发布各执行线程。
着色器程序优选地被划分为:(至少)含有用于着色器程序内的公用表达的指令的第一部分,和含有用于需要对于各工作项单独执行的表达的指令的第二部分。
在一个优选实施方式中,着色器程序被划分为三个部分,含有执行要执行着色器程序的所有工作项公用表达的指令的第一部分,含有执行要执行着色器程序的工作项的各工作组公用表达的指令的第二部分、以及含有执行要对于各工作项单独执行的表达的指令的第三部分。
对应地,在优选实施方式中,在需要对于工作项执行着色器程序的部分的依赖关系中,为对于要执行着色器程序的工作项执行着色器程序发布执行每工作项指令的一个执行线程或两个执行线程(一个线程执行每工作组公用表达指令,并且一个线程执行每工作项指令)或三个执行线程(一个线程执行全局公用表达,一个线程执行工作组公用表达,并且一个线程执行每工作项表达指令)。
通过执行着色器程序中的公用表达产生的结果(数据值)应(并且优选地是)被使得可用于执行着色器程序的其它线程(具体地为用于在后面点开始着色器程序由此不自己执行用于讨论中的公用表达的指令的其它指令)。这些公用表达结果(数据值)可以被提供,以任意合适且期望的方式用于其它执行线程。在优选实施方式中,结果被存储为可用于执行着色器程序的其它执行线程。
公用表达结果(数据值)可以存储在可用于图形处理流水线的任意合适储存器中。由此,它们可以例如适当地存储在存储器中,然后,对于线程从存储器加载这些值的加载操作(指令),用于在其它线程和着色器程序中的后面表达需要这些值时加载这些值。然而,在特别优选的实施方式中,由着色器程序中的公用表达产生的结果(数据值)存储在图形处理流水线的适当局部储存器(诸如缓存)中,并且最优选地,存储在图形处理流水线中的寄存器中。数据值优选地存储与适当的局部储存器(例如,优选地为寄存器)中,被执行着色器程序的所有线程共享,使得在不需要从其它存储器加载这些值的情况下,这些值可用于由用于着色器程序的后面部分的其它线程使用。
由此,常数表达的结果可以存储在存储器中,然后对于各线程加载,或者结果可以存储在局部储存器(诸如寄存器或缓存)中,然后线程直接从例如(优选地为)寄存器文件读出结果。
在来自公用表达的结果存储在局部储存器(例如,寄存器)中的情况下,那么,在一个优选实施方式中,该数据还存储到存储器以及局部储存器(例如,寄存器)中,使得必要时如果再次需要数据值但数据值不再可用于局部储存器(例如,寄存器)中时,则可以从主存储器重新加载数据。由此,在这些实施方式中,公用表达数据写入将是一致的。在这种情况下,还优选地(例如,通过设置标记)记录公用表达数据值可用于存储器中,以便需要时再使用。
另选地,公用表达结果(数据值)可以唯一地存储在局部储存器中,并且如果必须丢弃这些数据值,但再次需要时,那么优选地例如通过发布将再次执行公用表达的线程或多个线程来重现计算它们。(因为重新执行公用表达将产生的数据值,所以丢弃早期公用表达结果在本解决方案中是可接受的。)由此,在另一个优选实施方式中,公用表达的结果保持在储存器(例如,寄存器)中,但不写回到其它装置(例如,主存储器)。
如本领域技术人员将理解的,本发明的图形处理单元将是整个图形处理系统的一部分,该图形处理系统将包括(例如优选地)例如执行由图形处理单元进行的图形处理的应用的主处理器。主处理器将向图形处理单元发送适当的命令和数据,以控制图形处理单元执行图形处理操作,并产生主处理器上执行的应用所需的图形处理(渲染)输出。为了方便该处理,主处理器应(并且优选地是)还执行用于图形处理单元的驱动器和用于编译要由图形处理单元的可编程执行单元执行的着色器程序的编译器或多个编译器。
图形处理单元还可以包括存储这里所述的数据和/或由图形处理单元产生的输出数据,和/或存储用于执行这里所述的处理的软件的一个或更多个存储器和/或存储装置(和/或与该存储器和/或存储装置通信)。图形处理单元还可以与主微处理器和/或与用于基于由图形处理单元产生的数据而显示图像的显示器通信。
执行着色器程序的图形处理单元的可编程执行单元可以(优选地是)起任意合适且期望的图形处理着色器阶段(着色器)(诸如顶点着色器、几何着色器、片段着色器、计算着色器等)的作用(操作为这些着色器阶段),图形处理流水线可以包括这些着色器阶段。在优选实施方式中,可编程执行单元可以操作为这些着色器中的每一个。
图形处理单元的可编程执行单元或各可编程执行单元可以包括:任意合适的可编程硬件元件(诸如可编程处理电路)。各可编程处理阶段可以被设置为与处理流水线的其它可编程阶段独立的电路元件,或者可编程处理阶段可以共享它们的可编程处理电路中的一些或全部(该可编程处理电路然后被不同地编程为充当期望的可编程处理阶段)。
除了任意可编程处理(着色器)阶段之外,图形处理流水线还可以含有图形处理流水线可以含有的任意其它合适且期望的处理阶段(诸如光栅化器、早期深度(或早期深度和模版)测试器、后面深度(或深度和模版)测试器、融合器、拼块缓存、写出单元等)。
本发明可以用于可以使用图形处理单元产生的所有形式的输出(诸如用于显示的帧、纹理渲染输出等)。来自图形处理的输出(例如所着色的片段、数据值)优选地导出到外部(例如,主存储器),以便存储和用于诸如用于显示器的帧缓存。
本发明可用于任意合适形式或配置的图形处理器。本发明特别可用于基于拼块的图形处理器和图形处理系统。由此,在优选实施方式中,图形处理系统和图形处理流水线分别为基于拼块的系统和流水线。
在特别优选的实施方式中,可以在产生并输出例如写到用于显示装置的帧缓存的所渲染片段数据的单个图形处理平台上来实现本发明的各种功能。
本发明可以在任意合适的系统(诸如合适配置的基于微处理器的系统)中实施。在优选实施方式中,本发明在计算机和/或基于微处理器的系统中实施。
可以以任意期望且合适的方式来实现本发明的各种功能。例如,本发明的功能可以依照要求以硬件或软件来实施。由此,例如,除非另外指示,发明的各种功能元件、阶段以及“装置”可以包括可操作为,执行各种功能等的合适的处理器或多个处理器、控制器或多个控制器、功能单元、电路、处理逻辑、微处理器布置等(诸如适当专用的硬件元件和/或可以被编程为以期望方式操作的可编程硬件元件)。
这里还应注意,如将由本领域技术人员理解的,可以复制和/或在给定处理器上并行实现本发明的各种功能等。同样地,各种处理阶段可以依据要求共享处理电路等。
受制于进行上面讨论的具体功能需要的任意硬件,数据处理系统和流水线另外可以包括:数据处理流水线所包括的普通功能单元等中的任意一个或多个或全部。
还将由本领域技术人员理解的是,本发明的所述方面和实施方式中的全部可以(并且优选地是)包括这里所述的优选且可选特征中的任意一个或更多个或全部。
根据本发明的方法可以至少部分使用软件(例如,计算机程序)来实施。由此,将看出,当从另外方面观察时,本发明提供在安装于数据处理装置上时,特别适于进行这里所述的方法的计算机软件、包括用于运行在数据处理装置上时执行这里所述的方法的计算机软件代码部分的计算机程序元件、以及包括适于运行在数据处理系统上时执行这里所述的方法或多个方法的全部步骤的代码装置的计算机程序。数据处理器可以为微处理器系统、可编程FPGA(现场可编程门阵列)等。
本发明还扩展为包括计算机软件载体,该计算机软件载体包括在用于操作包括数据处理装置的图形处理器、渲染器或为微处理器时连同所述数据处理装置一起使得所述处理器、渲染器或系统进行本发明的方法的步骤的这种软件。这种计算机软件载体可以为物理存储介质(诸如ROM芯片、CD ROM、RAM、闪存或盘),或者可以为信号(诸如电线上的电子信号、诸如到卫星的光信号或无线电信号等)。
还将理解,并非所有的、本发明的方法的步骤需要由计算机软件来实现,由此,根据更广泛的方面,本发明提供计算机软件和安装在计算机软件载体上用于实现这里所阐述的方法步骤中的至少一个的这种软件。
因此,本发明可以合适地实施为与计算机系统一起使用的计算机程序产品。这种实施方案可以包括固定在有形、非暂时介质(诸如计算机可读介质,例如,磁盘、CD-ROM、ROM、RAM、闪存或硬盘)上的一系列计算机可读指令。该实施方案还可以包括可通过有形介质(包括但不限于光或模拟通信线路)或使用无线技术(包括但不限于微波、红外或其它传输技术)无形地经由调制解调器或其它接口装置发送到计算机系统的一系列计算机可读指令。该一系列计算机可读指令实施这里之前所述的功能中的全部或部分。
本领域技术人员将理解,这种计算机可读指令可以以若干编程语言来书写,以便与许多计算机架构或操作系统一起使用。另外地,这种指令可以使用任意(现有的或将来的)存储技术(包括但不限于半导体、磁或光)来存储,或者可以使用任意(现有的或将来的)通信技术(包括但不限于光、红外或微波)来传输。考虑的是,这种计算机程序产品可以被发布为,具有伴随的打印或电子文件的可移除介质(例如,用收缩膜包装的软件),在例如系统ROM或固定硬盘上预加载有计算机系统,或者通过网络(例如因特网或万维网)从服务器或电子布告板来发布。
附图说明
现在将仅经由示例并参照附图描述本发明的若干优选实施方式,附图中:
图1示出了示例性计算机图形处理系统;
图2示意性示出了可以以本发明的方式操作的图形处理流水线;
图3示意性示出了图形处理单元;
图4示出了着色器程序的示例;
图5示出了本发明的实施方式中的着色器程序构造的示例;
图6示出了本发明的另一个实施方式中的着色器程序构造的示例;
图7示意性示出了图6中所示的实施方式中的线程的执行;
图8示出了图6和图7中所示的实施方式中的线程的执行时序的示例;
图9示出了本发明的另一个实施方式中的着色器程序构造的示例;
图10示意性示出了图9中所示的实施方式中的线程的执行;以及
图11示出了图9和图10中所示的实施方式中的线程的执行时序的示例.
在适当的情况下,在附图中,相同的附图标记用于相同的部件。
具体实施方式
现在将在处理计算机图形以便显示的场境下描述本发明的若干优选实施方式。
图1示出了典型的计算机图形处理系统。
在主处理器1上执行的应用2(诸如游戏)将需要要由所关联图形处理单元(图形处理流水线)3执行的图形处理操作。为此,该应用将生成由在主处理器1上运行以生成对图形处理器3的适当命令,以产生应用2所需的图形输出的图形处理流水线3的驱动器4解释的API(应用编程接口)调用。为了促进该过程,将响应于来自运行在主系统1上以便图形输出(例如,以产生要显示的帧)的应用2的命令,而向图形处理器3提供一组“命令”。
图2更详细地示出了本实施方式的图形处理流水线3。
图2中所示的图形处理流水线3为基于拼块(tile-based)的渲染器,并且由此将产生渲染输出数据阵列的拼块(诸如要产生的输出帧)。
在基于拼块的渲染中,不是将整个渲染输出(例如,帧)作为立即模式渲染一举有效处理,渲染输出(例如,要显示的帧)被划分为多个更小的子区域(通常称为“拼块”。各拼块(子区域)被单独渲染(通常一个接一个),然后,重新组合所渲染的拼块(子区域),以提供完成的渲染输出(例如,显示的帧)。在这种布置中,渲染输出通常划分为规则尺寸和形状的子区域(拼块)(子区域通常为例如方形或矩形),但这不是必要的。)
渲染输出数据阵列如本技术领域中已知的通常为用来显示在显示装置(诸如屏幕或打印机)显示的输出帧,但还可以例如包括用于稍后渲染途径(也称为“纹理渲染(renderto texture)”输出)的中间数据等。
(当要显示计算机图形图像时,该图像通常首先被定义为一系列基元(primitive)(多边形),该基元然后反过来被划分(光栅化)为用于图形渲染的图形片段。正常图形渲染操作期间,渲染器将修改(例如)与各片段关联的颜色(红色、绿色以及蓝色(RGB)和透明度(阿尔法,α)数据),使得可以正确显示片段。一旦这些片段完全穿过渲染器,那么它们的关联数据值存储在存储器中,准备输出(例如,以便显示)。)
图2示出了与本实施方式的操作相关的图形处理流水线3的主要元件和流水线阶段。如本领域技术人员将理解的,可以存在图2中未例示的、图形处理流水线的其它元件。这里还应注意,图2仅是示意性的,并且例如,在实践中,即使所示的功能单元和流水线阶段在图2中被示意性地示出为独立的阶段,但它们也可以共享有效的硬件电路。还将理解,如图2所示的图形处理流水线的阶段、元件以及单元等中的每一个可以按需实施,因此将包括例如用于执行需要操作和功能的适当电路和/或处理逻辑等。
如图2所示,图形处理流水线3包括若干阶段,包括顶点着色器20、外壳着色器(hull shader)21、曲面化器22、域着色器23、几何着色器24、光栅化器25、早期Z(深度)和模版测试阶段26、呈片段着色阶段形式的渲染器27、后期Z(深度)和模版测试阶段28、融合阶段29、拼块缓存30、以及降采样和写出(多样本分解)阶段31。
顶点着色器20取得对于要生成的输出定义的、与顶点等关联的输入数据值,并且处理这些数据值,以产生用于图形处理流水线3的随后阶段的一组对应“顶点着色的”输出数据值。顶点着色例如修改输入数据,以考虑要渲染图像中的光照的影响。
外壳主色器21对成组的斑块控制点执行操作,并生成称为斑块常数的附加数据,镶嵌阶段22细分几何结构,以创建外壳的高阶表示,域着色器23对镶嵌阶段(类似于顶点着色器)所输出的顶点执行操作,并且几何着色器23处理全部基元(诸如三角形、点或线)。这些阶段连同顶点着色器21一起响应于提供给图形处理流水线3的命令和顶点数据,而有效地执行所有需要的片段前端操作(诸如转换和光照操作)和基元设置,以设置要渲染的基元。
图形处理流水线3的光栅化器25操作,以将将组成渲染输出(例如,要显示的图像)的基元光栅化为,用于处理的单独图形片段。为此,光栅化器25接收用于渲染的图形基元,将基元光栅化为采样点,并生成具有用于渲染基元的适当位置(表示适当的采样位置)的图形片段。
然后,光栅化器所生成的片段向前发送到用于处理的流水线的剩余部分。
早期Z/模版阶段26对从光栅化器25接收的片段执行Z(深度)测试,以看看在该阶段是否可以丢弃(剔除)任意片段。为此,早期Z/模版阶段26将由光栅化器25产生的片段(与片段关联)的深度值与已渲染的片段的深度值(这些深度值存储在作为拼块缓存30的一部分的深度(Z)缓存中)进行比较,以确定新片段是否将被已渲染的片段堵塞。同时,进行早期模版测试。
然后,向片段着色阶段27发送通过片段早期Z和模版测试阶段26的片段。片段着色阶段27对通过早期Z和模版测试的片段执行适当的片段处理操作,以便处理片段,以生成适当的所渲染片段数据。
该片段处理可以包括任意适当且期望的片段着色处理(诸如对片段执行片段着色器程序、将纹理化应用于片段、将雾化或其它操作应用于片段等),以生成适当的片段数据。在本实施方式中,片段着色阶段27为着色器流水线(可编程片段着色器)的形式。
然后,存在“后期”片段Z和模版测试阶段28,该“后期”片段Z和模版测试阶段28尤其对所着色片段进行流水线深度测试的结束,以确定在最终图像中是否将实际看到所渲染的片段。该深度测试将拼块缓存30中的Z缓存中所存储的片段位置的Z缓存值,用于通过如本技术领域中已知的将由片段着色阶段27产生的片段的(与该片段关联的)深度值与(如深度缓存中所存储的)已渲染的片段的深度值进行比较,来确定新片段的片段值是否应替换已渲染的片段的深度值。该后期片段深度和模版测试阶段28还对片段进行任意需要的“后期”阿尔法和/或模版测试。
然后,如果需要,则通过后期片段测试阶段28的片段经受使用融合器29中的拼块缓存30中已存储的片段的任意需要的融合操作。在该阶段还进行片段所需的任意其它操作(诸如颤振等(未示出))。
最后,(融合的)输出片段数据(值)写入拼块缓存30,例如,从该缓存30可以向帧缓存输出输出片段数据,以便显示。输出片段的深度值也适当地写入拼块缓存30内的Z缓存。(拼块缓存存储颜色和深度缓存,颜色和深度缓存分别存储缓存表示的各采样点(大体上为所处理的拼块的各采样点)的适当颜色等、或Z值。)这些缓存存储表示全部渲染输出(例如,要显示的图像)的一部分(拼块)的片段数据的阵列,缓存中的各组样本值对应于全部采样输出的各像素(例如,各2x 2组样本值可以对应于输出像素,其中,使用4x多采样)。
拼块缓存被设置为位于图形处理流水线(芯片)上(本地)的RAM的一部分。
来自拼块缓存30的数据输出给降采样(多采样分解)写出单元31,从此输出给(写回)给外存储器输出缓存(诸如显示器的帧缓存(未示出))。(显示装置可以包括例如包括像素阵列的显示器(诸如计算机监测器或打印机))。
降采样和写出单元21将拼块缓存30中所存储的片段数据降采样为,用于输出缓存(装置)的适当分辨率(即,使得产生对应于输出装置的像素的像素装置的阵列),以产生向输出缓存输出的输出值(像素)。
一旦处理了渲染输出的拼块且它的输出导出到主存储器(例如,导出到主存储器中的帧缓存(未示出))存储,那么处理下一拼块等,直到处理足够的拼块,以生成整个渲染输出(例如,要显示的帧(图像))。然后,对于下一渲染输出(例如,帧)等重复处理。
当然,图形处理流水线3的其它布置将是可以的。
上面描述了图1中所示的图形处理系统的操作的特定特征。现在将描述根据本发明的实施方式的、图1中所述的图形处理系统的另外特征和操作。
如可以从图2中看出的,图形处理流水线3包括若干可编程处理或“着色器”阶段(即,顶点着色器20、外壳着色器21、域着色器23、几何着色器24以及片段着色器27)。这些可编程着色器阶段执行由应用所提供的、具有一个或更多个输入变量且生成成组的输出变量的各着色器程序。
为此,应用2提供使用高级着色器编程语言(诸如GLSL、HLSL、OpenCL等)实施的着色器程序。然后,这些着色器程序经由着色器语言编译器翻译为,用于目标图形处理流水线3的二进制代码。这如本技术领域中已知的可以包括:编译器内程序的一个或更多个中间表示的创建。(在存在使得编译器运行的专用API调用的情况下,编译器例如可以为驱动器4的一部分。由此,编译器执行可以被视为,由驱动器响应于应用所生成的API调用而进行的绘制调用准备的一部分。)
图2示意性示出了图形处理单元3的操作阶段。
图3示出了图形处理单元3用于执行(由此充当)图2中所示的图形处理流水线的各个处理操作和阶段的对应功能单元。(在图形处理单元3中可以存在其它的功能单元。为简单起见,图3仅示出了与呈本发明的方式的操作相关的这些功能单元。)
如图3所示,图形处理单元3包括光栅化器40、线程产生器(thread spawner)41、可编程执行单元42、改变内插器43、纹理映射器44、融合器45以及一组寄存器46。
线程产生器41可操作为,产生用于由可编程执行单元42执行的执行线程(例如,对于可编程执行单元从光栅化器40接收的片段)。
可编程执行单元42操作为执行着色器程序,以执行图形处理流水线的着色器操作(诸如外壳着色器、顶点着色器以及片段着色器)。为此,可编程执行单元42从线程产生器41接收执行线程,并且对于这些执行线程执行相关的着色器程序。作为该操作的一部分,并且如图3所示,执行线程将从各寄存器46读取数据和向各寄存器46写入数据。
作为该处理的一部分,并且如图3所示,可编程执行单元42可以调用改变内插器43、纹理映射器44以及融合器45执行特定图形处理操作。为此,可编程执行单元将例如响应于执行中的着色器程序中的特定指令,而向相关加速器发送适当的消息(和从相关加速器接收适当的响应)。
改变内插器43操作为跨图形基元插入值,并且作为该操作的一部分,改变内插器43经常创建要用于采样图形纹理的纹理坐标。
纹理映射器44操作为,使用例如改变内插器43所产生的纹理坐标采样图形纹理,并且从此产生过滤的纹理样本结果(该纹理样本结果然后可以返回到可编程执行单元42,以便例如在着色采样点时使用)。
融合器45操作为,融合例如可编程执行单元42所生成的片段着色结果与之前生成的片段着色器结果(诸如已存储在拼块缓存和/或帧缓存中的结果)。
如上所述,可编程执行单元42执行要对于可编程执行单元42从线程产生器41接收的执行线程执行的着色器程序,以执行图形处理操作。
现在将参照图4至图11描述经由可编程执行单元42中的执行线程执行着色器程序的若干优选实施方式。
在这些实施方式中,线程根据本发明可以在着色器程序内的不同开始点处开始执行着色器程序。
如上所述,申请人在这一点上意识到,许多着色器程序可以含有将对于执行着色器程序的多个线程产生相同的结果的表达,以及将需要对于执行着色器程序的各线程独立执行的表达。
图4示出了着色器程序中这种情况的示例。图4示出了示例性片段着色器50,该示例性片段着色器50可以被划分为两个不同的工作负载;片段着色器程序50中的一组表达51,该表达51将对于各执行线程产生相同的结果(由此,可以被认为是“跨线程公用的子表达(CT-CSE:cross-thread-common sub-expression)”工作负载51);以及一组表达52,该表达52需要对于各片段独立执行,由此可以被认为是“每片段”工作负载52。
由此,如图4所示,编译器可以将着色器程序50编译成两个不同的工作负载,“公用表达”工作负载51和“每片段”工作负载52(临时一致值(“一致临时文件夹”)用于存储在执行相关每片段工作负载表达52时用于各片段的公用表达工作负载51的结果。)
然后,当执行这样编译的着色器程序时,单个线程例如可以被配置为执行公用表达51和每片段表达52这两者,但其它线程仅执行每片段表达52(并且使用来自执行公用表达51的线程的结果)。然后,这有助于减少或避免公用表达51对于多个执行线程的重复执行。
图5示出了根据本发明构造的着色器程序60的另一个示例。在这种情况下,着色器程序60的一系列指令包括着色器程序的初始组指令61,其执行“全局”公用表达(即,将对于要执行着色器程序的一组线程(工作项)中的所有线程(工作项)产生相同的结果的表达),且将这些表达的结果存储在寄存器46中。
然后,在着色器程序中存在一组指令52,其执行着色器程序要处理的一组工作项内的给定工作组共用(将对于给定工作组产生相同的结果)的表达,且再次将这些表达存储在寄存器46中。最后,着色器程序包括需要对于各线程(工作项)独立执行的主指令序列63。
如图5所示,线程能够开始在如下各项执行着色器程序:或者在全局共用表达64开始处,或者在工作组共用表达65开始处,或者在主指令序列66开始处。
由此,在优选实施方式中,当执行着色器程序60时,如图5所示,要执行程序60的一组线程的第一工作组的第一线程,将在全局公用表达指令64开始处开始执行着色器程序,各剩余工作组的第一线程将在全局公用表达线程之后和工作组公用表达65开始之前开始,并且将在主指令序列63的开始66时开始任意剩余的线程。
如图5所示,要在着色器程序的开始之后开始执行的任意线程受阻(等待)67、68,直到相关公用表达结果由执行之前的一组公用表达指令而变得可用为止。一旦通过信号通知了由线程完成相关组的公用表达,那么允许在着色器程序执行中具有稍后开始点的线程在它们的开始点处开始执行。
图6示出了类似于图5中所示的着色器程序设置的着色器程序70,由此,该着色器程序70在它开始处具有执行“全局”公用表达的一组指令71,然后具有执行每工作组公用表达的一组指令72,然后最后具有主指令序列73,对应的开始点处于着色器程序74的开始处、工作组公用表达75的开始处、以及主指令序列76的开始处。
然而,如图6所示,工作组公用表达72的一组指令和主指令序列73被进一步细分为:依赖着色器程序中的更早公用表达的指令组;和不依赖着色器程序中的更早公用表达的指令组。
由此,如图6所示,执行“工作组”公用表达的一组指令72被划分为:不依赖全局公用表达指令71的第一组指令77;和依赖全局公用表达71的第二组工作组公用表达指令78,用以阻挡线程的执行直到完成全局公用表达指令71的“等待”点79设置在不依赖全局公用表达71的工作组公用表达指令77之后。
那么,这具有如下的效果:允许在开始工作组公用表达75时开始的任意线程,在完成全局表达指令71的执行之前,开始执行不依赖全局表达71的工作组公用表达指令77。那么,这可以意味着例如到这些线程到达“等待”点79的时候,可能已经完成全局公用表达71,使得实践中的线程从来不需要停止。
对应地,主指令序列73被划分为:不依赖任何公用表达的指令80、依赖全局公用表达71的指令81、以及依赖工作组公用表达72的指令82,存在对应等待点83、84,在这些等待点处,必要时将停止线程直到完成随后主指令所依赖的相关组的公用表达为止。
再次,这然后潜在地允许在76主指令序列的开始时开始的线程在完全执行公用表达之前执行指令(并且,这潜在地使得不需要停止这些线程中的任何线程的执行)。
在该图中,实心黑线示出了线程执行路径,并且点划线示出了跨线程控制信令。由此,如可以看出的,当线程完成全局表达71时,这将以信号通知到等待点79、82,使得然后可以允许到达或停止在这些点处的任意线程继续它们的执行。对应地,当线程完成工作组公用表达72时,向等待点84以信号通知该事件,以允许到达或停止在该点处的任意线程继续它们主指令序列的执行。
着色器编译器被设置为,在它编译着色器程序时生成所编译程序的指令序列,以便(尽可能地)具有图6中所示的顺序和布置。
图7是示出了图6中所示的着色器程序布置的线程的执行的流程图。在该实施方式中,对于要执行着色器程序的各工作项(例如,顶点、片段或计算工作项)生成单个线程,并且各线程遵循图7中所示的流程图。(由此,在该实施方式中,在适当情况下,同一线程将对于给定工作项执行全局公用表达、工作组公用表达以及实际主指令序列。)
(图7仅示出了线程执行流程。为了便于说明,图7中未示出完成工作项的处理所需的其它图形处理单元工作(诸如光栅化、深度/模版测试、融合等)。)
如图7所示,当发布线程时,首先确定线程是否是执行讨论中的着色器程序的第一线程(步骤90)。如果确定线程是执行着色器程序的第一线程,那么确定是否有存在于着色器程序中的任意全局公用表达(步骤91)。如果有,则线程执行这些全局公用表达的指令(步骤92)。
一旦线程在步骤92处完成全局公用表达,那么系统标记这些全局公用表达已完成(或者对应地发送指示全局公用表达完成的信号)(步骤93)。
对应地,如果在步骤91处确定着色器程序中没有全局公用表达,那么立即标记(和/或以信号通知)这些表达完成了(步骤93)。
另一方面,如果在步骤90处确定线程不是程序中的第一线程,那么确定执行中的线程是否是它的工作组中的第一线程(步骤94)。如果确定线程是它的工作组中的第一线程,那么确定着色器程序中是否有任意工作组公用表达(步骤95)。
如图7所示,一旦程序的第一线程完成全局公用表达(或对于该线程确定没有存在的全局公用表达),则对于该第一线程,处理对应地进行到步骤95。
如果在步骤95处确定有工作组公用表达,那么线程执行不依赖公用表达的、工作组公用表达的指令(步骤96)。然后,(必要时)线程等待全局公用表达完成(步骤97和98),并且一旦全局公用表达完成,那么线程执行依赖全局公用表达的、针对讨论中工作组的工作组公用表达的指令(步骤99)。
一旦完成了依赖全局公用表达的工作组公用表达,则工作组公用表达被标记为完成(或者另外以信号通知为完成)(步骤100)。
如图7所示,如果在步骤95处确定没有存在于着色器程序中的工作组公用表达,则将工作组公用表达对应地标记和/或以信号通知为完成。
另一方面,如果在步骤94处确定线程不是工作组中的第一线程,那么线程进行到执行独立于着色器程序中的任意公用表达的、主指令序列中的指令(步骤101)。
对应地,如图7所示,一旦线程完成了工作组公用表达,那么线程进行到执行不依赖任何公用表达的、主指令序列中的指令(步骤101)。
一旦线程完成了独立于公用表达的、主指令序列中的指令,那么(必要时)线程等待直到完成全局公用表达为止(步骤102和103)。一旦完成了全局公用表达,则线程执行依赖全局公用表达的、主指令序列中的指令(步骤104)。然后,(必要时)线程再次等待工作组公用表达完成(步骤105和106),并且一旦完成这些指令,则线程执行依赖工作组公用表达的剩余主指令序列指令(步骤107)。
然后,完成线程执行(步骤108)。
对于要执行着色器程序的各线程重复该处理。
在该处理中,执行公用表达指令的线程将它们的结果保存到适当的寄存器46中,使得然后这些结果在(自己未执行公用指令的)以后的线程执行相关指令序列时可用于以后的线程。若需要,则其它布置(诸如将公用表达结果保存到主存储器,然后对于以后的线程重新装载这些结果)将是可行的。
图8示出了图6和图7中所示的实施方式中的、由示例性线程执行指令的时序。
在图8中,行表示执行线程,并且时间从左向右增大。W[x]表示工作组号x,MIS[x][y]表示对于给定工作组的主指令序列(x为工作组号,y为工作项号),(i)表示独立的指令序列,(dep G)表示依赖全局公用表达的指令序列(全局CT-CSE),并且(dep W)表示依赖工作组公用表达的指令序列(工作组CT-CSE)。
图8示出了由两个工作组(各工作组含有两个工作项(一个工作项映射到一个硬件线程))构成的作业的执行。
图8示出了使用多线程执行单元的、允许独立工作负载同时执行的图形处理单元中该作业的线程的执行时序。这里将理解,图8中所示的执行时序仅是示例性的,并且线程调度例如可以产生与图8中所示的时序不同的时序。(例如,图8假定所有四个线程能够同时开始它们的执行。)
如图8所示,第一工作组中的第一线程120通过执行全局公用表达121而开始。
第一工作组的第二线程122对应地开始执行不依赖着色器程序中的任何公用表达的执行的、该工作组的主指令序列的指令123。如图8所示,一旦完成这些“独立的”指令,则阻止该第二线程的执行。
来自第二工作组的第一线程124对应地开始执行独立于全局表达的、第二工作组的工作组公用表达125。再次,一旦完成独立于全局表达的这些工作组公用表达,则阻止由该线程进行的进一步执行。
第二工作组的第二线程125对应地开始执行独立于任意公用表达的、主指令序列中的指令126。再次,一旦该线程完成这些“独立”指令的执行,则停止该线程的执行。
当第一线程120完成全局公用表达121时,向其它线程以信号通知该事件,并且线程120开始执行独立于全局公用表达121的、第一工作组的公用表达128(的指令),接着是依赖全局表达121的、该工作组的公用表达129。
对应地,释放第二工作组的第二线程122,以执行依赖(现在已由第一线程120完成的)全局公用表达的主指令序列指令130。再次,一旦执行这些指令,则停止该线程的执行。
第二工作组的第一线程124对应地执行依赖(与现在完成的这些表达相同的)全局表达121的、第二工作组的公用表达的指令131。
一旦第二工作组的第一线程124完成了依赖全局表达121的工作组公用表达131,则向其它线程信号通知该事件。
第二工作组的第二线程125对应地被允许执行依赖全局公用表达的主指令序列指令133,然后等待,直到第二工作组的第一线程124完成依赖全局表达121的、针对该工作组的公用表达131为止。
然后,如图8所示,一旦第二工作组中的第一线程完成了针对该工作组的所有公用表达,则第二工作组的线程124和125这两者完成主指令序列指令的任意剩余处理。
对应地,一旦第一工作组的第一线程120完成该工作组的所有公用工作组公用表达的执行,则以信号通知该事件134,然后,第一工作组的第一线程120和第二线程122如图8所示完成它们留下要执行的任意剩余主指令序列指令的执行。
图9示出了执行其指令被组织为对应于图6中所示的序列的序列的着色器程序的另一个实施方式(即,使得存在执行全局公用表达的一组指令71;执行工作组公用表达72的一组指令72,该组指令72被划分为指令的各子集,工作组公用表达的一个子集77不依赖全局公用表达,并且执行工作组公用表达的一个子集78依赖全局公用表达71;以及主指令序列73,该主指令序列73再次被划分为三个子集,主指令的第一子集80(即,每工作项指令)不依赖任何公用表达,每工作项指令的子集81依赖全局公用表达,并且每工作项指令的子集82依赖工作组公用表达。)
再次,在图9中所示的布置中,线程可以在开始(74)全局公用表达71的指令时,或在开始(75)工作组公用表达指令72,或在开始(76)主指令序列(每工作项指令)73时开始执行。
在该附图中,实心黑线再次示出了线程执行路径,并且点划线示出了跨线程控制信令。由此,如可以看出的,当线程完成全局表达71时,将向等待点79、83以信号通知该事件,使得然后可以允许到达或停止在这些点处的任意线程继续它们的执行。对应地,当线程完成工作组公用表达72时,向等待点84以信号通知该事件,以允许到达或停止在该点处的任意线程继续它们主指令序列的执行。
着色器编译器被设置为在它编译着色器程序时生成所编译程序的指令序列,以便(尽可能地)具有图9中所示的顺序和布置。
如上所述,在图6、图7以及图8中所示的着色器程序的执行中,单个线程被产生,且对于各工作项(例如,顶点、片段或计算工作项)执行着色器程序。由此,如果讨论中的工作项要执行所有着色器程序,则将存在执行整个着色器程序的、该工作项的单个线程。
在图9中所示的实施方式中,代替单个线程对于给定工作项执行着色器程序的所有相关部分(即,使得如果工作项要执行着色器程序中的任意公用表达,那么工作项的同一单个线程将执行这些公用表达和每工作项主指令序列这两者),如果工作项要执行着色器程序中的任意公用表达,则对于工作项产生并发布多个线程,一个线程用于要对于讨论中的工作项执行的着色器程序执行的各子部分。
由此,如果要对于工作项执行整个着色器程序,则对于该工作项产生并发布三个线程,以执行着色器程序,一个线程执行全局公用表达71,由此在开始(74)这些表达时开始,一个线程执行工作组公用表达72(由此,在开始(75)这些工作组公用表达时开始它的执行),并且一个线程执行主每工作项指令序列指令73,由此在开始76这些每工作项指令时开始。
对应地,如果要对于工作项执行工作组公用表达和主指令序列,那么将产生两个线程,一个线程执行工作组公用表达72,并且一个线程执行每工作项主指令序列73。最后,如果对于工作项仅需要执行每工作项主指令序列73,那么将对于该工作项产生并发布执行这些指令的单个线程。
因为例如所有工作组公用表达和所有每工作项指令中的非依赖工作负载可以(潜在地)并行运行,所以工作项要执行着色器程序的多于一个“部分”的、产生并执行多个执行线程的该布置允许讨论中工作项的执行的更大并行化。因为该事件可以经由线程完成来表示(因为相关线程将在它完成它执行的着色器程序的相关部分时完成它的执行),所以还可以方便更简单地完成公用表达指令的执行,而不是例如必须以信号通知线程在没有线程实际完成(退出)的情况下到达指令序列中的相关点。
图10是示出了图9中所示的布置中产生并执行线程的流程图。
图10的流程图每工作项(顶点、片段、计算工作项)执行一次。如可以看出的,可以对于给定工作项在执行单元中产生多达三个的硬件执行线程。
图10再次仅示出了线程执行流程。为了便于说明,图10中未示出完成工作项的处理所需的其它图形处理单元工作(诸如光栅化、深度/模版测试、融合等)。
如图10所示,处理中的第一步骤是确定执行中的线程是否是执行着色器程序的第一线程(步骤140)。如果是,那么确定是否有存在执行着色器程序中的全局公用表达的任意指令(步骤141)。如果有,则发布讨论中的工作项的第一线程,以在全局公用表达着色器程序开始(进入)点处开始执行着色器程序(步骤142)。然后,该线程将执行全局公用表达的指令71,并且一旦该线程完成它的这些指令的处理,则以信号通知该事件,并且线程退出。
如果在步骤141处确定着色器程序中没有全局公用表达,那么将全局公用表达标记为完成(步骤143)。
如图10所示,如果在步骤140处确定线程不是执行程序的第一线程,或一旦在步骤142处发布了相关“助手”线程,那么确定线程是否是对于它的工作组执行的第一线程(步骤144)。如果是(从而表示需要对于讨论中的工作组执行工作组公用表达(如果有)),那么确定是否有存在于着色器程序中的用于讨论中的工作组的任意公用表达(步骤145)。
如果确定着色器程序中有用于工作组的公用表达,那么对于工作项发布第二助手线程,以执行着色器程序中的工作组公用表达(步骤146)。然后,该线程对于讨论中的工作组执行着色器程序中的工作组公用表达,并且一旦线程完成其对这些公用表达的处理,则以信号通知该事件,并且线程退出。
另一方面,如果在步骤145处确定没有存在于着色器程序中的工作组公用表达,那么用于讨论中的工作组的工作组公用表达被标记为完成(步骤147)。
如果在步骤144处确定该线程不是工作组中的第一线程,或者一旦在步骤146处发布执行工作组公用表达的助手线程,则对于该工作项发布线程,以执行着色器程序的工作项主指令序列(步骤148)。该线程在开始着色器程序中的工作项主指令序列时进入着色器程序,并且首先执行不依赖着色器程序中的任何公用表达的主指令序列指令80(步骤149)。
一旦线程完成了主指令序列中的非依赖指令,那么(必要时)线程等待,直到(例如,对于完成这些指令的相关助手线程)完成全局公用表达指令为止(步骤150、151),然后,进程进行到执行依赖全局公用表达的每工作项主指令序列指令(步骤152)。
再次,当线程完成依赖全局公用表达的主指令序列指令时,然后,(必要时)线程在执行依赖每工作组公用表达的每工作项主指令序列指令(步骤155)之前等待,直到完成工作组公用表达为止(步骤153和154)。
然后,线程的执行完成(步骤156)。
对于要执行着色器程序的各工作项重复该处理。
在该处理中,执行公用表达指令的线程将它们的结果保存到适当的寄存器46,使得然后这些结果在(自己未执行公用指令的)以后的线程执行相关指令序列时可用于以后的线程。若需要,则其它布置(诸如将公用表达结果保存到主存储器,然后对于以后的线程重新装载这些结果)将是可行的。
图11示出了图9和图10中所示的实施方式的、用于执行线程的对应示例性时序图。
在图11中,再次,行表示执行线程,并且时间从左向右增大。W[x]表示工作组号x,MIS[x][y]表示给定工作组的主指令序列(x为工作组号,y为工作项号),(i)表示独立的指令序列,(dep G)表示依赖全局公用表达的指令序列(全局CT-CSE),并且(dep W)表示依赖工作组公用表达的指令序列(工作组CT-CSE)。
图11再次示出了使用多线程执行单元的、允许独立工作负载同时执行的图形处理单元中线程的执行时序。将再次理解的是,图11中所示的执行时序仅是示例性的,并且线程调度例如可以产生与图11中所示的时序不同的时序。(例如,图11假定所有四个线程能够同时开始它们的执行。)
图11的(a)示出了由单个工作项构成的单个工作组构成的作业的执行,并且对于该执行,着色器程序的不同部分的尺寸使得没有由于线程阻止和等待公用表达结果而产生停止。
由此,如图11的(a)所示,对于要处理的工作项,将发布三个执行线程,第一线程160用于执行全局公用表达,第二线程161用于执行工作组公用表达,并且第三线程162用于执行每工作项指令。
如图11的(a)所示,执行全局公用表达的线程160将在它完成执行这些全局指令时以信号通知该事件。对应地,执行工作组公用表达的线程161将在它完成这些表达时以信号通知。第三线程162将简单地执行主指令序列指令。
如图11的(a)所示,各线程同时开始执行其相关组的指令,并且因为在这种情况下没有由于线程阻止而引起延迟,所以线程简单地连续执行它们的指令,直到它们完成指令为止。
图11的(b)再次示出了在存在单个工作项(和工作组)的情况下的线程的执行时序,但在该情况下,由被发布以完成全局公用表达的线程160进行的全局公用表达的完成,耗费比非依赖工作组公用表达和非依赖每工作项表达的完成更长的时间。由此,如图11的(b)所示,停止执行工作组公用表达的线程161和执行每工作项指令的线程162两者,直到执行全局公用表达的线程160完成这些指令为止。
一旦线程160完成(即,信号通知了完成全局公用表达),那么线程161和162如图11的(b)所示用依赖全局公用表达的相关指令继续它们的执行。
再次,为了例示的目的,假定执行每工作项指令的线程162完成每一工作项,依赖全局公用表达的主指令序列指令在执行工作组公用表达指令的线程161完成它的这些工作组公用表达的执行之前。由此,如图11的(b)所示,停止线程162,直到线程161完成工作组公用表达指令为止。一旦线程161完成(信号通知完成了工作组公用表达指令执行),那么如图11的(b)所示,线程162执行剩余的每工作项主指令序列指令。
如将从上述理解的,本发明(至少在本发明的优选实施方式中)可以提供着色器程序的更有效执行。这(至少在本发明的优选实施方式中)通过允许执行线程在着色器程序的一系列指令内的不同点处开始执行着色器程序来实现,并且具体地通过允许一些线程在执行着色器程序中的公用表达的指令之后开始执行着色器程序来实现。

Claims (19)

1.一种操作图形处理流水线的方法,该图形处理流水线包括可编程着色器阶段,该可编程着色器阶段执行指令以执行着色操作,所述方法包括以下步骤:
当所述着色器阶段要执行着色器程序以执行着色操作时,包括要在执行所述着色器程序时执行的一系列指令的所述着色器程序进行如下操作:
向要执行所述着色器程序的所述着色器阶段发布多个执行线程,以便执行,
其中,向所述着色器阶段发布所述执行线程以便所述着色器程序的执行的步骤被配置为,使得对于所述执行线程中的不同执行线程,所述着色器程序的执行能够在针对所述着色器程序的所述一系列指令内的不同指令处开始,针对将对于要执行所述着色器程序的线程组中所有线程产生公用结果的任意着色器程序表达的指令,在针对所述着色器程序的所述一系列指令中比需要对于各线程单独执行的着色器程序表达的任意指令更早,并且所产生的公用结果被存储起来并由其它线程使用;以及
对于所述执行线程执行所述着色器程序,
其中,对于所述执行线程执行所述着色器程序的步骤包括如下步骤:
对于在针对所述着色器程序的所述一系列指令中的第一点处开始的所述执行线程中的一个或更多个,执行所述着色器程序;以及
对于在针对所述着色器程序的所述一系列指令中的不同点处开始的所述执行线程中的另一个或多个,执行所述着色器程序。
2.根据权利要求1所述的方法,其中,
要执行所述着色器程序的执行线程能够在所述着色器程序的开始处和在所述着色器程序中的计算所述着色器程序中的公用表达的至少一些指令之后,开始其所述着色器程序的执行。
3.根据权利要求1或2所述的方法,其中,
执行线程能够在执行所述着色器程序中的、对于正执行所述着色器程序的执行线程组的子集公用的表达的指令之后,开始所述着色器程序的执行。
4.根据权利要求1或2所述的方法,其中,
所述着色器程序包括:
如下的指令,这些指令执行需要对于各线程单独执行的表达,但不依赖执行所述着色器程序中的公用表达的指令的结果;并且
要执行所述着色器程序的执行线程能够在所述着色器程序中的、执行所述着色器程序中的所述公用表达的指令之后,但在执行需要对于各线程单独执行的表达的、但不依赖执行所述着色器程序中的公用表达的指令的结果的指令的开始之前,开始所述着色器程序的执行。
5.根据权利要求1或2所述的方法,所述方法包括以下步骤:
对于要执行所述着色器程序的工作项发布单个线程。
6.根据权利要求1或2所述的方法,所述方法包括以下步骤:
对于要执行所述着色器程序的工作项发布多个线程,各个线程在针对所述着色器程序的所述一系列指令内的不同指令处开始其所述着色器程序的执行。
7.根据权利要求1或2所述的方法,所述方法包括以下步骤:
发布线程,以在所述着色器程序的开始时开始线程的执行,直到一个执行线程完成所述着色器程序为止;以及
其后,发布执行线程,以在所述着色器程序中的后面开始点处开始所述着色器程序。
8.根据权利要求1或2所述的方法,所述方法包括以下步骤:
追踪由执行线程进行的所述着色器程序中的特定指令或特定指令组的完成;以及
在线程完成所述着色器程序中的特定指令或特定指令组时,释放如下线程,这些线程要在后面开始点处开始所述着色器程序以便执行。
9.根据权利要求1或2所述的方法,所述方法包括以下步骤:
在针对所述着色器程序的所述一系列指令中的第一开始点处开始其所述着色器程序的执行的至少一个执行线程,将它通过所述指令的执行而产生的结果存储在寄存器中,以便由在针对所述着色器程序的所述一系列指令中的后面点处开始其所述着色器程序的执行的其它线程来使用。
10.一种图形处理流水线,该图形处理流水线包括可编程着色器阶段,该可编程着色器阶段执行指令以执行着色操作,其中,所述图形处理流水线被配置为:
当所述着色器阶段要执行着色器程序以执行着色操作时,包括要在执行所述着色器程序时执行的一系列指令的所述着色器程序进行如下操作:
向要执行所述着色器程序的所述着色器阶段发布多个执行线程,以便执行,
其中,向所述着色器阶段发布所述执行线程以便所述着色器程序的执行的步骤被配置为,使得对于所述执行线程中的不同执行线程,所述着色器程序的执行能够在针对所述着色器程序的所述一系列指令内的不同指令处开始,针对将对于要执行所述着色器程序的线程组中所有线程产生公用结果的任意着色器程序表达的指令,在针对所述着色器程序的所述一系列指令中比需要对于各线程单独执行的着色器程序表达的任意指令更早,并且所产生的公用结果被存储起来并由其它线程使用;以及
对于所述执行线程执行所述着色器程序,
其中,对于所述执行线程执行所述着色器程序的步骤包括如下步骤:
对于针对所述着色器程序的所述一系列指令中的第一点处开始的所述执行线程中的一个或更多个,执行所述着色器程序;以及
对于针对所述着色器程序的所述一系列指令中的不同点处开始的所述执行线程中的另一个或多个,执行所述着色器程序。
11.根据权利要求10所述的流水线,其中,
要执行所述着色器程序的执行线程能够在所述着色器程序的开始处和在所述着色器程序中的计算所述着色器程序中的公用表达的至少一些指令之后,开始其所述着色器程序的执行。
12.根据权利要求10或11所述的流水线,其中,
执行线程能够在执行所述着色器程序中的、对于执行所述着色器程序的执行线程组的子集公用的表达的指令之后,开始所述着色器程序的执行。
13.根据权利要求10或11所述的流水线,其中,所述流水线被配置为能够进行如下操作:
对于着色器程序,在所述着色器程序中的、执行所述着色器程序中的公用表达的指令之后,但在执行需要对于各线程单独执行的表达的、但不依赖执行所述着色器程序中的公用表达的指令的结果的指令的开始之前,开始所述着色器程序的执行,
其中,所述着色器程序包括:
如下的指令,这些指令执行需要对于各线程单独执行的表达,但不依赖执行所述着色器程序中的公用表达的指令的结果。
14.根据权利要求10或11所述的流水线,其中,所述流水线被配置为:
对于要执行所述着色器程序的工作项发布单个线程。
15.根据权利要求10或11所述的流水线,其中,所述流水线被配置为能够进行如下操作:
对于要执行所述着色器程序的工作项发布多个线程,各个线程在针对所述着色器程序的所述一系列指令内的不同指令处开始其所述着色器程序的执行。
16.根据权利要求10或11所述的流水线,其中,所述流水线被配置为进行如下操作:
发布线程,以在所述着色器程序的开始时开始线程的执行,直到一个执行线程完成所述着色器程序为止;以及
其后,发布执行线程,以在所述着色器程序中的后面开始点处开始所述着色器程序。
17.根据权利要求10或11所述的流水线,其中,所述流水线被配置为进行如下操作:
追踪由执行线程进行的所述着色器程序中的特定指令或特定指令组的完成;以及
在线程完成所述着色器程序中的特定指令或特定指令组时,释放如下的线程,这些线程要在后面开始点处开始所述着色器程序以便执行。
18.根据权利要求10或11所述的流水线,其中,对于所述执行线程执行所述着色器程序的步骤包括如下步骤:
在针对所述着色器程序的所述一系列指令中的第一开始点处开始其所述着色器程序的执行的至少一个执行线程,将它通过所述指令的执行而产生的结果存储在寄存器中,以便由在针对所述着色器程序的所述一系列指令中的后面开始点处开始其所述着色器程序的执行的其它线程来使用。
19.一种计算机可读存储介质,该计算机可读存储介质存储计算机软件代码,当在处理器上执行时,所述计算机软件代码执行根据权利要求1至9中任一项所述的方法。
CN201610576737.7A 2015-07-20 2016-07-20 图形处理 Active CN106373083B (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
GB1512669.1A GB2540543B (en) 2015-07-20 2015-07-20 Graphics processing
GB1512669.1 2015-07-20

Publications (2)

Publication Number Publication Date
CN106373083A CN106373083A (zh) 2017-02-01
CN106373083B true CN106373083B (zh) 2021-07-06

Family

ID=54013262

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201610576737.7A Active CN106373083B (zh) 2015-07-20 2016-07-20 图形处理

Country Status (4)

Country Link
US (1) US10275848B2 (zh)
KR (1) KR102631479B1 (zh)
CN (1) CN106373083B (zh)
GB (1) GB2540543B (zh)

Families Citing this family (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
GB2514618B (en) * 2013-05-31 2020-11-11 Advanced Risc Mach Ltd Data processing systems
US10310856B2 (en) 2016-11-09 2019-06-04 Arm Limited Disabling thread execution when executing instructions in a data processing system
US10127626B1 (en) * 2017-07-21 2018-11-13 Arm Limited Method and apparatus improving the execution of instructions by execution threads in data processing systems
CN108121566A (zh) * 2017-12-06 2018-06-05 中国航空工业集团公司西安航空计算技术研究所 一种图形指令解析设计方法
US10360717B1 (en) * 2017-12-29 2019-07-23 Intel Corporation Method and apparatus for subdividing shader workloads in a graphics processor for efficient machine configuration
US11669830B2 (en) * 2019-10-15 2023-06-06 Jpmorgan Chase Bank, N.A. Systems and methods for distributed-ledger based settlement
US11126439B2 (en) * 2019-11-15 2021-09-21 Apple Inc. SIMD operand permutation with selection from among multiple registers
US10891708B1 (en) 2019-11-25 2021-01-12 Arm Limited Shader program execution in graphics processing
US11830101B2 (en) * 2020-07-17 2023-11-28 Arm Limited Graphics processors
CN113885877A (zh) * 2021-10-11 2022-01-04 北京超弦存储器研究院 编译的方法、装置、设备及介质
US11928754B2 (en) * 2022-04-07 2024-03-12 Qualcomm Incorporated GPU wave-to-wave optimization

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101303721A (zh) * 2007-05-02 2008-11-12 Arm有限公司 减少共享高速缓存的进程之间的信息泄漏
CN103003838A (zh) * 2010-07-19 2013-03-27 超威半导体公司 在多处理单元中使用片上存储器的数据处理
CN103995725A (zh) * 2014-04-24 2014-08-20 深圳中微电科技有限公司 在cpu上执行像素着色器的程序转换方法及装置

Family Cites Families (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20050071438A1 (en) * 2003-09-30 2005-03-31 Shih-Wei Liao Methods and apparatuses for compiler-creating helper threads for multi-threading
US7310722B2 (en) * 2003-12-18 2007-12-18 Nvidia Corporation Across-thread out of order instruction dispatch in a multithreaded graphics processor
US20080198166A1 (en) * 2007-02-16 2008-08-21 Via Technologies, Inc. Multi-threads vertex shader, graphics processing unit, and flow control method
US20090037918A1 (en) * 2007-07-31 2009-02-05 Advanced Micro Devices, Inc. Thread sequencing for multi-threaded processor with instruction cache
US8499305B2 (en) * 2010-10-15 2013-07-30 Via Technologies, Inc. Systems and methods for performing multi-program general purpose shader kickoff
US9513975B2 (en) * 2012-05-02 2016-12-06 Nvidia Corporation Technique for computational nested parallelism
US9928109B2 (en) * 2012-05-09 2018-03-27 Nvidia Corporation Method and system for processing nested stream events
US9189881B2 (en) * 2013-05-30 2015-11-17 Arm Limited Graphics processing
US10061591B2 (en) * 2014-06-27 2018-08-28 Samsung Electronics Company, Ltd. Redundancy elimination in single instruction multiple data/thread (SIMD/T) execution processing

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101303721A (zh) * 2007-05-02 2008-11-12 Arm有限公司 减少共享高速缓存的进程之间的信息泄漏
CN103003838A (zh) * 2010-07-19 2013-03-27 超威半导体公司 在多处理单元中使用片上存储器的数据处理
CN103995725A (zh) * 2014-04-24 2014-08-20 深圳中微电科技有限公司 在cpu上执行像素着色器的程序转换方法及装置

Also Published As

Publication number Publication date
KR102631479B1 (ko) 2024-01-31
GB2540543B (en) 2020-03-11
KR20170010721A (ko) 2017-02-01
GB2540543A (en) 2017-01-25
CN106373083A (zh) 2017-02-01
US10275848B2 (en) 2019-04-30
GB201512669D0 (en) 2015-08-26
US20170024848A1 (en) 2017-01-26

Similar Documents

Publication Publication Date Title
CN106373083B (zh) 图形处理
US10176546B2 (en) Data processing systems
CN106327420B (zh) 数据处理系统
US8978038B2 (en) Data processing apparatus and method for processing a received workload in order to generate result data
US9256466B2 (en) Data processing systems
KR102617106B1 (ko) 데이터 처리 시스템
US20190384613A1 (en) Data processing systems
CN107851027B (zh) 图形处理单元的可编程执行单元、数据处理系统、操作方法
US10559055B2 (en) Graphics processing systems
US10606595B2 (en) Data processing systems
US10310856B2 (en) Disabling thread execution when executing instructions in a data processing system
US10891708B1 (en) Shader program execution in graphics processing
US20170206698A1 (en) Data processing systems
US11442731B2 (en) Data processing systems including an intermediate buffer with controlled data value eviction
KR102676410B1 (ko) 그래픽 처리 시스템
GB2621199A (en) An apparatus and method of optimising divergent processing in thread groups
GB2604150A (en) Data processing systems
CN114913053A (zh) 图形处理系统

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant