用于启动可调用函数的系统和方法

文档序号:6514383阅读:262来源:国知局
用于启动可调用函数的系统和方法
【专利摘要】本发明提供了用于启动可调用函数的系统和方法。处理系统包括主机处理器、图形处理单元和用于启动可调用函数的驱动器。驱动器适用于在程序的加载时间识别在程序内的第一函数是可调用函数。驱动器进一步适用于生成第二函数。第二函数适用于接收引数并将引数从用于启动函数的调用约定转译成用于调用可调用函数的调用约定。第二函数进一步适用于使用经转译的引数来调用第一函数。驱动器还适用于从主机处理器或GPU接收表示第一函数的启动的过程调用,并且作为响应启动第二函数。
【专利说明】用于启动可调用函数的系统和方法
[0001]相关申请的交叉引用
[0002]本申请要求于2012年10月I日由Aarts等人所提交的序列号为13/632,334的、标题为“SYSTEM AND METHOD FOR LAUNCHING CALLABLE FUNCTIONS”的美国申请的优先权,在先申请与本申请共同受让,并且通过援引的方式在本文中加以合并。
【技术领域】
[0003]本申请总地涉及多线程并行处理系统,并且更具体地,涉及启动可调用函数。
【背景技术】
[0004]在图形处理和其他处理领域中,通常要求程序对包括如图像或音频文件这种集合的数据点的大集合进行操作。这种程序往往可被有利地构建为动作的序列,其中的每一个可同时实施在集合中的所有数据点上。
[0005]被设计为支持这种程序的一种处理系统称为单指令多数据(SMD)系统。SMD系统提供多个处理器,其中的每一个将程序的指令应用到单个数据点。在硬件中,多个处理器的子集可实现为多处理单元(MPU)。

【发明内容】

[0006]一个方面提供用于启动可调用函数的驱动器。驱动器适用于在程序的加载时间识别在程序内的第一函数是可调用函数。驱动器进一步适用于生成第二函数。第二函数适用于接收引数(argument)并将引数从用于启动函数的调用约定(calling convention)转译成用于调用可调用函数的调用约定。第二函数进一步适用于使用经转译的引数调用第一函数。驱动器还适用于接收表示第一函数的启动的过程调用,并且作为响应启动第二函数。
[0007]另一方面提供用于启动可调用函数的方法。方法包括在程序的加载时间识别在程序内的第一函数是可调用函数。方法还包括针对第二函数生成程序代码。第二函数接收引数并将引数从用于启动函数的调用约定转译成用于调用可调用函数的调用约定。第二函数还使用经转译的引数调用第一函数。方法进一步包括响应于接收表示第一函数的启动的过程调用,启动第二函数。
[0008]又一方面提供处理系统,其包括主机处理器、图形处理单元和用于启动可调用函数的驱动器。驱动器适用于在程序的加载时间识别在程序内的第一函数是可调用函数。驱动器进一步适用于生成第二函数。第二函数适用于接收引数并将引数从用于启动函数的调用约定转译成用于调用可调用函数的调用约定。第二函数进一步适用于使用经转译的引数调用第一函数。驱动器还适用于从主机处理器或GPU接收表示第一函数的启动的过程调用,并且作为响应启动第二函数。
【专利附图】

