CN103765376B - 具有无阻塞并行架构的图形处理器 - Google Patents

具有无阻塞并行架构的图形处理器 Download PDF

Info

Publication number
CN103765376B
CN103765376B CN201280039793.7A CN201280039793A CN103765376B CN 103765376 B CN103765376 B CN 103765376B CN 201280039793 A CN201280039793 A CN 201280039793A CN 103765376 B CN103765376 B CN 103765376B
Authority
CN
China
Prior art keywords
journey
fine
thread
fine journey
memory
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
CN201280039793.7A
Other languages
English (en)
Other versions
CN103765376A (zh
Inventor
S·J·克洛赛特
L·T·皮得森
J·R·雷德格雷夫
J·A·麦库姆
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.)
Imagination Technologies Ltd
Original Assignee
Imagination Technologies 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 Imagination Technologies Ltd filed Critical Imagination Technologies Ltd
Publication of CN103765376A publication Critical patent/CN103765376A/zh
Application granted granted Critical
Publication of CN103765376B publication Critical patent/CN103765376B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/005General purpose rendering architectures
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F15/00Digital computers in general; Data processing equipment in general
    • G06F15/76Architectures of general purpose stored program computers
    • G06F15/80Architectures of general purpose stored program computers comprising an array of processing units with common control, e.g. single instruction multiple data processors
    • G06F15/8007Architectures of general purpose stored program computers comprising an array of processing units with common control, e.g. single instruction multiple data processors single instruction multiple data [SIMD] multiprocessors
    • 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/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5027Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
    • G06F9/5033Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals considering data affinity
    • 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/52Program synchronisation; Mutual exclusion, e.g. by means of semaphores
    • 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
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T1/00General purpose image data processing
    • G06T1/60Memory management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/06Ray-tracing
    • 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, look ahead
    • G06F9/3885Concurrent instruction execution, e.g. pipeline, look ahead using a plurality of independent parallel functional units
    • G06F9/3887Concurrent instruction execution, e.g. pipeline, look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple data lanes [SIMD]
    • 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
    • G06F9/4881Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
    • 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/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5027Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
    • G06F9/505Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals considering the load
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T2200/00Indexing scheme for image data processing or generation, in general
    • G06T2200/28Indexing scheme for image data processing or generation, in general involving image processing hardware

Abstract

在一些方面中,系统和方法提供了形成多个独立地指定的计算工作负载的分组,如图形处理工作负载,并且在特定示例中,光线追踪工作负载。这这些工作负载包括一个调度密钥,该调度密钥是能够形成这些分组的一个基础。被分组在一起的工作负载全都可以从同一指令源、一个或多个不同私有数据元素执行。这种工作负载可以递归地对引用相同私有数据元素的其他工作负载进行实例化。该在一些示例中,该调度密钥可以用于对有待被一个分组中的所有工作负载使用的数据元素进行标识。对针对私有数据元素的存储器冲突进行如下处理:对非冲突工作负载或特定指令进行调度和延迟冲突工作负载而非对存储器位置进行锁定。

Description