【附图说明】
[0009]现在结合附图对下面的描述进行参考,其中:[0010]图1是根据本公开的系统的示意图;
[0011]图2是根据本公开的调用函数的程序的示意图;以及
[0012]图3是根据本公开的启动可调用函数的程序的示意图。
【具体实施方式】
[0013]图1是根据本公开的系统100的示意图。系统包括耦连到主机存储器104和到图形处理单元(GPU) 106的主机处理器102。GPU106也耦连到主机存储器104并可使用直接存储器存取(DMA)写入数据到主机存储器104和从主机存储器104读取数据。
[0014]GPU106也耦连到显示器108或其他输出设备并适用于使用显示器108显示由GPU106生成的信息。在其他实施例中,显示器108还可以、或可替代地耦连到主机处理器102,用于由主机处理器102生成的信息的显示。
[0015]GPU106包括在线程执行控制单元(TE⑶)110控制之下的多个多处理单元(MPU)112。TE⑶110耦连到主机处理器102并适用于从主机处理器102接收控制信号。MPU112耦连到设备存储器114并适用于写入数据到设备存储器114和从设备存储器114读取数据。设备存储器114耦连到主机存储器104并适用于写入数据到主机存储器104和从主机存储器104读取数据。
[0016]主机处理器102可执行构建为SMD程序序列的程序。这种程序可被称为内核。作为执行程序的一部分,主机处理器102可在GPU106中启动内核的序列。
[0017]GPU106提供将并行工作布置成线程、线程块(或简称块)和网格的层次的并行计算架构。网格是执行公共内核的所有线程的集合。单独线程将其内核执行为独立实体,具有独立数据、栈和程序计数器。线程被分组成用户定义大小(块中线程的数目)的线程块。块内的线程被确保并发地执行。
[0018]为了指派到MPU112以及由MPU112执行,块的线程可被分成子集。这些子集可称为线程束(warp)或波前(wavefront)。子集的大小典型地选择为MPU112中的处理器数目的2的幂倍(B卩1、2、4等)。线程束的线程被指派到单个MPU112,并且MPU112在相应的1、
2、4等数目的时钟周期中执行线程束的线程的一个指令。
[0019]可使用屏障操作(或简称屏障)来同步块的线程。通常,屏障用来强迫实行对屏障之前和之后所发出的存储器操作的排序约束。一旦线程到达屏障,其不能前进直到所有线程已到达屏障为止。
[0020]虽然处理单元106在本文中被称为图形处理单元,但应理解的是处理单元106可用于可以与图形无关的数据处理一也就是说,任何要求多线程、SMD处理的应用中。在其他实施例中,处理单元106可包含经优化用于通用处理的电路,与此同时保留本文所讨论的底层计算架构。
[0021]主机处理器102包括适用于接收存储在一个或多个类型的计算机可读介质上的程序的一个或多个子系统。短语“计算机可读介质”包括能够由计算机所存取的任何类型的介质,诸如只读存储器(ROM)、随机存取存储器(RAM)、硬盘驱动器、压缩光盘(⑶)、数字视频光盘或数字通用光盘(DVD)或任何其他类型的介质。
[0022]由主机处理器102和GPU106执行的一些函数可被称作“可启动(launchable)”函数。其他这种函数可被称作“可调用”函数。[0023]在可启动函数和可调用函数之间的差异典型地不是从“被调用者端(calleeside)”、也就是说从函数内可见的。然而,差异可在调用者端上查看。可启动函数从(在主机处理器102上或者在MPU112中的一个上的)一个线程内被调用并且产生(spawn)许多其他线程。相反,可调用函数从(在MPU112中的一个上的)一个线程内被调用并且执行在调用线程上继续。
[0024]实施稍后要被应用到多个数据点的处理任务的可调用函数必须被重新写入到可启动形式中。如果函数的可调用和可启动版本二者继续使用,那么对一个版本的数据处理函数进行的改变必须在另一版本中复制,以维持版本之间的兼容性。
[0025]在一些情况中,可通过写“包装器(wrapper)”函数来创建可调用函数的可启动版本,该包装器函数是可启动的并简单地调用可调用函数。然而,针对期望启动能力的每个可调用函数,必须手动写分开的包装器程序。进一步地,当对可调用函数的参数进行任何改变时,包装器函数也必须经修改以适用于改变。
[0026]本公开的实施例提供驱动器,其在程序的加载时间识别程序的哪些函数是可调用的并实施动作以使能可调用函数启动。
[0027]通过使用根据本公开的驱动器,消除了对具有可调用和可启动函数(或例程)二者的需要。用于多线程处理的所有计算语言(CUDA、OpenCL、C++AMP等)当前包含可调用和可启动函数之间的区别。根据本公开的驱动器允许程序员仅写可调用函数,其是朝向异构计算的步骤,因为这种驱动器将允许任何可调用函数启动。
[0028]表1呈现实现本公开的一个实施例的代码,其中f是可调用函数:
[0029]
【权利要求】
1.一种用于启动可调用函数的驱动器,所述驱动器适用于: 在程序的加载时间识别所述程序内的第一函数是可调用函数; 生成第二函数,所述第二函数适用于: 接收引数, 将所述引数从用于启动函数的调用约定转译成用于调用可调用函数的调用约定,以及 使用经转译的引数调用所述第一函数;以及 接收表示所述第一函数的启动的过程调用,并且作为响应,启动所述第二函数。
2.根据权利要求1所述的驱动器,其中所述驱动器进一步适用于,响应于所述过程调用并在启动所述第二函数之前: 分配元数据用于所述第一函数;以及 使用所述元数据配置所述第二函数的所述启动。
3.根据权利要求2所述的驱动器,其中所述驱动器进一步适用于: 生成第三函数,适用于返回指向经分配的元数据的指针;以及 调用所述第三函数并在配置所述第二函数的所述启动中使用所返回的指针。
4.根据权利要求3所述的驱动器,其中所述驱动器进一步适用于在存储器中将所述第一函数重新定位到与分支到所述第二和第三函数的指令邻近的位置。
5.根据权利要求1所述的驱动器,其中所述驱动器进一步适用于: 在所述过程调用中,接收标识数据`点的集合的信息;以及 启动多个线程,每个线程针对所述数据点的子集执行所述第二函数。
6.根据权利要求5所述的驱动器,其中所述驱动器进一步适用于一旦由所述线程的一个或多个完成所述第二函数则从所述线程的一个或多个中接收信号。
7.根据权利要求6所述的驱动器,其中所述驱动器进一步适用于: 一旦启动所述多个线程则从所述过程调用返回;以及 使用同步屏障在所述线程中用信号通知所述第二函数的完成。
8.一种用于启动可调用函数的方法,所述方法包括: 在程序的加载时间识别所述程序的第一函数是可调用函数; 针对第二函数生成程序代码,其中所述第二函数: 接收引数, 将所述引数从用于启动函数的调用约定转译成用于调用可调用函数的调用约定,以及 使用经转译的引数调用所述第一函数;以及 响应于接收表示所述第一函数的启动的过程调用,启动所述第二函数。
9.根据权利要求8所述的方法,进一步包括: 响应于接收所述过程调用: 分配元数据用于所述第一函数;以及 使用所述元数据配置所述第二函数的所述启动。
10.根据权利要求9所述的方法,进一步包括: 针对第三函数生成程序代码,所述第三函数返回指向经分配的元数据的指针, 其中所述配置所述第二函数的所述启动进一步包括: 调用所述第三函数;以及在配置所述第二函数的所 述的启动中使用所返回的指针。
【文档编号】G06F9/445GK103713919SQ201310461076
【公开日】2014年4月9日 申请日期:2013年9月30日 优先权日:2012年10月1日
【发明者】巴斯蒂安·阿尔特斯, 吉里什·巴拉姆贝, 卢克·杜兰特, 维诺德·格罗弗 申请人:辉达公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1