具有无阻塞并行架构的图形处理器
相关申请的交叉引用
本申请要求2011年6月16日提交的美国临时专利申请号61/497,915的优先权,出于所有目的,该申请通过引用以其全文结合于此。
技术领域
以下内容总体上涉及并行处理资源的利用,并且在一个更具体方面涉及可以在不同种类的并行计算问题中使用的编程接口和架构,并且具体地涉及图形处理,包括光线追踪。
背景技术
计算机架构谋求在硬件级和软件/操作系统级上提高并行度。已经提出了各种技术来解决硬件和软件的并行度。一个普遍概念是将多线程处理用作一种提高并行度的机制。
关于基于软件的多线程处理,操作系统可以通过在时间上使多个进程的执行交错来在单个硬件执行资源上并发地执行多个进程(典型地,多个独立程序)。可以通过OS内核完成这种交错,OS内核确定什么进程具有优先级,并且还可以访问其继续进行执行所需要的资源。
当一个进程具有两个或更多个半独立子任务时,多线程处理可以提高吞吐量,给出更好的响应时间,加速操作,改进程序结构,使用更少的系统资源,并且更加高效地利用多个多处理器。使用多线程处理的情况下,一个进程具有多个控制线程。随着用于处理器的更快的时钟变得功耗过分高,并且晶体管预算用在更广的架构上,多线程计算的概念越来越常见。如此,已经越来越多地使用术语“线程”,但其不总是用来指相同概念,而是使用的背景可以告知该术语的意义。
一个进程可以被视作一个可以被执行的单独的程序或应用程序。如此,一个进程具有一个有待执行的指令序列。一个线程也具有用于执行的一个指令序列,但典型地更细化。例如,一个函数可以代表一个线程的指令序列。如果被进程实例化,则线程共享该进程的地址空间,还可以在该进程内拥有多个唯一的资源。可以单独地调度来自每个线程的指令,这允许按照资源可用性所指示的,并发地执行一个进程的多个线程。
可以通过一个创建进程来管理多个线程并且这些线程对操作系统的内核是不可见的(也被称为用户级或应用级线程)。在用户空间中处理用户线程,并且使用程序库中提供的线程API对用户线程进行控制。这种控制包括如创建、终止、同步、调度等操作。可以使用用户空间线程执行创建、终止和同步操作。因为用户空间线程对内核(其只意识到包含用户空间线程的基本(overriding)进程)不直接可见,如果用户空间线程阻塞,则其整个进程阻塞。当这种情况发生时,失去或减少了线程并行度的益处。可以引入附加的复杂性层以减少阻塞,但以性能为代价。
在内核空间中处理并且由线程库中的线程函数创建内核线程。内核线程为对操作系统可见的内核可调度实体。内核线程存在于进程的上下文中并且为操作系统提供解决和执行该进程的更小节段的手段。内核线程还能够使程序利用硬件提供的用于并发和并行处理的能力。在使用内核线程的情况下,每个用户线程可以具有一个相应的内核线程。每个线程是可以被内核独立调度的,所以如果正由一个线程执行的指令阻塞,则来自其他线程的指令可能能够运行。由于线程管理必须涉及内核,所以创建、终止和同步在内核线程下比用户线程下更慢。开销会更大,但使用内核线程,即使用单处理器系统,更多并发性是可行的。其结果是,内核空间线程的整体应用性能可以超过用户空间线程性能。然而,当创建大量线程时,开发者必须小心,因为每个线程向进程添加更多权重并且对内核产生负担。
内核线程可以改变进程的角色,因为在这种环境中进程更是一个用于对一种应用程序的相关线程进行分组的逻辑容器。每个进程包含至少一个线程。当该进程启动时,系统自动地创建此单个(初始)线程。应用程序必须显式地创建附加线程。只具有一个线程的应用程序为“单线程”。具有不止一个线程的应用程序为“多线程”。以下提供了一个线程相对于其他的线程的示例处理。
进程的“状态”信息包括一个标引有待执行的指令序列的程序计数器、以及寄存器状态。寄存器上下文和程序计数器包含对程序执行的当前状态进行指示的多个值。有待执行的指令序列为实际程序代码。例如,当进程上下文进行切换时,新调度的进程的寄存器信息告知处理器该进程在其执行中的何处中断。更确切地说,线程的程序计数器将会包含有待在启动时执行的当前指令。
像进程的上下文一样,线程的上下文由指令、属性、带有寄存器上下文的用户结构、专用存储、线程结构以及线程堆栈组成。像进程一样,线程具有一种以控制指令集的执行为基础的生存周期。在整个时间过程中,线程像进程一样被创建、运行、休眠和被终止。典型地使用fork()调用来创建新的进程(并且在多线程OS中,进程的至少一个线程),该fork()调用产生一个进程和线程ID。该进程及其线程链接到活跃列表上。新的线程被标记为可运行,并且之后将其放置在运行队列中。内核调度该线程以使其运行,从而将该线程状态改变至活跃运行状态。当在此状态下时,给予该线程其请求的资源。这继续进行直到出现时钟中断,或该线程放弃其时间来等待请求的资源,或者该线程被另一个(更高优先级)线程抢先。如果出现这种情况,则切换出该线程的上下文。
如果其必须等待请求的资源(否则,处理器将阻塞),则切换出线程。这致使该线程进入休眠状态。该线程休眠直到其请求的资源返回并且使得其有资格再次运行。在该线程的休眠状态过程中,内核计入当前正在运行的线程对CPU的使用情况。一段时期之后,内核可以引起上下文切换至另一个线程。下一个有待运行的线程将是准备运行的线程中具有最高优先级的线程。对于该就绪状态下的剩余线程而言,可以上调其优先级。一旦线程获取了所请求的资源,则其调用唤醒例程并且再次将状态从休眠变成运行,使得该线程有资格再次运行。当下一个上下文切换时,允许该线程运行,条件是其是下一个有资格的候选者。当被允许运行时,该线程状态再次变化至活跃运行。一旦该线程完成,其退出,释放所有资源并且可以转至废止状态。一旦释放了所有资源,则释放该线程和这些进程条目,并且可以更新活跃进程/线程的链表。
关于更多面向硬件的并行度,在几乎所有计算设备中可以获得实现并行计算硬件的能力,范围从可以具有4个、8个、16个、32个或几十个处理元件的强大的移动或桌面CPU开始,这些元件对于带有许多(例如,几百个)相对简单的处理器的图形处理单元(GPU)而言是相对复杂的。
虽然GPU在最初被设计成用于并且仍然主要用于使光栅图形加速,但GPU已经逐渐地变得更加可编程。这种提高的可编程性已经允许在GPU上表达并执行一些多线程计算问题。尽管GPU架构具有极高的理论最大每秒浮点运算次数(FLOPS),但仅光栅化的图形和某些表现良好、高度可流化计算问题才可以贴近实现接近于理论吞吐量的实际吞吐量。
提高计算的并行度典型地涉及到算法复杂性与在管理计算资源共享中产生的开销之间的折中。另一个重要的考虑在于算法正确地执行,从而使得不损坏数据值。线程的并行执行(其可能使用共享的数据)会由于读和写的不正确计时对共享数据值造成数据损坏。对这种共享数据的协商访问或串行化访问产生开销。
另一个关注点很大程度上在于在越来越多的并行执行过程中保证数据的正确性。首要地,通过锁定变量来处理不同线程之间的并行度(并且避免数据损坏),这些变量由于系统中的冲突进程而存在偏离正确顺序被写入(或读取)的风险。该概念本质上在于,当给定的进程想要写入这种变量(例如,全局变量)时,该进程试图锁定该变量。如果没有其他进程锁定该变量,则可以将该锁授予该请求进程。该进程执行其写入,并且然后释放该锁。如可以认识到的,锁的使用取决于对哪些变量应被锁保护进行检测或标识的机制和检查锁状态、授予锁状态以及取消锁状态的仲裁器。哪些变量需要被保护还经常取决于给定的软件程序是否旨在可供用于在多线程平台上使用,其中,这种程序的多个这种实例可以在多个并发执行的进程中执行。
程序员可以指定有待被锁保护的进程中的代码的多个部分。在编译时间,编译程序可以处理这种代码,并且在一些情况下还可以检测可能处于风险下但不受保护的变量,并且可以将这种锁插入到编译的目标代码内。
锁的一种实现方式是相互排斥(互斥),其控制着计算机代码的不同部分可以如何访问共享资源,如全局变量。例如,需要读取给定变量的代码的一部分不应被允许在另一个进程对该变量进行更新的过程中执行。术语“互斥”还用于进行工作以针对冲突变量对不同程序元素的相互排斥进行协商的程序元素的意义中。在多线程执行环境中,多个线程可以执行,并且最终可能需要访问受互斥保护的给定数据对象。如果互斥当前是活跃的,则操作系统典型地将致使正在等待该互斥的线程进入休眠(即,停止执行)。因此,随着越来越多的线程达到该互斥,使得它们每个进入休眠以等到操作系统指示它们可以执行的时候。操作系统可以通过这些线程达到互斥的相对顺序来唤醒这些线程;它们被唤醒的顺序可以简单地是不确定的。
对共享资源进行分配的其他方法包括信号量,这些信号量将无差别的资源元素分配在希望使用这些元素的多个进程之间。信号量本质上对可供用于从该集合使用的资源的元素的数量进行计数,从而当保留和释放资源时对该计数进行调整。当给定资源中没有可用元素时,则请求使用该资源的进程等待,直到已经释放该资源的一个元素。典型地,在操作系统中实施信号量以便进行资源分配。
基本锁定概念存在变化,如自旋锁定,当给定锁空闲时,其允许线程继续活跃地询问,从而使得通过不必被唤醒而提高它们的响应能力,这产生开销(上下文调换)。然而,自旋锁定的确使用处理器周期,并且因此内在地降低效率。其他变化包括递归锁定,对锁实施时间限制,从而使得进程将不会无限期等待获取用于具体目标的锁,但反而(如果可能)如果在给定时期内不满足其锁定请求,则继续执行。当针对关键进程的绝对计时执行可能是有必要时,这种方法在嵌入式系统中是有用的。
进一步的示例变化是递归锁定,递归锁定是被提出用于对共享存储器具有非均匀访问(NUMA)的计算架构的策略。典型地,多组通用处理器(每组带有一个片上高速缓存并且在带有共享主存储器的系统中工作)将具有NUMA特性(实际上,大多数低成本计算平台)。递归加锁以下实现内容为基础:由于由处理器之间的互连引起的通信延时差,驻留在具有锁定的存储器位置(标准测试和集合锁定)的处理器上的进程比在一个不同芯片上的进程更可能被准予访问该锁定的存储器位置。递归锁定寻求强制执行对将锁授予可能具有更多数据局部性的进程的可预测且可控制的优先项,通过将锁授予在已经具有该锁的节点上执行的进程来进行强制执行,这些通过向该授予锁的进程添加以下条件:就哪个节点正在托管请求该锁的线程,对标识符进行测试。
发明内容
用于执行并发图形计算的示例系统的方面包括一个计算元件集群,其中每个计算元件包括一个本地存储器和多个单指令多数据(SIMD)算术逻辑单元(ALU)。该系统还具有一个用于该计算元件集群的调度器。该调度器可操作用于接收对有待在该集群上执行的一种第一类型计算的实例进行定义的输入,其中这些实例中的每个实例与一个对应的调度密钥相关联。该调度器可操作用于根据其调度密钥将这些实例分类成多个包,并且发出一个包括多个计算实例的包。该系统具有一个分发器,该分发器可操作用于接收该包,并且在该集群的计算元件之间分发这些实例。这些计算元件中的每个计算元件可操作用于使多个实例与不同的调度密钥组合,以便进行并发执行,为此,应当执行相同的计算并且为这些组合的离散计算部分并发地执行该计算。
多个进一步的示例性方面可以包括:针对对读取和写入开放的存储器位置的存储器访问,可以通过对不同实例之间的冲突存储器范围进行标识,在已经将访问那些冲突存储器范围的指令发送用于执行之前,使多个实例与其他实例同步。该调度器可以使用针对变量声明的实例特定的存储器地址执行对冲突存储器范围的如此的标识。该系统可以在建立阶段过程中在该多个计算元件之间分散实例特定的存储器范围。每个计算元件可操作用于根据包括以下内容的标准来对该第二类型计算的实例的分组进行调度:(1)来自一个共同指令源的执行,以及(2)强制执行以下规则:没有任何一个有待并行执行的实例分组可以包括写入相同存储器位置的多个实例。
在一个进一步的示例性方面中,一种有待在计算机系统上对图形计算进行调度中执行的方法提供了在多个计算集群之间分发一种第一类型的工作负载。每个集群可操作用于对来自被分配给独立于该多个集群中的其他集群的那个集群的第一类型工作负载的指令的执行进行调度。形成一种第二类型的工作负载的分组,以便在该多个计算集群中执行。基于与该第二类的工作负载相关联的对应调度密钥确定这些分组。每个调度密钥定义以下各项中的一个或多个:有待在每个工作负载的分组的执行过程中使用的数据元素和针对该第二类型的每个工作负载有待执行的指令集。选择工作负载的分组并且在该多个计算集群之间分发该分组的工作负载。
一个进一步的示例性方面包括一个用于在计算系统中使用的计算组件,该计算组件包括:一个存储器,该存储器包括一个瞬时部分和一个永久存储部分。该组件进一步包括多个算术逻辑单元(ALU),每个算术逻辑单元可以读访问和写访问该存储器并且具有一个用于接收有待在该多个ALU上执行的离散计算定义的输入队列。这些定义包括一个程序引用和一个调度密钥。本地调度器可操作用于对该多个ALU进行调度。该本地调度器可操作用于通过对具有相同程序引用和相同调度密钥的计算定义的分组进行标识来对计算的调度进行优先次序排序。当执行该引用的程序时,该调度密钥用于对存储有待被这些ALU使用的数据的存储器的高周转部分中的位置进行标识。
在一个进一步的方面中,具有所存储的计算机可执行指令的有形计算机可读介质包括针对有待在计算单元上执行的计算线程的多个指令。针对该线程的指令包括对计算例程进行调用的指令。计算例程的调用包括一个调度密钥的定义、一个对用于读取和写入的存储器位置进行标识的有限存储器引用、和一个有待被读取用于该计算例程的存储器位置、以及多个指令,这些指令有待在对该计算例程调用之后执行,而不需要在其执行过程中等待所调用计算例程产生的信息。该计算例程可以进一步被递归地实例化,并且每个递归地实例化的实例自动地继承该有限存储器引用,并且该读存储器位置是不同的。可以基于一种被访问类型数据的规则访问模式对该读存储器位置进行更新。
附图说明
图1描绘了一种示例系统的架构,其中,可以根据这些披露实施并发和并行处理及调度;
图2描绘了另一个示例性系统202,其中,可以实践所披露的方面。
图3描绘了异构计算的一个方面,其中,父线程可以使一种第二类型的计算的实例实例化,并且其可以递归地进一步使该第二类型的计算的多个实例实例化;
图4描绘了多个示例步骤,其中,异构计算架构可以支持多种类型的计算的实例的并发执行;
图5描绘了根据本披露的纤程(fibre)计算的进一步方面;
图6描绘了纤程的输入组的流,调度/工作分布抽象化提供了这些纤程在这些组中的分散;
图7描绘了一个集群的示例结构,该结构可以用在图1或图2中描绘的集群阵列的实现中;
图8描绘了纤程例程在多个计算单元上的动态收集、调度和分发执行。
图9描绘了一个包括多个ALU的集群的示例操作的多个方面;
图10描绘了一个计算集群的本地存储器存储了纤程数据存储的线程局部变量和多个元素;
图11描绘了一个进程的多个部分,该进程可以由这些披露的实现方式中提供的集中控制器执行;
图12描绘了一个优先进程的多个方面,该进程可以根据本披露用在多个系统中;
图13描绘了根据本披露的示例进程的多个方面;
图14描绘了一个收集存储器,在其中可以按本披露的多个方面对纤程进行分组;
图15描绘了一个接收分散的纤程的输入缓冲器的示例实现方面;以及
图16描绘了根据本披露的示例进程的多个方面。
具体实施方式
并行度不根据计算资源可用性缩放的一个原因在于存储器带宽不与可用计算能力成比例缩放。因此,不享有固有数据局部性的计算问题会致使计算元件等待正在从存储器被访问的数据。即使最大理论可用存储器带宽已经上升,存储器访问依然是一个问题,因为这种最大带宽采取对这些种类的计算问题而言经常不切实际的突发传输速率。进一步地,存储器接口性能的可缩放性受到其他因素的阻碍,如存储器接口的引脚数和存储器访问等待时间不轻易随进程技术改变而缩放的事实。例如,DDR3列地址选通(CAS)等待时间可以为大约9ns,而典型的DDR2CAS等待时间为大约10ns。并且,处理节点之间的存储器等待时间还可以是不同计算范例(如NUMA架构)中的一个因素。
进一步地,这些计算集群的SIMD性质意味着同时执行多个线程必须遵循完全相同的程序执行路径,以便实现最大计算吞吐量。例如,如果这种SIMD集群中的一半线程采取一条分支单路并且剩余部分采取另一条分支,则硬件必须串行化这些两条路径(即,一半暂停而另一半执行,从而使得该SIMD集群最终可以再次在向量化数据上执行)。在这种情况下,计算单元仅以50%的吞吐量执行。在正在被执行的代码基数包含许多分支的情况下,单单来自SIMD损失的最坏情况性能可以是l/SIMD_宽,这在32宽SIMD架构上效率为约3%。存在大量计算问题,包括光线追踪、空间搜索、分类和数据库遍历,虽然理论上它们是可并行化的,但尚未高效地映射到如此宽的SIMD架构上。
以下描述的技术的一些应用涉及到图形处理器,如可以执行光栅化和/或光线追踪的处理器。具体关于光线追踪,光线追踪可以用于产生从3-D场景渲染的逼真图像(在视频游戏背景下)、动画、动画广告、工业模型、架构模拟等。在渲染领域内使用的一种构造是提供物理场景模型,并且是表面信息与场景模型的不同部分相关联。例如,场景模型可以包含多种物体,包括人、汽车和建筑物。场景的物理模型将描述这些物体的表面,例如,作为线框模型,其可以包括大量彼此互连的图元形状以描述这些表面的边界。此物理模型通常缺乏关于这些物体表面的视觉外观的信息。然后,信息和编程与具体表面和/或描述其外观的具体表面的多个部分相关联。这种信息可以包括表面的纹理,而与表面相关联的编程经常旨在为表面对碰撞该表面的光具有何种影响进行建模。例如,编程允许对玻璃、光亮的表面、凹凸不平的表面等进行建模。因此,这种编程和信息与对那些表面进行描述的物理模型的多个部分相关或以另外的方式相关联。例如,编程可以与具体图元相关联或相关。对于具体图元或场景物体而言,这种编程和其他描述、或其多个部分通常可以被称为用于该图元或物体的“着色器”。
以上描述示出了术语“线程”在不同情况下可以表示不同的意思(但,不是对该术语的潜在用途的穷尽性解释)。因此,在以下描述中,将使用术语以试图减少对与多线程相关联的术语的依赖,例如,通过引入术语“纤程(fibre)”作为旨在共同地和单独地表示多个概念的名字,不是所有这些概念需要在根据本披露的每个实现方式中被实践。然而,如从以下描述中变得更加明显的,多线程操作系统以及支持多线程应用的并发和并行处理的机器可以被适配成用于实施这些披露的多个方面。
在一个方面中,多处理环境下的进程或多线程环境下的线程(或多处理、多线程环境下的两者)可以使用API来创建有待执行的工作的一个或多个单元,为了方便的目的,在此每个单元被称为一个“纤程”。
在一个方面中,纤程是代码的实例,如可以被一个父线程重复分叉或者可以从同一纤程例程的另一个实例递归地进入的例程(例如,C函数声明)。一个纤程例程的实例(为了方便,纤程例程的实例被简单地称为“纤程”)包括数据元素的被用作调度密钥的一个标识符、和纤程存储的(声明)具体元素的标识。
共享一个调度密钥的纤程可以被分组以便进行并发执行(如以下所述,这种分组不强行要求严格地并行进行这种执行)。针对执行,引用纤程存储的相同元素的所有纤程可以被传递至具有该本地高速缓存的纤程存储的元件的一个计算元件。在一个示例性实现方式中,对于给定纤程,或纤程集合而言,纤程存储的给定元件至少具有以下特征:此纤程存储元件只对该纤程或纤程集合可读和可写;此限制可以是随时间变化的或绝对的。可以通过适当的编程实践、通过编译程序、通过硬件、以及通过以上的某种组合强制执行此限制。
在一个方面中,可以通过标准C函数声明定义纤程并且该纤程包含完整执行该纤程所需的所有代码(可以提供函数的标准线上扩展)。操作差异在于纤程不等待来自该纤程内调用的另一个函数的返回值。在该示例性方面,该纤程例程函数声明包含至少一个自变量,针对该自变量,将一个值存储在与使用该纤程例程声明使纤程分叉的线程相关联的纤程存储中。
在一个示例性方面中,引用纤程存储的给定元素的所有纤程(例如,通过父线程(或纤程)被实例化)使其执行受到控制或被分发,从而使得它们在给定处理器内串行地执行(处理器可以本身通过处理元件的分组,并且在一个示例中,可以包括多个SIMD处理元件),并且与具有相同(或匹配)纤程密钥的其他纤程例程并发地或通常并行执行。在一个示例中,被认为是处理器的一个处理器元件分组在此上下文中根据那些可以写入具体纤程存储位置的处理元件确定。在一个示例中,出于强制执行引用该具体纤程存储位置的纤程的串行执行的目的,所有可以写入具体纤程存储位置的处理器元件被认为是有待成为一个处理器的一个组。关于系统内的存储器子集考虑这种写入,如本地存储器,然而可以不那样处理访问。
在一个示例性方面中,只有最终追踪到共父的纤程访问被分配用于这些纤程的纤程存储元件。因此,追踪到该集合的不同父的纤程不访问这种纤程存储位置。进一步地,在示例性方面中,来自同一父的两个或更多个纤程不被调度用于并行执行,从而使得纤程存储位置不要求互斥或锁定管理。
然而,在这种示例性方面中,纤程以另外的方式可以完全访问标准线程将具有的所有特征,包括完整全局存储器访问、本地存储器、屏障、纹理采样器、私有变量和所有算术和逻辑操作。该纤程例程还可以包含直接从其父线程的内核自变量取得的自变量,这允许该纤程访问全局存储器指针和其他共享变量。可以使用标准存储器保护技术访问这些存储器位置。
系统中的每个线程可以定义多个纤程,每个纤程带有一个对应的调度密钥。进一步地,可以定义多个纤程例程,从而使得给定线程可以定义多个纤程,这些纤程是不同纤程例程的实例。如以上解释的,在一个示例性方面中,同一纤程例程的纤程(共享一个代码基数)和来自同一父(例如,父线程或纤程)的纤程在实现方式中在执行时不重叠,这些实现方式针对访问只可供这些纤程使用的至少一个变量或数据源避免了互斥或锁定。
在一些实现方式中,API可以被提供用于父线程(或另一个纤程)通过语义(以下提供了其示例)使纤程例程实例化/对其进行调用(如以上解释的,每个纤程为一个纤程例程的调用)。在一些方面中,并且不像典型多线程环境下的函数调用,内核(或者其他系统调度器资源)不一定即刻试图执行或准备执行这样调用的纤程(在典型多线程环境下,如同其将是一个线程一样)。以上介绍了这种准备的示例。
相反,在一个示例性方面中,其激活(对实际处理资源进行分配以便进行执行)被延迟直到未知的将来时间。进一步地,在父线程使纤程实例化之后(例如,通过使用纤程定义API语义),如果以另外的方式允许,则父线程可以继续执行(例如,继续是活跃的线程,使其程序计数器增量并且使用硬件资源)。API还可以同时提供语义用于使多个纤程实例化(例如,同一纤程例程的纤程或不同纤程例程的纤程)。在一个示例中,这些纤程中的每个纤程可以具有一个共用密钥,并且在另一个示例中,这些纤程可以具有相同的纤程密钥,但在一个或多个不同值上工作。
在本示例性方面中,因为父线程不阻塞或等待来自此纤程的返回值,所以纤程不向父线程返回任何返回值,标准C函数也将一样。相比之下,当完成时,纤程例程可以简单地停止存在(例如,进入废止状态,从而等待存储器资源的取消分配),并且不返回至调用程序(父)线程。因此,在本方面中,对于纤程而言,为了生效或产生有用的输出,纤程有待将结果写入纤程存储中。要指出的是,尽管纤程使用互斥或锁定管理具有将结果写入在该纤程外共享的存储器资源(例如,全局或本地存储器)的能力,但这种操作将比写入纤程存储缓慢得多。
在一个示例性方面中,因为纤程不返回值,所以纤程(例如,从共用线程实例化的纤程)之间存在的数据受到驻留在或被声明驻留在纤程存储中的数据的限制。实际上,预期通过将快速可用存储器资源分配给纤程存储来实践在此披露的示例性方面,并且如此,典型地预期将是更加有限的资源。例如,如主存储器与高速缓存存储器之间一样,高速缓存的比较大的部分专用于纤程存储而不用于可以被纤程使用的其他数据。
具有某种普遍性的另一个方面在于对引用纤程存储的同一元素的纤程进行引用计数(例如,当发出引用该纤程存储元素的纤程时,使计数器增量,而当纤程完成时,进行减量)。因此,达到零的引用计数指示不再有未解决的引用给定纤程存储位置(或在给定纤程集合引用多个位置的情况下的位置)的纤程。因此,这种达到零的引用计数可以是对父线程的触发器:纤程存储内的数据可供使用和/或提取。通过进一步的示例,父线程可以对响应于零值的标志建立(如内建函数提供的标志)进行监控。
以下是对可以用在根据这些披露的实现方式中的语义进行编码的示例构造。本示例是解释性的,而不是限制如何可以构建具体的实现方式,或限制这种实现方式的内容。
__纤程(__fibre):本限定词用于声明函数作为纤程例程。纤程例程将本限定词放在函数声明开始处。
__纤程存储(__fibrestorage):本限定词声明变量存在于纤程存储中。在父线程内,用本限定词声明有待在子纤程之间共享的变量。纤程例程不声明纤程存储。纤程例程包含具有本限定词的至少一个自变量。
__纤程密钥(__fibrekey):纤程密钥用于指示对纤程的执行进行调度时使用的一个或多个标准。纤程密钥的示例包括全局存储器中的偏移、和分支条件。平台可以基于纤程密钥匹配将一个纤程调度成与其他纤程并行执行。在一个实现方式中,纤程例程函数声明包含恰好一个这种类型的自变量。
+纤程例程(a,b)(+Fibreroutine(a,b)):通过进行标准函数调用但将符号+放在函数名前面来调用纤程例程。这种调用不立即对纤程例程造成跳转执行,而是将其调用延迟到将来的时间。调用例程的执行可以和正常一样继续,并且纤程例程不返回值,正常函数调用也一样。
布尔是_初始_线程_启动()(bool is_initial_thread_Iaunch()):这是一个内建函数,只有当在其初始启动被父线程调用时该内建函数才返回真。提供本函数以便于在正在被典型线程启动调用的父线程例程与来自父线程的所有子纤程已完成的通知(可以通过达到零的引用计数确定)之间进行区分。
附录中的伪代码举例说明了一种纤程计算的途径,其中,线程可以使根据本披露表现的纤程实例化,并且其中,纤程可以递归地使引用同一纤程数据存储的其他纤程实例化,但这些纤程具有不断变化的调度密钥。
鉴于以上介绍性解释和通过进一步的解释,以下解释了各种架构示例和操作情况。在其中可以实践纤程计算方面的架构是多种多样的。一种示例性架构类型是这样一种类型:其中,多个计算集群各自包括多个算术逻辑单元(ALU)、和一个对这些ALU进行控制的本地控制器。在这种架构的一个更具体的实例中,一个集群的所有ALU从该本地控制器选择的共用程序计数器运行。然而,每个ALU可以具有一个独立的对本地存储器端口。在一些示例中,该本地存储器可以类似于通用处理器的寄存器组而工作;每个ALU可以从该本地存储器读取和写入该本地存储器。在一些实现方式中,可以在逐指令的基础上无等待时间地改变每个集群中的活跃程序计数器。在一些具有如此的多个集群的架构中,可以在每个集群中执行全部线程,并且这种线程的状态保持在这些集群的本地存储器中。在一些实现方式中,本地控制器可以与线程不同地处理纤程(就对其在被该本地控制器控制的ALU中的执行进行调度而言)。在一些实现方式中,引用一个共用纤程存储器存储位置的纤程(即,纤程共享一个共源)将本调度用于在任何实现方式(不在其中实施存储器仲裁)中的集群中进行并发执行。一个示例架构显式地避免针对纤程的本地存储器访问进行仲裁,从而使得可以使存储器访问加速。
在实施所披露的方面的计算架构内处理的示例工作负载主要涉及图形渲染工作负载,并且更具体地,光线追踪被提供作为纤程计算原理的主要应用示例。然而,可以通过应用所披露的纤程计算的方面来解决各种计算问题。在使用纤程计算的方面来实施光线追踪功能性的背景下,图形芯片可以基于用线程计算原理进行的图形处理和使用相同数量的的计算集群来继续实施光栅化。可以根据纤程计算或线程计算原理实施互斥和像元着色函数(其可以类似地适用于几何形状和图像处理)。
因此,纤程计算系统架构提供了接受从发散源指定的工作负载,如不同的线程或其他纤程。每个工作负载可以具有一个第一和一个第二数据元素,其中这些数据元素之一可以用作一个控制密钥对如何将该工作负载与其他工作负载分组进行控制,并且另一个数据元素在多个计算元件之间对在何处执行该工作负载进行控制。
图1和图2中描绘了在其中可以实践所披露的方面的示例系统架构。图1描绘了一种示例系统10的架构,其中,可以根据这些披露实施并发和并行处理及调度。例如,根据示例系统10的系统可以用于实现图形处理器。
主接口40可以包括一个线程API42并且可以包括一个纤程API41。在主处理器(未描绘出)上运行的例程可以使用线程API42,以便使有待在系统10上执行的新线程实例化。线程API42可以被提供例如作为可在带有一个或多个通常可编程处理器核心(如根据架构规范并且与指令集架构一起工作的计算核心)的片上系统(SoC)中使用的固件编码API。在其他示例中,线程API42可以提供有用于附加卡的驱动程序,该附加卡将图形处理负载从主处理器上分流。
在一个示例中,并且如以下所描述的,在主处理器上运行的线程可以使用纤程API41,以便使在根据示例系统10的系统内执行的纤程实例化。如以下将要描述的,在这种系统内执行的线程还可以访问根据这些披露提供的API,从而使得在该系统上执行的线程还可以定义纤程以便执行。在一些示例中,不在主接口层级下暴露纤程API,而是使其仅可供在该图形处理器系统10内执行的线程使用。
示例系统10包括多个管理器,其起到对有待在系统10中执行的计算进行建立的作用。在一些示例中,在系统10中执行的计算比旨在在处理器上执行的典型应用程序代码显著更规则且量更大。相反,示例工作负载可以包括对顶点或像元的大集合进行着色的工作负载。顶点数据管理器10和像元数据管理器11可以被提供用于建立使用可用计算元件(下述)来执行这种计算)。通过进一步的示例,计算数据管理器2和光线数据管理器13可以被提供用于针对大规模数字数值分析程序和针对光线追踪工作负载建立计算。
粗调度器44从数据管理器中接收输入,如上述数据管理器10至13。粗调度器可以操作用于分配独立地工操作的计算元件以执行可以来自这些数据管理器的计算负载。粗调度器从系统10中的可用资源接收状态信息。这种资源包括位于集群阵列65(下述)内的存储器的状态。这种存储器可以是对该集群阵列65内的具体计算单元(例如,核心70至73)私有的,如存储器76至79。这些存储器76至79可以被实现作为可以在多个线程之间分配的高速缓存,这些线程正在与每个存储器联接的核心上执行(例如,可以在在核心71上执行的线程之间分配存储器76)。可以由粗调度器44处理这种存储器的分配。每个数据管理器(顶点、像元、计算机、光线)可以将存储器分配要求传达至粗调度器44。出于线程调度和资源分配的目的,授予Howson的美国专利公开号2007/0101013中描述了粗调度器44的操作方面以及数据管理器之间的通信,该专利通过引用以其全文结合于此。这种操作是示例性的,而不是穷尽性的;还可以鉴于这些披露对这种操作进行适配。
该示例性系统10还包括一个包单元105、一个收集定义存储器107、一个空堆栈108、以及一个打包机单元109,该包单元包括就绪堆栈106的组成组件。以下将描述示例架构10内的包单元105的功能、用途和操作。示例系统10还可以包括被适配成用于执行特定功能的各种协处理器,并且被描绘为协处理器115至117。可以提供其他特殊用途功能,如纹理加载器118。
图1描绘了可以通过任务分发器45分发由粗调度器44调度的线程。在所描绘的图1的架构中,该集群阵列、调度器44、以及数据管理器10至13全都可以使用总线43进行通信。当然,总线43为一种在所描绘的结构和功能元件之间进行通信的示例方法,并且可以提供其他方法,如网格互连、多级网络等。
示例性系统10还可以包括一个高速缓存层次15(其包括一个或多个高速缓存存储器层级)、和一个可以与主存储器接合的系统存储器接口16,该主存储器可以被实现作为高速图形RAM、DRAM等中的一个或多个。随着新技术的开发,可以将多种途径适配于大规模的存储器容量,并且众所周知的首字母缩写词(如DRAM)的使用并不旨在将所披露的方面的适用性限制到给定的进程或存储器技术上。
图2描绘了另一个示例性系统202,其中,可以实践所披露的方面。系统202包括一个包单元205(其包括一个空堆栈)、一个本地存储分配器208、一个就绪堆栈210、一个收集定义存储器(collection definition memory)212、以及一个包214。包单元205可以与粗调度器222通信,该粗调度器可以包括一个线程存储器状态模块220。包单元205收集有待在该多个计算集群之间分发的纤程的分组,如下所述,这些计算集群将执行由这些纤程指定的工作。粗调度器222对该多个计算集群中的计算资源的使用进行追踪,如存储器分配和使用。在一些实现方式中,本地存储器的一部分在具体计算集群中的分配是静态的并且当在该计算集群上建立线程时对其进行分配。粗调度器222还可以对这些纤程进行分配以便在这些集群中执行。
在一个示例中,在具体集群上执行的线程可以使纤程例程实例化(从而制作出一个纤程)。粗调度器222可以接收关于该实例的信息并且对具体集群进行分配以执行该纤程。如以上介绍的,对纤程进行分配以在集群上执行不指示执行将立即开始,而是这种纤程的执行以情况而定。
抽象化/分发器层225将一系列计算集群(描绘了集群227和229)与粗调度器222以及与包单元205分离开。根据以下描述的示例性途径,分发器层225接受来自包单元205的纤程的分组并且致使在这些计算集群之间分发这些纤程。层225是一种用于将这些分组分发到将执行该计算的计算区域中的示例装置。
每个集群包括一个对应的控制器(分别为集群227和229描绘了控制器230和232)。每个集群控制器(例如230和232)控制着多个算术逻辑单元(ALU)(例如,集群控制器230控制着多个ALU,包括ALU235和ALU236)。一个集群的每个ALU与一个线程本地和纤程存储存储器(例如,线程本地和纤程存储240)进行通信。在一个实现方式中,每个ALU具有一条至线程本地和纤程存储的分离开的且专用的访问路径,从而使得每个ALU可以与该集群的其他ALU并发地从该存储器读取和写入该存储器。给定集群的存储器资源进一步包括一个广播数据存储器(例如,集群227的广播数据存储器260)。在一个示例实现方式中,可以在与线程本地和纤程存储240相同的物理存储介质中实现广播数据存储器260。一种示例实现方式,广播数据存储器260可以是允许存储器的具体位置映射到该广播数据存储器中的多个不同位置上的高度交叉的高速缓存。在一些实现方式中,广播数据存储器可以包括一个环形缓冲区或FIFO存储器实现方式。通过直接存储器访问单元(DMA)241来馈送这些广播数据存储器。在一个示例实现方式中,DMA241控制着数据在多个集群中的多个广播数据存储器中的存储。集群是一种用于使用对应的单个控制流程在对应的多个数据元素上执行并发计算的装置。
每个集群包括一个输入缓冲器,例如,集群227包括输入缓冲器267。由分发层225写入并且由该集群的对应控制器读取每个集群的每个输入缓冲器。例如,分发层225写入到输入缓冲器267,由集群控制器230读取该输入缓冲器。
鉴于以上对示例系统202的组件的介绍,以下描述了本示例系统202的操作方面。
图3描绘了纤程计算的一个方面,然而,父线程305可以使一个第一纤程308实例化;第一纤程308可以递归地使共同地被标识为310的另外一组纤程实例化。类似地,那些纤程各自可以使共同地被标识为312的另外的纤程等等直到纤程314实例化。图3中描绘的纤程中的每个纤程引用本地存储器位置317,并且如以下将描述的,包括在这些纤程之间变化的至少一个其他数据元素并且其可以用作调度密钥以便从不同父线程资源中分组纤程,以便在这些计算集群之间进行分发和执行。在所描绘的纤程正在在一个集群(或多个集群)上执行的时间期间,父线程305可以暂停执行或可以继续执行独立的代码。例如,在使纤程308实例化之后,即使当纤程308至314在同一集群上并发执行时,父线程305可以继续执行代码。
图4描绘了多个示例步骤,其中,异构计算架构可以支持并发线程处理和纤程执行。在图4中,线程305可以通过使新的线程分叉318而使新的线程实例化。其中,这些数据管理器中的任何数据管理器还可以执行对有待在集群阵列上执行的新线程的建立请求。当接收到分叉318时,调度器272可以对实行或以另外的方式执行线程所需的资源进行标识;执行该线程所需的资源可以与集群阵列65中的不同集群之间的当前资源使用进行比较(在图1的示例中)。此外,在324,可以对该线程的优先级进行标识;可以给予更高优先级线程执行的优先级。在326,已经确定为准备好开始执行的线程可以使存储器被分配并且在将要执行该线程的具体集群内的其他资源被分配。随后,当将要执行该线程内的指令以便作为整体执行该线程时,该线程所分配到的集群可以负责进行调度(328)。
图4还挑选了一个用于对有待在该集群阵列65内执行的纤程进行建立的示例流程。具体地,图4描绘了可以接收330一个新的纤程实例。在一个示例中,该纤程实例可以包括一个调度密钥,在332对该调度密钥进行标识。在333,执行收集分组算法。该收集分组算法操作用于基于对应纤程的匹配调度密钥来收集纤程。此外,每个实例化的纤程可以与一个对应的优先级相关联。在334,可以确定和使用哪些优先级来形成纤程收集的代表性优先级。在336,可以执行对有待在该集群阵列上执行的纤程的收集进行选择的算法。如以下解释的,对所选定收集的纤程进行标识的信息随后分散在该阵列的集群之间。在337,执行将所选定的纤程的一个或多个收集分散在这些集群之间。
图5描绘了纤程的声明的进一步方面,包括对于实例化纤程的纤程存储元件的声明和根据其调度密钥回收纤程的进一步方面。例如,可以在包单元205(图2)内实现图5的方面。
在图5中所描绘的示例中,一个第一实例化的纤程(如纤程实例化360)引起对所声明的纤程数据存储351进行分配,这可以由存储器写入355填入。随着计算时间的进展,可以递归地使越来越多的纤程实例化,这些纤程全都引用纤程数据存储351。然而,这些实例化纤程中的每个纤程典型地将具有一个不同的调度密钥并且因此可以与引用不同纤程数据元素存储的广泛不同的纤程分组在一起。每次递归地使进一步的纤程实例化,就增加与那些纤程相关联的引用计数。以下描述了这种引用的示例使用和其他操纵。
图5中描绘了这些概念,其中所声明的数据元素存储352和353各自被不同的纤程类群引用。图5进一步描绘了可以通过中央纤程收集和实例化358来管理所有实例化的纤程,该中央纤程收集和实例化根据其调度密钥形成那些纤程的收集。纤程收集和实例化358输出收集以便在可用的计算资源内执行。如该图例所描绘的,在这种执行过程中,每个纤程可以引用其对应的纤程数据元素,该图例指示,针对起源于创建具体纤程数据元素的初始纤程实例的所有纤程,可以重复执行过程中的读取/写入。
图5因此描绘了纤程计算概念的若干示例。从一个初始纤程实例发送或以另外的方式递归地实例化许多纤程,如图3和图4中所示,可以由一个线程创建该初始纤程实例。然而,与典型的多线程处理相比之下,每个实例化的纤程不一定被调度用于执行,或者甚至试图对其进行调度。相反,根据调度密钥来收集实例化的纤程。在图5的示例中,可以由集中调度资源完成调度,该调度资源最终在多个可独立工作的计算集群之间分发被确定准备执行的纤程收集。不管起源于具体线程的线程的数量,每个线程最终可以访问纤程数据的同一元素。如在一个示例中将描述的,使每个引用具体纤程数据元素的线程在集群阵列中的一个单个集群、或者其他可用并行计算资源上串行地执行。进一步地,因为在许多这种示例中,每个计数集群可以独立地操作用于在执行多个线程和纤程之间进行切换,从中央纤程收集点输出纤程的收集并不密切地控制何时执行这种纤程,而是如以下所解释的,该收集的纤程被存储在对最终将在其中执行那些纤程的集群而言适当的输入缓冲器中。
图6从图5的示例继续;图6描绘了纤程输入组432流,调度和工作分发抽象化430致使这些组的纤程分散在多个集群之间,图6中描绘了其中的两个集群。在图6的示例中,分散包括将对该纤程和以下将描述的其他数据的引用存储在每个集群的对应本地存储器内,由该集群的调度器访问该本地存储器。具体地,ALU集群调度器420从本地存储器424读取并且保持该本地存储器,而ALU集群调度器422从本地存储器426读取并且保持该本地存储器。每个ALU集群调度器420、422对在其对应的集群416、418上执行哪个指令流进行控制。在图6的示例中,每个集群416至418可以读访问和写访问对应的高速缓存410、412。此外,每个ALU集群416至418还可以写访问对应的简单高速缓存411和413。高速缓存410和412相对于对应物简单高速缓存411至413之间的一个操作性区别在于,预期以不同的数据频繁地覆盖该简单高速缓存并且预期数据访问之间的时间局部性比较低。相比之下,预期高速缓存410和412将时间局部性保持到更高的程度。在图6的示例中,响应于直接存储器访问建立请求,主存储器层次405对简单高速缓存411和412进行馈送,可以例如由工作分发抽象化430生成这些请求。然而,除了本地线程存储之外,高速缓存411和412典型地也将被建立成用于存储数据元素。因此,这些高速缓存将主要被控制用于线程和纤程实例化并且不基于指令特定的存储器读访问要求,尤其用于纤程执行。
图7描绘了一个集群的示例结构,例如,该集群可以用在图1或图2中所描绘的集群阵列中。图7描绘了集群控制器455可以保持多个程序计数器456至458。每个程序计数器可以用于引用来自指令存储器层次460的可用程序指令序列。在一些示例中,指令存储器层次可以包括一个指令高速缓存,可以将最近使用的指令存储在该高速缓存中。这种高速缓存可以实施例如最近使用的算法或者追踪高速缓存(trace cache)途径,其中将包括分支的指令序列保持在该高速缓存内。追踪高速缓存途径可以更适用于在其中ALU可以进行推测性执行的集群,例如,在集群控制可以包括一个预测机制以便预测是否将采取分支。
无论特定的指令实施序列,例如,可以从指令存储器层次460向多个ALU471至473提供指令462和指令464。因此,在图7中所描绘的实现方式中,每个ALU执行同一指令;然而,被提供用于该指令的执行的数据可以变化。每个ALU传达纤程完成信息476并且可以提出请求或以另外的方式为新的纤程475提供信息。可以通过纤程分配模块479保持纤程分配状态用于该集群。在一些示例中,这种模块可以包括在控制器455中。这种模块可以从全局调度器478接收状态信息。例如,这种纤程信息可以包括有待在该集群内执行的新纤程的信息。可以在全局调度器和该集群之间保持的其他信息包括纤程引用计数信息,在一些示例中,可以在集群内保持这种纤程引用计数信息,相关纤程在该集群上执行。换言之,一种示例实现方式致使在一个单个集群上执行所有相关纤程,并且在这种实现方式中,引用计数可以保持在用于那些相关纤程的集群内。
图7的示例还示出了每个ALU471至473保持一个至高速缓存480的端口。高速缓存480存储如通过线程本地存储器485至487举例说明的线程本地数据;高速缓存480还可以存储高速缓存全局变量488。高速缓存480还包括多个纤程存储器位置490至492。图7的示例还包括一个广播输入队列495。在图7的示例中,每个ALU471至473可以与用于寄存器组类似的方式使用高速缓存480,从而使得SIMD集群控制器455针对不同线程和不同纤程在逐指令的基础上对指令进行调度而不引起等待时间。可以通过高速缓存一致性/控制481对高速缓存480进行管理或者以另外的方式使其变得一致。在一些实现方式中,可以将高速缓存480分配到有区别地管理的不同部分。在一个示例中,可以将高速缓存480分成一个高速缓存部分和一个受管理部分。根据在ALU471至473中正在处理的指令序列过程生成的读/写事务填充该高速缓存部分。该高速缓存部分寻求与存储器层次的其他部分保持一致性,并且因此,至该高速缓存部分的写入将生成一致性事务。并且,为了对该高速缓存部分提供与高速缓存一样的行为,可以针对该高速缓存部分保持如标签存储器和一致性指示等技术。
该受管理部分被分配成用于特定存储计算过程中的本地数据,并且不具有与另一个存储器或存储器层次相一致的期望或目标。该受管理部分不使用标签存储器或一致性指示,因为在已知位置中的数据建立该受管理部分,并且不为了一致性而保持该存储器。因此,访问该受管理部分的正确地发起和执行的代码将能够在没有针对一致性而强制执行的限制的情况下读取和/或写入该受管理部分。纤程存储器490至492是这种存储器类型的一个示例。全局调度器或工作分发可以参与对集群本地存储器的受管理部分的建立。例如,调度抽象化430或本地存储分配208可以执行此功能。粗调度器222可以与本地存储分配208互操作以协调由线程和/或纤程使用的高速缓存的分配以及这种高速缓存的将像高速缓存一样工作的部分的分配。在一些情况下,可以像纤程的只读存储器一样处理该高速缓存部分,从而使得在促成一致性中不产生写回事务。
图8描绘了纤程例程在多个计算核心543至545上的收集、调度和分发执行的动态示例。更具体地,所描绘的示例示出了可以使有待处理505的多个纤程实例化。可以通过使纤程实例化的线程或通过使派生纤程实例化的纤程来进行如所描述的这种实例化。在一些示例性实现方式中,线程可以使新的纤程存储实例化,但纤程仅可以创建引用该实例化纤程的范围内的已经实例化的纤程存储的派生纤程。图8描绘了每个纤程定义包括一个调度密钥510、一个数据引用511,并且可以进一步包括优先化信息512。数据引用511旨在是对纤程存储的引用。可以推断出调度密钥510,或者其可以是显式的。
图8进一步描绘了两个函数模块,一个是收集形成模块515,而另一个是纤程存储保持模块516。可以作为调度器模块的一部分执行每个函数,或者可以由分开的硬件和/或软件提供每个函数。这些模块接收关于有待处理505的纤程的信息。可以在线程、纤程或其组合在核心543至545中执行的过程中生成这种信息。返回的信息可以包括该纤程的标识信息(如标识符字符串,例如,数字)、关于调度密钥的信息、以及关于当执行纤程(例如,程序计数器)时有待运行的程序的信息。然而,不是所有此信息需要被返回或传送到收集形成模块515。
例如,在一些实现方式中,可以使引用纤程存储的具体元素的所有纤程在带有可以访问该纤程存储元素的本地储存器的核心上执行(在存储器之间具有纤程元素的不相交分离的示例中)。因此,在这种实现方式中,当引用这种存储器元素的一个纤程使另一个纤程实例化时,可以本地地保持关于新实例化纤程的信息的某一部分。例如,对可以本地地保持对该纤程将要执行的程序进行标识的信息;还可以本地地保持正在被引用的纤程存储器元素的位置(相比之下,例如,从将所有纤程数据发送到中央收集保持函数-此处为收集形成模块515)。
纤程存储保持模块516结合纤程存储器建立525操作用于提供或分配核心543至545的分布式存储器中的纤程存储器存储位置。如此,纤程存储保持模块516可以保持关于核心543至545中的当前存储器使用的信息。除了纤程存储器存储之外,这种存储器使用可以包括线程的线程本地存储。
收集存储518存储纤程的与其调度密钥相关的标识,从而使得可以选择并且一起输出具有共用调度密钥的纤程的分组。调度器533可以选择需要输出纤程的哪个分组,通过具体示例示出了纤程的发送包519。包519还包括一个包标识符和一个包优先级指示符。当基于其匹配的调度密钥选择一组纤程时,调度器533可以创建这些元素。随后,在输入缓冲器540至542之间分发一个给定包的这些纤程,每个输入缓冲器对应于一个对应的核心543至545。基于具体纤程所用的纤程数据元素位于这些核心的分布式存储器之间的何处来确定纤程的分发。例如,可以基于纤程ID或基于显式的存储器引用来选择这种存储器。
当其正在执行工作负载(其可以包括多个线程和纤程例程)的每个核心可以输出纤程状态信息549。这种状态信息可以包括例如被其他纤程或线程实例化的新纤程以及关于已经完成了哪些纤程的信息。关于完成纤程的信息可以用于使要求访问纤程存储的同一元素的纤程的引用计数减量;同样,引用纤程存储的给定元素的新纤程的实例化引起这种引用计数的增加。可以由给定核心(一组相关纤程在其中执行)或由例如如图2中所示的集中资源来保持这些引用计数。
在一个示例实现方式中,使用基于硬件的散列来实施收集形成515,其中,可以根据对应的纤程标识符的散列将每个纤程开槽至一个收集中。该收集形成函数515根据调度密钥对纤程进行分组。图8描绘了分别与具有不断变化的纤程数量的收集相关联的调度密钥520至523,每个纤程被包括在收集存储518内。
总之,图8描绘了如何可以在一个分布式计算资源中并发地实例化或处理多个纤程流,而没有关于在不同的计算资源核心之间的存储器访问的同步化或程序执行的同步化的严格标准。相反,图8描绘了对有待执行的工作收集(例如,纤程)制定一个目标,即,对更大、更慢的存储器资源的访问的缓冲和数据存储的持续性,在给定计算元件序列过程中将持续地使用或更新该数据。
图9用于解释一个集群的示例操作,该集群包括根据本披露工作的多个ALU234至237。ALU集群控制器230从输入缓存器267读取以对有待执行的工作的多个部分进行标识。在本示例中,可以通过工作ID对这些工作部分进行标识,在一个实现方式中,这些工作ID是程序计数器或对有待执行的指令的其他引用。在一个示例实现方式中,这些工作ID可以是针对缓冲器267中的每个纤程指示下一个有待执行的指令的当前程序计数器。当然,在任何给定时间,不是可以将输入缓冲器267内的所有纤程拿来用于在该集群中执行,并且在这种情况下,这些工作ID可以简单地是有待针对那些对应纤程执行的纤程例程的第一指令的标识符。因此,在本示例中,可以保持等待执行的纤程的和已经部分执行的纤程的状态信息。可以将这种程序计数器保持在这种输入缓冲器内的一个原因在于,在一些实现方式中,可以从同一程序计数器驱动该集群的所有ALU,从而使得ALU集群控制器230只可以收集将要执行相同的下一个指令的纤程,以便执行。
对于ALU集群调度器可以在执行过程中中断纤程例程的实现方式(如在逐指令基础上)而言,这种状态信息更加相关。然而,在其他实现方式中,可以对来自输入缓冲器267的还没有开始执行的一组纤程例程进行调度并且可以在没有中断和不同程序流的执行的情况下对其进行完全执行。在任一种情况下,可以有区别地处理线程,因为ALU集群控制器可以中断线程的执行,如出于执行从输入缓冲器267中选定的纤程例程的目的。例如,可以中断正在执行的线程以执行纤程例程。
图9进一步描绘了从输入缓冲器267中选定的工作ID可以被分组到一个本地纤程调度输出端560中。在本示例中,对于纤程而言,每个带有匹配的工作ID的纤程可以被包括在输出端560中。每个纤程引用可以用于从线程本地和纤程存储240中检索纤程存储数据的具体元素并且向这些ALU234至237中的不同ALU提供该对应的纤程存储数据元素。类似地,包括在调度输出端560中的每个纤程可以引用存储在简单高速缓存260中的一个或多个数据元素。
在一个示例中,每个纤程可以引用简单高速缓存260中的不同数据元素,并且在不同实现方式中,被调度用于在ALU234至237上执行的这些纤程中的多个纤程可以引用来自简单高速缓存260的同一数据元素。因此,每个ALU234至237执行同一控制线程,但可以在来自简单高速缓存260的不同数据元素中的不同纤程数据元素上操作。每个ALU可以进一步输出有待存储在线程本地和纤程存储240中的信息。这些写入是针对纤程存储的对应元素,并且因为没有两个引用同一纤程存储元素的纤程被调度用于由ALU235至237并行执行,所以在这种实现方式中,针对这种纤程存储位置,用于线程本地和纤程存储240的保护机制是不必要的。还可以从ALU234至237向ALU集群控制器230提供关于纤程调度和状态的信息564。反过来,ALU集群控制器230可以对纤程存储位置计数565进行更新以将由已经执行的纤程例程创建的新纤程计算在内并且还将现在已经完成的纤程计算在内。然而,应指出的是,在许多实现方式中,ALU集群控制器不对用已经创建的新纤程填充其输入缓冲器267进行控制。相反,用中央控制器填充输入缓冲器267,该中央控制器还填充了其他ALU集群(此处未描绘)的一个或多个其他输入缓冲器。
图10描绘了一种情况:计算集群的本地存储器存储多个线程本地变量和多个纤程数据存储元素,例如,线程588使用存储器589中的该本地存储部分590。预期在线程建立过程中分配本部分作为该线程588能够使用的最大量存储器。图10描绘了纤程582和584的两个不同族,两者引用纤程存储591的不同位置,而每族的成员引用纤程存储的同一元素。图10进一步描绘了给定纤程(例如,纤程584)族的成员进行的存储器引用将要这些相关纤程的递归实例化的过程中发生变化。在本示例中,对主存储器587进行这些存储器引用585。进一步地,本示例示出了这些存储器引用可以在规则跨步或区间588上。在一些实现方式中,这些存储器引用可以用作调度密钥来收集不同族的纤程,例如,可以基于这些存储器引用的匹配将来自纤程582和纤程584的纤程收集在一起。图10进一步描绘了计算资源592,这些计算资源可以被配置成用于执行纤程和友元(friends)(如以上解释的)并且是基于对在计算592中并发执行的线程和纤程的控制流进行追踪的程序计数器。
如将从以上理解到的,可以将存储器589分配给多个不同的管理方案。可以作为高速缓存管理存储器589的一部分,其中,如最近使用的高速缓存管理策略可以对什么数据存储在该存储器中进行控制。并且,存储器589的这种高速缓存部分将具有与存储器层次中其他存储器组件(如主存储器587)相一致的目的。这种高速缓存部分可以被安排成交叉存储器或该高速缓存部分内的其他合适的组织途径。图10描绘了这种存储器部分作为高速缓存部分594。可以使分配至高速缓存部分594的存储器598的量值改变或变化。在一些实现方式中,该变化可以动态地发生;在其他情况下,可以在计算的建立阶段作出该变化;如在计算工作负载的两个独特的部分之间。例如,在图形处理工作负载中,可以在帧的渲染之间进行重新分配。其他可以引起重新分配的条件是线程(例如,线程588)完成、空出附加存储器。
除了高速缓存部分594以外,存储器589还包括一个管理部分,其中,纤程存储591是一个示例。该管理部分具有与高速缓存部分594的特征不相同的特征。该管理部分不具有与存储器层次中的其他存储器(例如,存储器587)相一致的期望或目的。应指出的是,该管理部分中的数据可以被写出到存储器587,或者以另外的方式可用于被非本地计算访问。然而,在可以包括至该存储器的许多读取和写入的本地计算序列之后出现写入或可访问性,不针对该内产生成存储器一致性操作。
可以基于确定与另一个执行或调度纤程存在存储器冲突来调度纤程以开始执行,或者可以基于这种存储器冲突检查而类似地发送来自纤程的指令或者将其暂留而不进行发送。在面向线程的计算中,发送来自线程的指令以便执行,并且当一个指令发起将会对一个不同指令造成危害的存储器事务时,通过对存储器位置进行锁定来保持存储器正确性。该不同指令可以开始执行,但该线程(该指令是其一部分)将停止,等待消除该危害。
图11描绘了一个进程的多个部分,该进程可以由这些披露的实现方式中提供的集中控制器执行。所描绘的进程包括接收(602)纤程例程的规范。基于该规范,可以对主存储器读操作进行标识(604)。可以从该主存储器读操作对存储器地址或其一部分进行标识(606);所标识的存储器地址或其一部分可以用作调度密钥。这种调度密钥的一种用途是对调度密钥或其多个部分进行比较/使其匹配(608)以便将纤程收集(610)在一起。选择(612)多组纤程以便给予如优先级、收集丰满度等标准、以及启发法进行调度。
如以上解释的,可以或者由线程或或者另一个纤程单独地使纤程实例化。然而,发送纤程以便在多个组中执行。如果希望针对这种纤程分组实施优先化方案,则图12中举例说明了这种优先化的一种方法。图12描绘了有待分组646的多个纤程是可用的,可以根据其纤程密钥(在此也称为调度密钥)来收集或存储(623)这些纤程。每个纤程还可以与一个单独优先级相关联,可以获得(638)该优先级。当确定了这种纤程的分组时,还可以确定(640)每个确定分组的优先级(642)。还可以确定(642)包标识符644。
可以提供各种方法用于基于包括在该分组内的单独纤程的优先级确定纤程的分组的优先级。在一个示例中,这些单独纤程优先级的平均值可以用于建立一个组优先级。在另一个示例中,当具有特别高优先级的纤程可以对该组的总体优先级具有比简单平均值将提供的高得多的影响时,可以使用加权平均值。在其他实现方式中,分配给纤程分组的优先级也会受到在系统内执行的线程的当前状态的影响。
为了促成这种示例变化,图12还描绘了包的纤程所使用的纤程数据的所期望的存储位置可以用于确定该包的优先级。例如,如果存储给定包中的纤程的纤程数据的多个存储器正接近容量,则可以提高这种包的优先级。值得注意地,由于纤程存储已经被分配用于纤程(除了新实例化的纤程族之外),所以不一定需要更多的本地存储以便增加同一族内的纤程的数量。
图13描绘了以上的一些披露的概述中的进程。所描绘的进程包括:确定(682)纤程的收集以调度用于执行;发送(684)表示所确定纤程收集的包。在处理集群的不同输入队列之间分发(686)这种纤程包,这些处理集群将基于其对应的输入队列的内容执行该计算,并且其中已经为执行对线程进行了调度或标符号。
图14进一步解释了在示例内计算的这种纤程的某些方面,在该示例中,收集存储器703存储各种纤程的信息,根据纤程是哪个收集中的成员来组织这些纤程。通常期望一个纤程只存在于一个收集内;然而,将期望引用同一纤程数据元素的纤程可以存在于收集存储器703内的大量收集中。为了促进该示例,选择收集705、707、709和711用于发送。响应于这种选择,发起对主存储器层次701的事务,向线程本地和纤程存储727、729和731提供这些事务的结果。然而,在输入缓冲器721、723和725之间发送和分发所选定的收集。在一个示例中,这种分发可以基于每个纤程的标识符的一部分,该标识符部分反过来可以与线程本地和纤程存储的存储器地址范围相关。所描绘的示例还示出了,对于任何给定的纤程包而言,通常期望平均地在不同的计算集群之间分发这些纤程,并且其不集中到这些集群的仅一个子集中。
图15描绘了以上示例中所示的输入缓冲器的实现方式的示例。图15描绘了有待在多个计算集群的多个输入缓冲器之间分发的新收集742。每个输入缓冲器可以保持一个每纤程优先级750。最初,这种每纤程优先级可以基于包优先级,但可以被本地集群控制器更新。此外,可以提供纤程的一种老化机制,其中,可以将这种老化输入到纤程优先级选择中。在上下文中还可以将图15理解成纤程计算的实现方式允许集中选择将选择哪些计算部分用于在计算时间的一般窗口内执行,并且可以完成和缓冲将被那些计算部分需要的主存储器访问,其结果是这种主存储器访问以分发的方式存储在将执行这些计算部分的计算集群之间。然而,在每个计算集群内,可以提供什么指令执行以及以什么顺序的广泛自主权,其中,由本地控制器处理这种本地调度,以将特定于该控制器的条件考虑在内并且避免这些计算集群之间的协调引起的开销。
图16描绘了根据本披露的示例进程的多个方面。在780,接收纤程例程的规范,并且在782,对该纤程例程内的主存储器读操作进行标识。在784,将存储器地址(或其一部分)标识为调度密钥。可以针对不同的纤程多次执行进程部分780、782和784。在786,对不同纤程的调度密钥进行比较。在788,根据其调度密钥回收纤程。在790,根据如准备就绪的标准选择纤程的一个或多个收集用于执行。准备就绪的标准可以包括多个方面,如优先级和数目启发法。
期望纤程通过写回到本地纤程存储来施加影响或输出,并且不针对共享存储器资源进行仲裁。进一步地,在许多实现方式中,对纤程例程进行编码以避免对另一个例程进行调用,该另一个例程返回一个值并且引起该纤程例程无限期停止,从而等待返回这种值。因此,针对语法分量和对纤程进行实例化或以其他方式进行调用,在这些实现方式中,还不需要停止或等待该纤程将任何值返回至该调用线程或其他纤程。如此,完成任何具体纤程的执行的时间不那么关键,因为不需要停止其他计算流程来等待完成该纤程。
在以上许多示例实现方式中描述了调度密钥。在一些实现方式中,并且在一些情况下,取决于正在执行的工作负载的性质,调度密钥可以被压缩或以另外的方式用速记符号被引用。光线追踪的示例工作负载将被用作一个示例。在这种示例中,父光线追踪线程可以针对其想要在场景中追踪的每条光线输出一个不同的纤程。因此,一些线程可以输出若干个纤程,一些线程可以输出数千万或数亿、或数十亿的纤程。在一些情况下,每个线程可以最初以同一个调度密钥开始。在一个示例中,这种调度密钥可以引用对3-D场景进行细分的加速结构的第一元素的起始存储地址。可以用规则的间隔将该结构的元素存储在存储器中(例如,可以用四倍字长存储每个元素)。如此,可以将某种纤程例程建立成具有一个默认调度密钥;例如,加速结构遍历纤程例程可以具有该加速结构的头元素作为默认。因此,使这种纤程实例化的线程不需要显式地对该位置进行标识。
加速结构的示例包括但不限于包围体积层次,如球体和矩形层次以及kD树。例如,在均匀的球体层次中,这种结构的元素为球体。如果该加速结构是同构的,则该结构中的叶节点包围图元;异构结构可以具有包围其他加速结构元素和图元的元素。
以上描绘和描述了各种结构、设备、组件和其他组成元件,并且相互关系允许数据和其他信息在它们两者之间和两者以上之间流动,并且描述了它们的功能和用途。这些是用于执行本披露中归属与它们的功能和用途的装置。
任何方法的代码可以存储在非瞬态计算机可读介质(如固态驱动器、硬盘驱动器、CD-ROM和其他光存储装置)中和瞬态地存储在非易失性存储器中。计算机可读介质还可以包括通信信号。当这种代码体现在通信信号中并且由计算机读取和处理该信号时,计算机将该信号及其物理介质用作计算机可读介质。
计算机可执行指令包括例如指令和数据,其致使或以另外的方式配置通用计算机、专用计算机或专用处理设备执行某个功能或功能的组合。这些计算机可执行指令可以是例如二进制指令、中间格式指令(如汇编语言或源代码)。在此描述的API的一些方面可以被实现作为程序、函数、或对这种程序和函数的调用。本说明书暗示对可以用于实现或提供被描述为通过这些程序或函数可用的功能性的编程方法学没有限制,只要软件、硬件或其混合物为程序员提供通过因此提供的接口访问这种函数性的能力。关于实现方式中需要调用执行这些函数的什么代码,这些名称没有暗示任何要求。
在一些示例中,用于执行线程和纤程的计算资源可以大部分是无差别的。相反,可以通过中央控制器实现在此描述的纤程计算特征中的许多特征,该中央控制器对纤程进行分组以便在提供这些计算资源的计算资源输入队列之间发送和分散,并且需要给定纤程存储元素的纤程的协调和计数仍然存在。
如从这些披露中认识到的,其中可以使用纤程计算的一种示例情况是这样一种情况:大量第一类型数据元素(其不全都已知为先验知识)需要与大的且预先确定的数据集一起处理或使用。在一些示例情况下,一些第一类型数据元素与所预先确定的数据集的一部分一起的处理影响那些第一类型数据元素与所预先确定的数据集的其他部分一起处理的程度。所预先确定的数据集也可以不同,如相对不频繁地被更新。在一个示例图形应用程序中,可以一秒更新所预先确定的数据集几百次并且其可以包括数以百万计的项目,其一秒可以被访问数百万或数十亿次。通常,用于线程计算的集中调度器可以基于所期望的计算吞吐量的最大化而不是基于明确提供任何具体纤程的优先化来对纤程收集进行调度。
以上描述的各种示例仅出于说明目的而进行提供,并且不应当被解释为限制性的。例如,仅呈现了光线追踪行为的限制示例,并且应理解到实际实现方式涉及到许多更多的光线以及光线的经常更加并发的处理。可以从该角度采用和理解在此的披露。此外,分离开的盒或所展示系统的功能元件的所展示的分离暗示不要求这种功能的物理分离,因为可以通过消息发送、函数调用、共享存储器空间等进行这种元件之间的通信,而没有任何这种物理分离。更普遍地,普通技术人员将能够将与编程语义相关的披露适配用于各种其他光线追踪/光线着色实现方式,并且没有暗示对从系统、方法和用于解释其示例的其他披露存在的其应用的限制。
附录

Claims (13)

1.一种能够执行并发图形计算的处理系统,包括:
多个计算元件,每个计算元件包括本地存储器和多个单指令多数据(SIMD)算术逻辑单元(ALU);
调度器和包单元,所述调度器可操作用于接收输入,所述输入对有待在所述多个计算元件上执行的第一类型计算的实例进行定义,其中计算的每个实例与所述多个计算元件之一的本地存储器中存储的对应的数据元素以及对应的调度密钥相关联,所述包单元可操作用于根据其调度密钥将所述实例分组成包,并且发出包括多个计算实例的包;以及
分发器,可操作用于接收所述包,并且在计算元件之间分发所述计算的实例,以便在其上执行,其中
所述计算元件中的每个计算元件可操作用于使计算的实例组合,以便由其所述算术逻辑单元进行并发的执行,为此,应当执行相同类型的计算并且指代其所述本地存储器中存储的不同数据元素以对于所述组合的计算实例并发地执行所述计算。
2.如权利要求1所述的处理系统,其中,每个计算的实例定义图形计算的一部分。
3.如权利要求1所述的处理系统,其中,针对对读取和写入开放的存储器位置的存储器访问,通过对第一类型计算的不同实例之间的冲突存储器范围进行标识,在已经将访问所述冲突存储器范围的指令发送用于执行之前,能够使所述第一类型计算的实例与其他实例同步。
4.如权利要求3所述的处理系统,其中,冲突存储器范围使用实例特定的存储器地址和实例特定的寄存器位置中的一个或多个来进行标识。
5.如权利要求3所述的处理系统,其中,所述多个计算元件可操作用于执行来自第二类型计算的程序的指令,其中,使用读/写锁和屏障中的一个或多个使来自进行中的所述第二类型的程序的指令对于存储器访问同步。
6.如权利要求1所述的处理系统,其中,所述系统进一步可操作用于在建立阶段过程中在所述多个计算元件之间分配实例特定的存储器范围。
7.如权利要求1所述的处理系统,其中,每个计算元件可操作用于根据包括以下内容的标准来对实例分组进行调度:(1)来自共同指令源的执行,以及(2)强制执行以下规则:没有任何有待并行执行的实例的分组包括写入相同存储器位置的多个实例。
8.一种能够执行并发图形计算的方法,所述方法包括:
使用调度器接收输入,所述输入对有待在多个计算元件上执行的第一类型计算的实例进行定义,每个计算元件包括本地存储器和多个单指令多数据(SIMD)算术逻辑单元(ALU),其中计算的每个实例与所述多个计算元件之一的本地存储器中存储的对应的数据元素以及对应的调度密钥相关联;
使用包单元根据其调度密钥将所述实例分组成包,并且发出包括多个计算实例的包;以及
使用分发器接收所述包,并且在计算元件之间分发所述计算的实例,以便在其上执行,其中所述计算元件中的每个计算元件可操作用于使计算的实例组合,以便由其所述算术逻辑单元进行并发的执行,为此,应当执行相同类型的计算并且指代其所述本地存储器中存储的不同数据元素以对于所述组合的计算实例并发地执行所述计算。
9.如权利要求8所述的方法,其中,每个实例定义图形计算的一部分。
10.如权利要求8所述的方法,其中,针对对读取和写入开放的存储器位置的存储器访问,通过对第一类型计算的不同实例之间的冲突存储器范围进行标识,在已经将访问所述冲突存储器范围的指令发送用于执行之前,能够使所述第一类型计算的实例与其他实例同步。
11.如权利要求10所述的方法,其中,冲突存储器范围使用实例特定的存储器地址和实例特定的寄存器位置中的一个或多个来进行标识。
12.如权利要求10所述的方法,其中,所述多个计算元件可操作用于执行来自第二类型计算的程序的指令,其中,使用读/写锁和屏障中的一个或多个使来自进行中的所述第二类型的程序的指令对于存储器访问同步。
13.如权利要求8所述的方法,其中,每个计算元件可操作用于根据包括以下内容的标准来对实例分组进行调度:(1)来自共同指令源的执行,以及(2)强制执行以下规则:没有任何有待并行执行的实例的分组包括写入相同存储器位置的多个实例。
CN201280039793.7A 2011-06-16 2012-06-15 具有无阻塞并行架构的图形处理器 Active CN103765376B (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US201161497915P 2011-06-16 2011-06-16
US61/497,915 2011-06-16
PCT/US2012/042591 WO2012174334A1 (en) 2011-06-16 2012-06-15 Graphics processor with non-blocking concurrent architecture

Publications (2)

Publication Number Publication Date
CN103765376A CN103765376A (zh) 2014-04-30
CN103765376B true CN103765376B (zh) 2017-05-31

Family

ID=47357481

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201280039793.7A Active CN103765376B (zh) 2011-06-16 2012-06-15 具有无阻塞并行架构的图形处理器

Country Status (5)

Country Link
US (6) US8692834B2 (zh)
CN (1) CN103765376B (zh)
DE (1) DE112012002465T5 (zh)
GB (3) GB2529075A (zh)
WO (1) WO2012174334A1 (zh)

Families Citing this family (27)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9478062B2 (en) * 2006-09-19 2016-10-25 Imagination Technologies Limited Memory allocation in distributed memories for multiprocessing
US8789065B2 (en) 2012-06-08 2014-07-22 Throughputer, Inc. System and method for input data load adaptive parallel processing
US20130117168A1 (en) 2011-11-04 2013-05-09 Mark Henrik Sandstrom Maximizing Throughput of Multi-user Parallel Data Processing Systems
US9448847B2 (en) 2011-07-15 2016-09-20 Throughputer, Inc. Concurrent program execution optimization
US9875139B2 (en) * 2012-05-29 2018-01-23 Qatar Foundation Graphics processing unit controller, host system, and methods
US9977683B2 (en) * 2012-12-14 2018-05-22 Facebook, Inc. De-coupling user interface software object input from output
US9436721B2 (en) * 2014-02-28 2016-09-06 International Business Machines Corporation Optimization of mixed database workload scheduling and concurrency control by mining data dependency relationships via lock tracking
WO2015167159A1 (en) 2014-05-02 2015-11-05 Samsung Electronics Co., Ltd. Rendering system and method for generating ray
KR102219289B1 (ko) 2014-05-27 2021-02-23 삼성전자 주식회사 레이 트레이싱 시스템에서의 가속 구조 탐색 장치 및 그 탐색 방법
US9959839B2 (en) * 2015-06-24 2018-05-01 Intel Corporation Predictive screen display method and apparatus
US11275721B2 (en) * 2015-07-17 2022-03-15 Sap Se Adaptive table placement in NUMA architectures
CN105282561A (zh) * 2015-10-21 2016-01-27 北京中科大洋科技发展股份有限公司 一种基于集群渲染的立体电视信号编辑系统
US9892544B2 (en) * 2015-12-22 2018-02-13 Intel Corporation Method and apparatus for load balancing in a ray tracing architecture
US20170372448A1 (en) * 2016-06-28 2017-12-28 Ingo Wald Reducing Memory Access Latencies During Ray Traversal
CN106407063B (zh) * 2016-10-11 2018-12-14 东南大学 一种GPU L1 Cache处访存序列的仿真生成与排序方法
US20180173560A1 (en) * 2016-12-21 2018-06-21 Apple Inc. Processing circuit hardware resource allocation system
US11119972B2 (en) * 2018-05-07 2021-09-14 Micron Technology, Inc. Multi-threaded, self-scheduling processor
CN108710543A (zh) * 2018-05-21 2018-10-26 苏州本乔信息技术有限公司 一种渲染任务的处理方法及设备
CN110825665B (zh) * 2018-08-10 2021-11-05 昆仑芯(北京)科技有限公司 数据获取单元和应用于控制器的数据获取方法
US10699465B1 (en) * 2018-12-28 2020-06-30 Intel Corporation Cluster of scalar engines to accelerate intersection in leaf node
US11487586B2 (en) * 2019-02-28 2022-11-01 International Business Machines Corporation Time-based element management in a computer system using temporal node trees
US11921637B2 (en) * 2019-05-24 2024-03-05 Texas Instruments Incorporated Write streaming with cache write acknowledgment in a processor
CN111143042A (zh) * 2019-11-14 2020-05-12 武汉纺织大学 一种通过依赖性分析加速gpu的并行化方法及系统
EP4113448A1 (en) * 2021-06-29 2023-01-04 Imagination Technologies Limited Scheduling processing in a ray tracing system
CN113609038B (zh) * 2021-10-11 2022-02-11 摩尔线程智能科技(北京)有限责任公司 中断处理方法、装置和电子设备
US20230229525A1 (en) * 2022-01-20 2023-07-20 Dell Products L.P. High-performance remote atomic synchronization
US20230305853A1 (en) * 2022-03-25 2023-09-28 Nvidia Corporation Application programming interface to perform operation with reusable thread

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4466061A (en) * 1982-06-08 1984-08-14 Burroughs Corporation Concurrent processing elements for using dependency free code
CN101479704A (zh) * 2006-03-27 2009-07-08 相干逻辑公司 为多处理器系统设计程序
CN101589366A (zh) * 2006-12-01 2009-11-25 莫雷克斯公司 面向生成器图形的编程框架中的并行化和植入
CN101802789A (zh) * 2007-04-11 2010-08-11 苹果公司 多处理器上的并行运行时执行
US7925860B1 (en) * 2006-05-11 2011-04-12 Nvidia Corporation Maximized memory throughput using cooperative thread arrays

Family Cites Families (78)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4625289A (en) 1985-01-09 1986-11-25 Evans & Sutherland Computer Corp. Computer graphics system of general surface rendering by exhaustive sampling
US5239654A (en) * 1989-11-17 1993-08-24 Texas Instruments Incorporated Dual mode SIMD/MIMD processor providing reuse of MIMD instruction memories as data memories when operating in SIMD mode
EP0459761A3 (en) 1990-05-31 1993-07-14 Hewlett-Packard Company Three dimensional computer graphics employing ray tracking to compute form factors in radiosity
US6559843B1 (en) 1993-10-01 2003-05-06 Compaq Computer Corporation Segmented ray casting data parallel volume rendering
GB9424273D0 (en) 1994-12-01 1995-01-18 Wrigley Adrian M T Improvements in and relating to image constrcution
US6529193B1 (en) 1996-06-25 2003-03-04 Mental Images Gmbh & Co. Kg System and method for generating pixel values for pixels in an image using strictly deterministic methodologies for generating sample points
JP2970553B2 (ja) * 1996-08-30 1999-11-02 日本電気株式会社 マルチスレッド実行方法
US5973699A (en) 1996-09-19 1999-10-26 Platinum Technology Ip, Inc. System and method for increasing the performance for real-time rendering of three-dimensional polygonal data
US6111582A (en) 1996-12-20 2000-08-29 Jenkins; Barry L. System and method of image generation and encoding using primitive reprojection
US6023279A (en) 1997-01-09 2000-02-08 The Boeing Company Method and apparatus for rapidly rendering computer generated images of complex structures
US6028608A (en) 1997-05-09 2000-02-22 Jenkins; Barry System and method of perception-based image generation and encoding
US6489955B1 (en) 1999-06-07 2002-12-03 Intel Corporation Ray intersection reduction using directionally classified target lists
US6820261B1 (en) * 1999-07-14 2004-11-16 Sun Microsystems, Inc. Inheritable thread-local storage
US6556200B1 (en) 1999-09-01 2003-04-29 Mitsubishi Electric Research Laboratories, Inc. Temporal and spatial coherent ray tracing for rendering scenes with sampled and geometry data
US6532520B1 (en) * 1999-09-10 2003-03-11 International Business Machines Corporation Method and apparatus for allocating data and instructions within a shared cache
US6344837B1 (en) 2000-06-16 2002-02-05 Andrew H. Gelsey Three-dimensional image display with picture elements formed from directionally modulated pixels
US7184042B2 (en) 2000-06-19 2007-02-27 Mental Images Gmbh Computer graphic system and computer-implemented method for generating images using a ray tracing methodology that makes use of a ray tree generated using low-discrepancy sequences and ray tracer for use therewith
US7499053B2 (en) 2000-06-19 2009-03-03 Mental Images Gmbh Real-time precision ray tracing
AU2002245076A1 (en) 2000-12-06 2002-07-16 Sun Microsystems, Inc. Using ancillary geometry for visibility determination
US7009608B2 (en) 2002-06-06 2006-03-07 Nvidia Corporation System and method of using multiple representations per object in computer graphics
US6853377B2 (en) 2002-06-26 2005-02-08 Nvidia Corporation System and method of improved calculation of diffusely reflected light
US7012604B1 (en) 2002-09-12 2006-03-14 Advanced Micro Devices, Inc. System architecture for high speed ray tracing
CA2506419C (en) 2002-11-15 2014-01-21 Sunfish Studio, Inc. Visible surface determination system & methodology in computer graphics using interval analysis
EP1586020A2 (en) 2003-01-25 2005-10-19 Purdue Research Foundation Methods, systems, and data structures for performing searches on three dimensional objects
US7098907B2 (en) 2003-01-30 2006-08-29 Frantic Films Corporation Method for converting explicitly represented geometric surfaces into accurate level sets
US7015913B1 (en) * 2003-06-27 2006-03-21 Nvidia Corporation Method and apparatus for multithreaded processing of data in a programmable graphics processor
US6862027B2 (en) * 2003-06-30 2005-03-01 Microsoft Corp. System and method for parallel execution of data generation tasks
US7212207B2 (en) 2003-08-20 2007-05-01 Sony Computer Entertainment Inc. Method and apparatus for real-time global illumination incorporating stream processor based hybrid ray tracing
DE602004017879D1 (de) * 2003-08-28 2009-01-02 Mips Tech Inc Integrierter mechanismus zum suspendieren und endznem prozessor
US7103720B1 (en) * 2003-10-29 2006-09-05 Nvidia Corporation Shader cache using a coherency protocol
JP2005284749A (ja) * 2004-03-30 2005-10-13 Kyushu Univ 並列処理コンピュータ
US7324112B1 (en) * 2004-04-12 2008-01-29 Nvidia Corporation System and method for processing divergent samples in a programmable graphics processing unit
US9098932B2 (en) * 2004-08-11 2015-08-04 Ati Technologies Ulc Graphics processing logic with variable arithmetic logic unit control and method therefor
US7460126B2 (en) * 2004-08-24 2008-12-02 Silicon Graphics, Inc. Scalable method and system for streaming high-resolution media
US20060098009A1 (en) 2004-10-28 2006-05-11 Miguel Zuniga Method and apparatus for ray and range queries using wide object isolation techniques
US7689989B2 (en) * 2004-12-28 2010-03-30 Sap Ag Thread monitoring using shared memory
US7969437B2 (en) 2004-12-28 2011-06-28 Intel Corporation Method and apparatus for triangle representation
US7318126B2 (en) * 2005-04-11 2008-01-08 International Business Machines Corporation Asynchronous symmetric multiprocessing
US7602395B1 (en) * 2005-04-22 2009-10-13 Nvidia Corporation Programming multiple chips from a command buffer for stereo image generation
US7836284B2 (en) * 2005-06-09 2010-11-16 Qualcomm Incorporated Microprocessor with automatic selection of processing parallelism mode based on width data of instructions
US20070030277A1 (en) * 2005-08-08 2007-02-08 Via Technologies, Inc. Method for processing vertex, triangle, and pixel graphics data packets
US7659898B2 (en) * 2005-08-08 2010-02-09 Via Technologies, Inc. Multi-execution resource graphics processor
US7973790B2 (en) 2005-08-11 2011-07-05 Realtime Technology Ag Method for hybrid rasterization and raytracing with consistent programmable shading
US7594095B1 (en) * 2005-11-29 2009-09-22 Nvidia Corporation Multithreaded SIMD parallel processor with launching of groups of threads
US7447873B1 (en) * 2005-11-29 2008-11-04 Nvidia Corporation Multithreaded SIMD parallel processor with loading of groups of threads
US20070132754A1 (en) 2005-12-12 2007-06-14 Intel Corporation Method and apparatus for binary image classification and segmentation
US8077174B2 (en) * 2005-12-16 2011-12-13 Nvidia Corporation Hierarchical processor array
US7634637B1 (en) * 2005-12-16 2009-12-15 Nvidia Corporation Execution of parallel groups of threads with per-instruction serialization
FR2896895B1 (fr) 2006-02-01 2008-09-26 Redway Soc Par Actions Simplifiee Procede de synthese d'une image virtuelle par lancer de faisceaux
US8884972B2 (en) * 2006-05-25 2014-11-11 Qualcomm Incorporated Graphics processor with arithmetic and elementary function units
US7461238B2 (en) * 2006-06-07 2008-12-02 International Business Machines Corporation Simple load and store disambiguation and scheduling at predecode
US8261270B2 (en) * 2006-06-20 2012-09-04 Google Inc. Systems and methods for generating reference results using a parallel-processing computer system
US20080024489A1 (en) 2006-07-28 2008-01-31 Robert Allen Shearer Cache Utilization Optimized Ray Traversal Algorithm with Minimized Memory Bandwidth Requirements
US7864174B2 (en) 2006-08-24 2011-01-04 International Business Machines Corporation Methods and systems for reducing the number of rays passed between processing elements in a distributed ray tracing system
US9478062B2 (en) * 2006-09-19 2016-10-25 Imagination Technologies Limited Memory allocation in distributed memories for multiprocessing
US9665970B2 (en) * 2006-09-19 2017-05-30 Imagination Technologies Limited Variable-sized concurrent grouping for multiprocessing
US8018457B2 (en) * 2006-09-19 2011-09-13 Caustic Graphics, Inc. Ray tracing system architectures and methods
US8345053B2 (en) * 2006-09-21 2013-01-01 Qualcomm Incorporated Graphics processors with parallel scheduling and execution of threads
US7884819B2 (en) 2006-09-27 2011-02-08 International Business Machines Corporation Pixel color accumulation in a ray tracing image processing system
US8010966B2 (en) * 2006-09-27 2011-08-30 Cisco Technology, Inc. Multi-threaded processing using path locks
US7940266B2 (en) 2006-10-13 2011-05-10 International Business Machines Corporation Dynamic reallocation of processing cores for balanced ray tracing graphics workload
US7852336B2 (en) 2006-11-28 2010-12-14 International Business Machines Corporation Dynamic determination of optimal spatial index mapping to processor thread resources
US8139060B2 (en) 2006-11-28 2012-03-20 International Business Machines Corporation Ray tracing image processing system
WO2008067483A1 (en) 2006-11-29 2008-06-05 University Of Utah Research Foundation Ray tracing a three dimensional scene using a grid
KR100889602B1 (ko) 2006-12-05 2009-03-20 한국전자통신연구원 광선 추적을 위한 광선-삼각형 충돌 처리 방법 및 장치
US8085267B2 (en) 2007-01-30 2011-12-27 International Business Machines Corporation Stochastic addition of rays in a ray tracing image processing system
US8131941B2 (en) * 2007-09-21 2012-03-06 Mips Technologies, Inc. Support for multiple coherence domains
US20090138890A1 (en) * 2007-11-21 2009-05-28 Arm Limited Contention management for a hardware transactional memory
US9043801B2 (en) 2008-01-15 2015-05-26 International Business Machines Corporation Two-tiered dynamic load balancing using sets of distributed thread pools
US9183662B1 (en) * 2008-05-22 2015-11-10 Nvidia Corporation System and method for enabling scene program functionality
US8390631B2 (en) * 2008-06-11 2013-03-05 Microsoft Corporation Synchronizing queued data access between multiple GPU rendering contexts
US8200594B1 (en) * 2008-09-10 2012-06-12 Nvidia Corporation System, method, and computer program product for accelerating a game artificial intelligence process
US8310492B2 (en) * 2009-09-03 2012-11-13 Ati Technologies Ulc Hardware-based scheduling of GPU work
US8963931B2 (en) * 2009-09-10 2015-02-24 Advanced Micro Devices, Inc. Tiling compaction in multi-processor systems
US8817031B2 (en) * 2009-10-02 2014-08-26 Nvidia Corporation Distributed stream output in a parallel processing unit
US8423717B2 (en) * 2009-12-02 2013-04-16 Honeywell International Inc. Multi-core processing cache image management
US8627331B1 (en) * 2010-04-30 2014-01-07 Netapp, Inc. Multi-level parallelism of process execution in a mutual exclusion domain of a processing system
US20120151145A1 (en) * 2010-12-13 2012-06-14 Advanced Micro Devices, Inc. Data Driven Micro-Scheduling of the Individual Processing Elements of a Wide Vector SIMD Processing Unit

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4466061A (en) * 1982-06-08 1984-08-14 Burroughs Corporation Concurrent processing elements for using dependency free code
CN101479704A (zh) * 2006-03-27 2009-07-08 相干逻辑公司 为多处理器系统设计程序
US7925860B1 (en) * 2006-05-11 2011-04-12 Nvidia Corporation Maximized memory throughput using cooperative thread arrays
CN101589366A (zh) * 2006-12-01 2009-11-25 莫雷克斯公司 面向生成器图形的编程框架中的并行化和植入
CN101802789A (zh) * 2007-04-11 2010-08-11 苹果公司 多处理器上的并行运行时执行

Also Published As

Publication number Publication date
GB2505818A (en) 2014-03-12
US8692834B2 (en) 2014-04-08
GB2529075A (en) 2016-02-10
US20160335791A1 (en) 2016-11-17
US20230245374A1 (en) 2023-08-03
US10861214B2 (en) 2020-12-08
GB2529074A (en) 2016-02-10
US9098918B2 (en) 2015-08-04
GB201516158D0 (en) 2015-10-28
WO2012174334A1 (en) 2012-12-20
US20150339798A1 (en) 2015-11-26
US11625885B2 (en) 2023-04-11
CN103765376A (zh) 2014-04-30
GB201322076D0 (en) 2014-01-29
US9430811B2 (en) 2016-08-30
US20140327683A1 (en) 2014-11-06
GB2505818B (en) 2016-02-10
GB201516157D0 (en) 2015-10-28
US20130222402A1 (en) 2013-08-29
DE112012002465T5 (de) 2014-03-20
US20210065425A1 (en) 2021-03-04

Similar Documents

Publication Publication Date Title
CN103765376B (zh) 具有无阻塞并行架构的图形处理器
US11367160B2 (en) Simultaneous compute and graphics scheduling
US9478062B2 (en) Memory allocation in distributed memories for multiprocessing
CN103425533B (zh) 用于管理嵌套执行流的方法和系统
US20120133654A1 (en) Variable-sized concurrent grouping for multiprocessing
CN107092573A (zh) 异构计算系统中的工作窃取
CN109478136A (zh) 使用虚拟向量寄存器文件的系统和方法
CN103218309A (zh) 多级指令高速缓存预取
CN103176848A (zh) 计算工作分布参考计数器
CN110032450B (zh) 一种基于固态盘扩展内存的大规模深度学习方法及系统
Cederman et al. Dynamic load balancing using work-stealing
CN115588068A (zh) 带有并行光线测试的光线相交电路
CN106971369B (zh) 一种基于gpu的地形可视域分析的数据调度与分发方法
Aldinucci et al. On designing multicore-aware simulators for biological systems
Zheng et al. HiWayLib: A software framework for enabling high performance communications for heterogeneous pipeline computations
Vinkler et al. Massively parallel hierarchical scene processing with applications in rendering
Zhang et al. Design of a multithreaded Barnes-Hut algorithm for multicore clusters
Hawick et al. Mixing multi-core CPUs and GPUs for scientific simulation software
Lauterback et al. Work distribution methods on GPUs
Wende Dynamic Load Balancing on Massively Parallel Computer Architectures
Hermann Interactive Physical Simulation on Multi-core and Multi-GPU Architectures
Vasudevan Static Task Partitioning Techniques for Parallel Applications on Heterogeneous Processors
Lester Improving performance of collection-oriented operations through parallel fusion
Hlavatý Parallel trajectory planning on gpu
Jingbo Graph Processing on GPU

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
ASS Succession or assignment of patent right

Owner name: ENVISION TECHNOLOGIES GMBH

Free format text: FORMER OWNER: CAUSTIC GRAPHICS INC.

Effective date: 20150430

C41 Transfer of patent application or patent right or utility model
TA01 Transfer of patent application right

Effective date of registration: 20150430

Address after: Hertfordshire

Applicant after: Imagination Technologies Limited

Address before: American California

Applicant before: Caustic Graphics Inc.

GR01 Patent grant
GR01 Patent grant