计算平台的异质处理器之间的共享虚拟存储器中的虚函数共享的制作方法

文档序号:6352438阅读:244来源:国知局

专利名称::计算平台的异质处理器之间的共享虚拟存储器中的虚函数共享的制作方法计算平台的异质处理器之间的共享虚拟存储器中的虚函数共享
背景技术
:计算平台可包含异质处理器,诸如中央处理单元(CPU)和图形处理单元(GPU)、对称和不对称处理器。类实例(或对象)可驻留在与CPU-GPU平台的第一侧(例如CPU)相关联的第一存储器中。不可能使第二侧(GI3U侧)调用驻留在与CPU-GPU平台的第一侧(CPU侦D相关联的第一存储器中的对象和相关联的成员函数。也不可能使第一侧能够调用驻留在第二侧(GPU)侧上第二存储器中的对象和相关联的成员函数。当类实例或对象被存储在不同地址空间时,现有通信机制可能仅允许异质处理器(CPU与GPU)之间的单向通信来调用类实例和相关联的虚函数。这种单向通信方法防止了异质处理器之间的类实例的自然功能性划分。对象可包括面向吞吐量的成员函数和一些标量成员函数。例如,游戏应用中的场景类可具有可适合于GPU的渲染函数,并且还可包括可适合于在CPU上执行的物理学和人工智能(Al)函数。用当前的单向通信机制,通常存在两个不同的场景类,分别包括CPU(上例中的物理学和Al)成员函数和GPU(适合GPU的渲染函数)成员函数。使两个不同的场景类一个用于CPU而另一个用于GPU可能需要在两个场景类之间来回拷贝数据。在附图中作为示例而非作为限制说明了本文描述的本发明。为了说明的简化和清晰,图中示出的单元不一定按比例绘制。例如,为了清楚起见,一些单元的尺寸可能相对于其它单元放大了。另外,在认为适当的情况下,附图标记已经在各图之间重复使用来指示对应或类似的单元。图1示出了根据一个实施例支持在计算机平台中提供的异质处理器之间的共享虚拟存储器中存储的虚函数共享的平台100;图2是示出了根据一个实施例由平台100执行的支持在计算机平台中提供的异质处理器之间的共享虚拟存储器中存储的虚函数共享的操作的流程图3示出了根据一个实施例用于从共享对象加载虚函数指针的CPU侧和GPU侧代码;图4是示出了根据第一实施例由平台100执行的生成表以支持在计算机平台中提供的异质处理器之间的共享虚拟存储器中存储的虚函数共享的操作的流程图5示出了根据一个实施例由平台100用于支持通过异质处理器可共享的对象的成员函数进行CPU110与GPU180之间双向通信的流程图6示出了根据第一实施例实际地描绘由CPU侧进行的GPU虚函数和GPU函数调用的处理的流程图7是示出了根据实施例由平台100执行的使用虚拟共享非相干区域支持异质处理器之间的虚函数共享的操作的流程图8是示出了根据实施例使用虚拟共享非相干区域支持异质处理器之间的虚函数共孚的关系图;图9示出了根据一个实施例可提供对在计算机平台中提供的异质处理器之间的共享虚拟存储器中存储的虚函数共享的支持的计算机系统。具体实施例方式以下描述描述了在计算平台的异质处理器之间的共享虚拟存储器中存储的虚函数共享的技术。在以下描述中,阐述了许多特定细节,诸如逻辑实现、资源划分或共享或系统组件的副本实现、类型和相互关系以及逻辑划分或综合选择,以便提供本发明的更透彻理解。然而,本领域技术人员将认识到,没有此类特定细节也可实施本发明。在其它实例中,未详细示出控制结构、门级电路和完整软件指令序列,以免使本发明模糊。本领域技术人员用所包含的描述将能够实现适当的功能性,无需过多实验。在说明书中提到“一个实施例”、“实施例”、“示例实施例”指示所描述的实施例可包含具体特征、结构或特性,但每个实施例可能不一定都包含该具体特征、结构或特性。此夕卜,这种短语不一定是指同一实施例。另外,当结合一个实施例描述具体特征、结构或特性时,认为它在本领域技术人员的知识范围内,以结合其它实施例影响这种特征、结构或特性,不管是否明确描述了。可用硬件、固件、软件或它们的任何组合来实现本发明的实施例。本发明的实施例还可实现为存储在机器可读介质上的指令,它们可由一个或多个处理器读取和执行。机器可读存储介质可包含用于存储或传输采用机器(例如计算装置)可读形式的信息的任何机构。例如,机器可读存储介质可包含只读存储器(ROM);随机存取存储器(RAM);磁盘存储介质;光存储介质;闪存装置;电、光形式的信号。另外,固件、软件、例程和指令在本文可描述为执行某些动作。然而,应该认识到,这种描述只是出于方便,并且这种动作实际上源于计算装置、处理器、控制器和执行固件、软件、例程和指令的其它装置。在一个实施例中,计算平台可支持一种或多种技术以允许通过细粒度划分共享对象来通过诸如共享对象的虚函数的成员函数进行异质处理器(例如CPU与GPU)之间的双向通信(函数调用)。在一个实施例中,计算平台可允许使用称为“基于表”的技术的第一技术进行CPU与GPU之间的双向通信。在其它实施例中,计算平台可允许使用称为“非相干区域”技术的第二技术进行CPU与GPU之间的双向通信,在该技术中,可在虚拟共享存储器中创建虚拟共享非相干区域。在一个实施例中,当使用基于表的技术时,可用于访问来自CPU或GPU侧的共享对象的共享对象的CPU侧虚函数表(Vtable)指针可用于确定GPU虚函数表,如果存在GPU侧表的话。在一个实施例中,GPU侧虚函数表可包含〈〃类名〃、CPU虚函数表地址、GPU虚函数表地址>。在一个实施例中,下面将更详细地描述获得GPU侧虚函数表地址和生成GPU侧表的技术。在其它实施例中,当使用“非相干区域”技术时,在共享虚拟存储器内创建共享非相干区域。在一个实施例中,共享非相干区域可以不保持数据一致性。在一个实施例中,共享非相干区域内的CPU侧数据和GPU侧数据可具有与从CPU侧和GPU侧看到的相同的地址。然而,CPU侧数据的内容可不同于GPU侧数据的内容,因为共享虚拟存储器在运行时期间可以不保持一致性。在一个实施例中,共享非相干区域可用于存储每个共享类的虚拟方法表的新拷贝。在一个实施例中,这种方法可将虚拟表保持在同一地址。图1中示出了提供可在异质处理器、诸如CPU与GPU之间共享的虚拟共享存储器中的虚函数的计算平台100的实施例。在一个实施例中,平台100可包括中央处理单元(CPU)llO、与CPU110相关联的操作系统(0S)112、CPU私有空间115、CPU编译器118、共享虚拟存储器(或多版本共享存储器)130、图形处理单元(GPU)180、与GPU180相关联的操作系统(OS)182、GPU私有空间185和GPU编译器188。在一个实施例中,OS112和OS182可分别管理CPU110和CPU私有空间115,以及GPU180和GPU私有空间185的资源。在一个实施例中,为了支持共享虚拟存储器130,CPU私有空间115和GPU私有空间185可包括多版本数据的拷贝。在一个实施例中,为了保持存储器一致性,诸如对象131的元数据可用于同步存储在CPU私有空间115和GPU私有空间185中的拷贝。在其它实施例中,多版本数据可存储在物理共享存储器诸如共享存储器950(图9的,下面描述)中。在一个实施例中,共享虚拟存储器可由物理私有存储器空间(诸如异质处理器CPU110和GPU180的CPU私有空间115和GPU私有空间185)或物理共享存储器(诸如由异质处理器共享的共享存储器950)支持。在一个实施例中,CPU编译器118和GPU编译器188可分别耦合到CPU110和GPU180,或者也可远程提供在其它平台或计算机系统上。与CPU110相关联的编译器(一个或多个)118可生成用于CPU110的编译代码,并且与GPU180相关联的编译器188可生成用于GPU180的编译代码。在一个实施例中,CPU编译器118和GPU编译器188可通过编译用户用高级语言诸如面向对象的语言提供的对象的一个或多个成员函数来生成编译代码。在一个实施例中,编译器118和188可使对象存储在共享存储器130中,并且共享对象131可包括分配给CPU侧110或GPU侧180的成员函数。在一个实施例中,存储在共享存储器130中的共享对象131可包括成员函数诸如虚函数VF133-A到133-K和非虚函数NVF136-A到136-L。在一个实施例中,成员函数诸如共享对象131的VF133和NVF136可提供CPU110与GPU180之间的双向通信。在一个实施例中,为了实现动态绑定目的,CPU110或GPU180之一可通过索引虚函数表(虚函数表)来调用虚函数,诸如VF133-A(例如C++虚函数)。在一个实施例中,共享对象131中的隐藏指针可指向该虚函数表。然而,CPU110和GPU180可具有不同的指令集架构(ISA),并且当对于具有不同ISA的CPU110和GPU180编译函数时,表示由编译器118和188编译的相同函数的代码可具有不同的大小。以同样方式将代码布局在GPU侦_CPU侧(即,共享类中的虚函数的CPU版本和共享类中的同一虚函数的GPU版本),可能具有挑战性。如果在共享类FooO中存在三个虚函数,则在代码的CPU版本中,函数可位于地址A1、A2和A3。然而,在代码的GPU版本中,函数可位于地址B1、B2和B3,它们可不同于A1、A2和A3。共享类中同一函数的CPU侧和GPU侧代码的这种不同地址位置可暗示共享对象(即共享类的实例)可能需要2个虚函数表(第一虚函数表和第二虚函数表)。第一虚函数表可包含函数的CPU侧版本的地址(A1、A2和A3),并且当在CPU侧可使用对象(或调用CPU侧函数)时,可使用第一虚函数表。第二虚函数表可包含函数的GPU侧版本的地址(B1、B2和B3),并且当在GPU侧可使用对象(或调用GPU侧函数)时,可使用第二虚函数表。在一个实施例中,可通过将第一和第二虚函数表与共享对象131相关联来实现在CPU110与GPU180之间的共享虚拟存储器中存储的虚函数共享。在一个实施例中,可通过将共享对象131的第一与第二虚函数表相关联来创建公用虚函数表,其可用于CPU侧和GPU侧上的虚函数调用。在图2的流程图中描绘了异质处理器CPU110和GPU180共享存储在共享虚拟存储器中的虚函数的实施例。在块210,第一处理器诸如CPU110可标识共享对象131的第一处理器侧虚函数表指针(CPU侧虚函数表指针)。在一个实施例中,对于共享对象131,可存在CPU侧虚函数表指针,不管共享对象131可由CPU侧还是GPU侧访问。在一个实施例中,对于计算系统诸如仅有CPU的环境中的正常虚函数调用,代码序列可如图3的块310中所示。在一个实施例中,甚至在计算系统诸如100中,其可包含异质处理器,用于正常虚函数调用的CPU侧代码序列可与在图3的块310中描绘的相同。如在块310中所描绘的,行301中的代码:Movrl,[obj]可将共享对象131的虚函数表加载到变量rl。行305中的代码:(Call*[rl+offsetFunction])可调用虚函数,诸如共享对象131的VF133-A。在块250中,第二处理器诸如GPU180可使用共享对象131的第一处理器侧虚函数表指针(CPU侧虚函数表指针)确定第二处理器侧虚函数表(GPU侧虚函数表),如果存在第二处理器侧表(GPU表)的话。在一个实施例中,第二处理器侧表(GPU表)可包含〈〃类名〃、第一处理器侧虚函数表地址、第二处理器侧虚函数表地址>。在一个实施例中,在GPU侧,GPU180可生成在块350中描绘的代码序列,其可不同于在块310中描绘的代码序列。在一个实施例中,因为GPU编译器188可根据类型知道每个可共享类,因此GPU180可生成在块350中描绘的代码序列,用于从共享对象诸如共享对象131加载虚函数指针。在一个实施例中,行351中的代码:Movrl,[obj]可加载CPU虚函数表地址,并且行353中的代码:R2=getvtableAddress(rl)可从GPU表中获得GPU虚函数表。在一个实施例中,行358中的代码:(Call*[r2+offsetFunction])可基于使用CPU虚函数表地址生成的GPU虚函数表调用虚函数。在一个实施例中,getvtableAddress函数可使用CPU侧虚函数表地址索引到GPU表中来确定GPU侧虚函数表。在块280,使用共享对象131可实现第一处理器(CPU110)和第二处理器(GPU180)进行双向通信。使用图4的流程图示出了创建GPU表的实施例。在块410,可在初始化时间期间,在一个实施例中,通过将指向可共享类(共享对象131)的注册函数(registrationfunction)的函数指针包含到初始化段(例如MSC++的CRT$XCI段)中,形成该表。例如,可共享类的注册函数可被包含到MSCRTSXCI段初始化段中。在块420,可在初始化时间期间执行注册函数。作为将指向注册函数的函数指针包含到初始化段中的结果,可在执行初始化段的同时执行注册函数。在块430,在第一处理器侧(CPU侧),注册函数可将“类名”和“CPU虚函数表地址”注册到第一表中。在块440,在第二处理器侧(GPU侧),注册函数可将“类名”和“GPU虚函数表地址”注册到第二表中。在块480,第一表和第二表可合并成一个公用表。例如,如果第一和第二表包含相同“类名”,则第一表的第一项可与第二表的第一项组合。作为合并的结果,第一和第二表的组合项可看起来像具有单个类名的一项。在一个实施例中,公用表可驻留在GPU侧,并且公用表或GPU表可包含“类名”、CPU虚函数表地址和GPU虚函数表地址。在一个实施例中,创建公用表或GPU表可避免对CPU侧和GPU侧上虚函数表地址匹配的要求。还有,GPU表可支持动态链接库(DLL)。在一个实施例中,在GPU侧上可使用或初始化共享对象131之前,可在CPU侧上加载类。然而,因为应用一般被加载在CPU侧,因此对于在应用中定义的类还有静态链接库,GPU表可实现CPU110与GPU180之间的双向通信。对于DLL,DLL可加载在CPU侧上,并且GPU表也可用于DLL的双向通信。可共享对象131可包含CPU侧虚函数表指针,并且可没有额外的虚函数表指针用于GPU侧虚函数表。在一个实施例中,使用对象中的CPU虚函数表指针,可生成GPU虚函数表指针,如上面在图4的块350中所描述的。在一个实施例中,可原样使用CPU侧上的CPU虚函数表指针,而GPU侧上的GPU虚函数表指针可用于虚函数调用。在一个实施例中,这种方法可不涉及链接器/加载器的修改或参与,并且不要求共享对象131中的额外vptr指针字段。这种方法可允许在CPU110与GPU180之间用面向对象的语言写的应用的细粒度划分。图5中示出了计算平台100用于支持通过可由异质处理器共享的对象的成员函数进行CPU110与GPU180之间双向通信的流程图的实施例。在一个实施例中,GPU编译器188可生成用于GPU函数的CPU存根(stub)510和CPU侧110上的CPU远程调用API520。还有,GPU编译器188可生成GPU侧粘合逻辑(gluinglogic)530用于第一成员函数的GPU侧180上的GPU函数。在一个实施例中,CPU110可使用第一路径的第一启用路径(包括存根逻辑510、API520和粘合逻辑530)对第一成员函数进行调用。在一个实施例中,第一启用路径可允许CPU110与GPU侧180建立远程调用,并将信息从CPU侧110传送到GPU侧180。在一个实施例中,GPU侧粘合逻辑530可允许GPU180接收从CPU侧110传送的信肩、O在一个实施例中,CPU存根510可包括与第一成员函数(即原始GPU成员函数)相同的名称,但可封入API520以将调用从CPU110定向到GPU180。在一个实施例中,由CPU编译器118生成的代码可原样地调用第一成员函数,但调用可被重新定向到CPU存根510和远程调用API520。再者,当进行远程调用时,CPU存根510可发送表示正在调用的第一成员函数的唯一名称和指向共享对象的指针以及被调用的第一成员函数的其它参数。在一个实施例中,GPU侧粘合逻辑530可接收参数,并调度第一成员函数调用。在一个实施例中,GPU编译器188可生成粘合逻辑(或调度器),其可通过用作为第一参数传递的对象指针调用第一成员函数的GPU侧函数地址来调度非虚函数。在一个实施例中,GPU编译器188可生成GPU侧上的跳转表注册调用来注册GPU侧粘合逻辑530,以使CPU存根510能够与GPU侧粘合逻辑530通信。在一个实施例中,GPU编译器188可创建第二启用路径,包括用于CPU函数的GPU存根550、GPU侧180上的GPU远程调用API570以及用于分配给CPU110的第二成员函数的CPU侧粘合逻辑580。在一个实施例中,GPU180可使用第二启用路径对CPU侧110进行调用。在一个实施例中,GPU存根560和API570可允许GPU180与CPU侧110建立远程调用,并将信息从GPU侧180传送到CPU侧110。在一个实施例中,CPU侧粘合逻辑580可允许CPU110接收从GPU侧180传送的信息。在一个实施例中,为了支持第二成员函数调用,GPU编译器188可生成用于CPU侧粘合逻辑580的跳转表注册。在一个实施例中,可在CPU粘合逻辑580中调用第二成员函数的CPU侧函数地址。在一个实施例中,由CPU粘合逻辑580生成的代码可与由CPU编译器118生成的其它代码链接。这种方法可提供支持异质处理器110与180之间双向通信的路径。在一个实施例中,CPU存根逻辑510和CPU侧粘合逻辑580可经由CPU链接器590耦合到CPU110。在一个实施例中,CPU链接器590可使用CPU存根510、CPU侧粘合逻辑580和由CPU编译器118生成的其它代码生成CPU可执行595。在一个实施例中,GPU存根逻辑560和GPU侧粘合逻辑570可经由GPU链接器540耦合到GPU180。在一个实施例中,GPU链接器540可使用GPU粘合逻辑570、GPU存根560和由GPU编译器188生成的其它代码生成GPU可执行545。图6中示出了CPU侧110使用上面描述的基于表的技术调用GPU虚函数和GPU非虚函数的流程图600的实施例。示出了块610,包括共享类实例或标题为共享类FooO的对象,其包含注释虚函数(例如VF133-A)和虚函数调用“VirtualvoidSomeVirtFuncO”的第一注释标GPU以及注释非虚函数(例如NVF136-A)和非虚函数调用“voidSomeNonVirtuFuncO”的第二注释标签#PragmaGPU。在一个实施例中,’pFoo’可指向类FooO的共享对象131,并且可从CPU侧110到GPU侧180完成远程虚函数调用。在一个实施例中,’pFoo=new(SharedMemoryAllocatorO)FooO可以是用共享存储器分配/释放运行时调用覆盖新的/删除运算符的一种可能方式。在一个实施例中,CPU编译器118响应于在块610中编译’pFoo->SomeVirtuFuncO’,可发起在块620中描绘的任务。在块620,CPU侧110可调用GPU虚函数。在块630,CPU侧存根(用于GPU成员函数)510和API520可向GPU侧180发送信息(参数)。在块640,GPU侧粘合逻辑(用于GPU成员函数)530可从THIS对象获得pGPUVptr(CPU侧虚函数表指针),并且可找到GPU虚函数表。在块650,GPU侧粘合逻辑540(或调度器)可具有上面描述的在块350中描绘的代码序列,以使用CPU侧虚函数表指针获得GPU侧虚函数表。在一个实施例中,GPU编译器188响应于在块610中编译#PragmaGPU’voidSomeNonVirtuFuncO’,可生成使用’pFooSomeNonVirtuFuncO’发起在块670中描绘的任务的代码。在块670,CPU侧110可调用GPU非虚函数。在块680,CPU侧存根510和API520可向GPU侧180发送信息(参数)。在块690,GPU侧粘合逻辑530可推送参数并直接调用地址,因为函数地址可能已经已知了。在图7的流程图中示出了由计算平台100执行的使用虚拟共享非相干区域支持异质处理器之间的虚函数共享的操作的实施例。在计算系统诸如包含异质处理器(诸如CPU110和GPU180)的计算系统100中,CPU110和GPU180可运行由不同编译器诸如118和188(或具有不同目标的相同编译器)生成的不同代码,不可能保证相同虚函数位于相同地址。虽然有可能将编译器/链接器/加载器修改成支持虚函数共享,但下面描述的“非相干区域”方法(仅有运行时的方法)可能是允许CPU110与GPU180之间虚函数共享的更简单技术。这种方法可允许容易地接受和部署共享虚拟存储器系统,诸如我的/你的/我们的(MYO)。尽管作为示例使用C++面向对象的语言,但下面的方法可应用于支持虚函数的其它面向对象的编程语言。在块710,CPU110可在共享虚拟存储器130内创建共享非相干区域以存储CPU110和GPU180的共享类的虚函数表。在一个实施例中,可通过规定到共享虚拟存储器130内区域的非相干标签来创建共享非相干区域。在一个实施例中,MYO运行时可提供一个或多个应用可编程接口(API)函数来创建虚拟共享区域(在MYO的术语中称为“场所(arena)”,并且在MYO中可创建许多此类场所)。例如,可使用诸如myoArenaCreate(xxx,...,NonCoherentTag)或myoArenaCreateNonCoherentTag(xxx,...)的标签。在一个实施例中,使用以上标签可创建相干或非相干场所。然而,在其它实施例中,可使用API函数来改变存储器大块(或部分)的属性。例如,可使用myoChangeToNonCoherent(addrsize)创建第一区域作为非相干区域或场所,以及第二区域(或部分)作为相干场所。在一个实施例中,第一区域可由地址大小规定。在一个实施例中,可创建存储器场所(即,管理的存储器大块),其可允许数据共享而无需保持数据一致性,并且这种存储器场所可称为共享非相干区域。在一个实施例中,存储在共享非相干区域内的CPU数据和GPU数据可具有与由CPU110和GPU180看到的相同的地址。然而,内容(CPU数据和GPU数据)可不同,因为共享虚拟存储器130诸如MYO在运行时可以不保持一致性。在一个实施例中,共享非相干区域可用于存储每个共享类的虚拟方法表的新拷贝。在一个实施例中,从CPU110和GPU180所看到的虚函数表地址可相同;然而,虚函数表可不同。在块750,在初始化时间期间,每个可共享类的虚函数表可从CPU私有空间115和GI3U私有空间185拷贝到共享虚拟存储器130。在一个实施例中,CPU侧虚函数表可被拷贝到共享虚拟存储器130内的非相干区域中,并且GPU侧虚函数表也可被拷贝到共享虚拟存储器130内的非相干区域中。在一个实施例中,在共享空间中,CPU侧虚函数表和GPU侧虚函数表可位于相同地址。在一个实施例中,如果工具链支持是可用的,则CPU编译器118或GPU编译器188可在特殊数据段中包含CPU和GPU虚函数表数据,并且加载器540或570可将特殊数据段加载到共享非相干区域。在其它实施例中,CPU编译器118或GPU编译器188可允许例如使用API调用诸如myoChangeToNonCoherent在共享非相干区域中创建特殊数据段。在一个实施例中,CPU编译器118和GPU编译器188可确保CPU虚函数表和GPU虚函数表可在特殊数据段内位于相同偏移地址(要不就具有恰当填充)。在一个实施例中,在多重继承的情况下,在对象布局中可能存在多个虚函数表指针。在一个实施例中,CPU编译器118和GPU编译器188也可确保CPU虚函数表和GPU虚函数表指针可在对象布局中位于相同偏移。在缺乏工具链支持的情况下,在一个实施例中,可允许用户将CPU虚函数表和GPU虚函数表拷贝到共享非相干区域。在一个实施例中,可生成一个或多个宏以便于CPU和GPU表到共享非相干存储区域的这种人工拷贝。在运行时,在可创建共享对象诸如共享对象131之后,可创建对象布局801,其可包含用于多重继承的多个"vptr"。在一个实施例中,对象表801中的共享对象131的虚拟表指针(vptr)可被更新(打补丁)成指向共享非相干区域中的虚函数表的新拷贝。在一个实施例中,可使用类的构造器更新共享对象的虚拟表指针,该类可包含虚函数。在一个实施例中,如果类不包含任何虚函数,则这种类的数据和函数可被共享,并且可能不一定在运行时期间更新(或打补丁)。在块780,vptr(虚函数表指针)可被修改成指向共享非相干区域,同时创建共享对象131。在一个实施例中,vptr通过默认指向私有虚函数表(CPU虚函数表或GPU虚函数表)可被修改(如在图8中由实线802-C所指示)成指向共享非相干区域860。在一个实施例中,虚函数可按如下调用:MovGciXj[gcxJHgcxqthis宇曰,θ£χ含有vptr;Call[eax,vfunc]#vfunc是虚函数表中的虚函数索引。在CPU侧,以上代码可调用虚函数的CPU实现;而在GPU侧,以上代码可调用虚函数的GPU实现。这种方法可允许类的数据共享和虚函数共享。在图8中示出了使用虚拟共享非相干区域支持异质处理器之间的虚函数共享的关系图800的实施例。在一个实施例中,对象布局801可包含第一槽801-A中的虚拟表指针(vptr)以及其它字段诸如槽801-B和801-C中的字段I和字段2。在一个实施例中,在CPU编译器118和GPU编译器188执行位于槽801-A中的虚函数表指针(vptr)之后,生成(如虚线802-A所指示的)CPU虚函数表和GPU虚函数表(如虚线802-B所指示的)。CPU虚函数表(CPU虚函数表)可位于CPU私有地址空间115内的地址810,并且GPU虚函数表可位于GPU私有地址空间185内的地址840。在一个实施例中,CPU虚函数表可包含诸如vfuncl和vfunc2的函数指针,并且GPU虚函数表可包含诸如vfuncl’和vfunc2’的函数指针。在一个实施例中,函数指针(vfuncl和vfunc2)与(vfuncl’和vfunc2’)也可不同,因为指针指向同一函数的不同实现。在一个实施例中,作为修改vptr(如在块780中所示)的结果,vptr可指向共享虚拟存储器130内的共享非相干区域860。在一个实施例中,CPU虚函数表可位于地址Address870,并且GPU虚函数表可位于相同地址Address870。在一个实施例中,CPU虚函数表可包含诸如vfuncl和vfunc2的函数指针,并且GPU虚函数表可包含诸如vfuncl’和vfunc2’的函数指针。在一个实施例中,函数指针(vfuncl和vfunc2)与(vfuncl’和vfunc2’)可不同。在一个实施例中,将CPU虚`函数表和GPU虚函数表保存在共享非相干区域860中可使CPU110和GPU180分别能够在同一地址位置Address870看到CPU虚函数表和GPU虚函数表,然而,CPU虚函数表的内容(vfuncl和vfunc2)可不同于GPU虚函数表的内容(vfuncl’和vfunc2')ο在图9中示出了包括支持双向通信的异质处理器的计算机系统900的实施例。参考图9,计算机系统900可包含包括单指令多数据(SMD)处理器的通用处理器(或CPU)902和图形处理器单元(GPU)905。在一个实施例中,CPU902除了执行各种其它任务或存储指令序列之外还可执行增强操作,以在机器可读存储介质925中提供增强操作。然而,指令序列还可存储在CPU私有存储器920中,或者任何其它适当的存储介质中。在一个实施例中,CPU902可与CPU旧编译器903和CPU链接器/加载器904相关联。在一个实施例中,GPU905可与GPU专有编译器906和GPU链接器/加载器907相关联。虽然在图9中描绘了单独图形处理器单元GPU905,但在一些实施例中,作为另一个示例,处理器902可用于执行增强操作。操作计算机系统900的处理器902可以是耦合到逻辑930的一个或多个处理器核。逻辑930可耦合到一个或多个I/O装置960,其可提供到计算机系统900的接口。逻辑930在一个实施例中例如可以是芯片集逻辑。逻辑930耦合到存储器920,其可以是任何种类的储存器,包含光、磁或半导体储存装置。图形处理器单元905通过帧缓冲器耦合到显示器940。在一个实施例中,计算平台900可支持一种或多种技术以允许通过细粒度划分共享对象来通过诸如共享对象的虚函数的成员函数进行异质处理器CPU902与GPU905之间的双向通信(函数调用)。在一个实施例中,计算机系统900可允许使用称为“基于表”的技术的第一技术进行CPU902与GPU905之间的双向通信。在其它实施例中,计算平台可允许使用称为“非相干区域”技术的第二技术进行CPU902与GPU905之间的双向通信,在该技术中,可在位于私有CPU存储器920、私有GPU存储器930或共享存储器950中的虚拟共享存储器中创建虚拟共享非相干区域。在一个实施例中,在计算机系统900中可不提供单独的共享存储器诸如共享存储器950,并且在这种情况下,可在其中一个私有存储器诸如CPU存储器920或GPU存储器930内提供共享存储器。在一个实施例中,当使用基于表的技术时,可用于访问来自CPU110或GPU180的共享对象的共享对象的CPU侧虚函数表指针可用于确定GPU虚函数表,如果存在GPU侧表的话。在一个实施例中,GPU侧虚函数表可包含〈〃类名〃、CPU虚函数表地址、GPU虚函数表地址>。在一个实施例中,获得GPU侧虚函数表地址和生成GPU侧表的技术,如上所述。在其它实施例中,当使用“非相干区域”技术时,在共享虚拟存储器内创建共享非相干区域。在一个实施例中,共享非相干区域可以不保持数据一致性。在一个实施例中,共享非相干区域内的CPU侧数据和GPU侧数据可具有与从CPU侧和GPU侧看到的相同的地址。然而,CPU侧数据的内容可不同于GPU侧数据的内容,因为共享虚拟存储器在运行时期间可以不保持一致性。在一个实施例中,共享非相干区域可用于存储每个共享类的虚拟方法表的新拷贝。在一个实施例中,这种方法可将虚拟表保持在同一地址。本文描述的图形处理技术可用各种硬件架构实现。例如,图形功能性可集成在芯片集内。备选地,可使用分立图形处理器。作为又一实施例,图形功能可由通用处理器实现,包含多核处理器,或实现为存储在机器可读介质中的软件指令集。权利要求1.一种在计算平台中的方法,包括:创建包含多个虚函数的共享对象;将所述共享对象存储在共享虚拟存储器中;以及在第一处理器与第二处理器之间共享所述多个虚函数中的至少一个;其中所述计算平台包含第一处理器和第二处理器;其中所述第一处理器和所述第二处理器是异质处理器。2.如权利要求1所述的方法,包括使用第一处理器侧虚拟表指针确定第二处理器侧虚拟表,如果第二处理器侧表包含类名、第一处理器虚拟表地址和第二处理器虚拟表地址。3.如权利要求2所述的方法,还包括:将第一处理器侧虚拟表指针包含在所述共享对象中。4.如权利要求2所述的方法,包括:在执行程序的初始化阶段期间生成第二处理器侧表。5.如权利要求4所述的方法,包括:将指向所述共享对象的注册函数的函数指针包含到初始化段,其中将指向所述共享对象的所述注册函数的所述函数指针包含到所述初始化段要在所述初始化阶段期间执行所述注册函数。6.如权利要求5所述的方法,包括:在第一表中注册所述类名和所述第一处理器侧虚拟表地址,同时在所述第一处理器侧执行所述注册函数;在第二表中注册所述类名和所述第二处理器侧虚拟表地址,同时在所述第二处理器侧执行所述注册函数;以及通过合并所述第一表和所述第二表生成第二处理器侧表。7.如权利要求6所述的方法,其中所述第二处理器侧表支持动态链接库和静态链接库。8.如权利要求1所述的方法,包括:在所述共享虚拟存储器内创建共享非相干区域以存储第一处理器的虚函数表和第二处理器的虚函数。9.如权利要求8所述的方法,包括:将非相干标签添加到所述共享虚拟存储器中的区域以创建所述共享非相干区域。10.如权利要求8所述的方法,包括:将所述共享对象的虚拟表从所述第一处理器和所述第二处理器的私有地址空间拷贝到所述共享非相干区域,其中所述共享对象的所述虚拟表位于所述共享非相干区域中的相同地址,即使所述虚拟表的内容不同。11.如权利要求10所述的方法,包括:将指向所述第一处理器侧虚拟表和所述第二处理器侧虚拟表的虚拟指针修改成指向所述共享非相干区域,同时创建所述共享对象。12.一种机器可读存储介质,包括多个指令,这些指令响应于被执行引起处理器执行包括如下的操作:创建包含多个虚函数的共享对象;将所述共享对象存储在共享虚拟存储器中;以及在第一处理器与第二处理器之间共享所述多个虚函数中的至少一个;其中所述计算平台包含第一处理器和第二处理器;其中所述第一处理器和所述第二处理器是异质处理器。13.如权利要求12所述的机器可读存储介质,包括使用第一处理器侧虚拟表指针确定第二处理器侧虚拟表,如果第二处理器侧表包含类名、第一处理器虚拟表地址和第二处理器虚拟表地址。14.如权利要求13所述的机器可读存储介质,还包括:将第一处理器侧虚拟表指针包含在所述共享对象中。15.如权利要求13所述的机器可读存储介质,包括:在执行程序的初始化阶段期间生成第二处理器侧表。16.如权利要求15所述的机器可读存储介质,包括:将指向所述共享对象的注册函数的函数指针包含到初始化段,其中将指向所述共享对象的所述注册函数的所述函数指针包含到所述初始化段要在所述初始化阶段期间执行所述注册函数。17.如权利要求16所述的机器可读存储介质,包括:在第一表中注册所述类名和第一处理器侧虚拟表地址,同时在第一处理器侧执行所述注册函数;在第二表中注册所述类名和第二处理器侧虚拟表地址,同时在第二处理器侧执行所述注册函数;以及通过合并所述第一表和所述第二表生成第二处理器侧表。18.如权利要求17所述的机器可读存储介质,其中第二处理器侧表支持动态链接库和静态链接库。19.如权利要求12所述的机器可读存储介质,包括:在所述共享虚拟存储器内创建共享非相干区域以存储所述第一处理器的虚函数表和所述第二处理器的虚函数。20.如权利要求19所述的机器可读存储介质,包括:将非相干标签添加到所述共享虚拟存储器中的区域以创建所述共享非相干区域。21.如权利要求19所述的机器可读存储介质,包括:将所述共享对象的虚拟表从第一处理器和第二处理器的私有地址空间拷贝到所述共享非相干区域,其中所述共享对象的所述虚拟表位于所述共享非相干区域中的相同地址,即使所述虚拟表的内容不同。22.如权利要求21所述的机器可读存储介质,包括:将指向第一处理器侧虚拟表和第二处理器侧虚拟表的虚拟指针修改成指向所述共享非相干区域,同时创建所述共享对象。23.—种设备,包括:多个异质处理器,包含第一处理器和第二处理器,其中所述第一处理器耦合到第一编译器,并且所述第二处理器耦合到第二编译器;其中第一编译器创建共享对象,所述共享对象包含分配给所述第一处理器的第一虚拟成员函数和分配给所述第二处理器的第二虚拟成员函数;其中所述第一处理器创建包含多个虚函数的共享对象,将所述共享对象存储在共享虚拟存储器中,并与第二处理器共享所述多个虚函数中的至少一个。24.如权利要求23所述的设备,其中所述第一处理器使用第一处理器侧虚拟表指针确定第二处理器侧虚拟表,如果第二处理器侧表包含类名、第一处理器虚拟表地址和第二处理器虚拟表地址。25.如权利要求24所述的设备,其中所述第一处理器侧虚拟表指针被包含在所述共享对象中。26.如权利要求24所述的设备,其中所述第一处理器在执行程序的初始化阶段期间生成所述第二处理器侧表。27.如权利要求26所述的设备,其中所述第一处理器将指向所述共享对象的注册函数的函数指针包含到初始化段,其中将指向所述共享对象的所述注册函数的所述函数指针包含到所述初始化段要在所述初始化阶段期间执行所述注册函数。28.如权利要求27所述的设备,其中第一处理器支持:在第一表中注册所述类名和所述第一处理器侧虚拟表地址,同时在所述第一处理器侧执行所述注册函数;在第二表中注册所述类名和所述第二处理器侧虚拟表地址,同时在所述第二处理器侧执行所述注册函数;以及通过合并所述第一表和所述第二表生成第二处理器侧表。29.如权利要求23所述的设备,其中所述第一处理器在所述共享虚拟存储器内创建共享非相干区域以存储所述第一处理器的虚函数表和第二处理器的虚函数,其中通过将非相干标签添加到所述共享虚拟存储器中的区域来创建所述共享非相干区域。30.如权利要求29所述的设备,其中所述第一处理器和所述第二处理器支持将所述共享对象的虚拟表从所述第一处理器和所述第二处理器的私有地址空间拷贝到所述共享非相干区域,其中所述共享对象的所述虚拟表位于所述共享非相干区域中的相同地址,即使所述虚拟表的内容不同。31.如权利要求30所述的设备,其中所述第一处理器支持将指向所述第一处理器侧虚拟表和所述第二处理器侧虚拟表的虚拟指针修改成指向所述共享非相干区域,同时创建所述共享对象。全文摘要一种计算平台可包含异质处理器(例如CPU和GPU)以支持这种处理器之间虚函数的共享。在一个实施例中,用于访问来自CPU110的共享对象的CPU侧虚函数表指针可用于确定GPU虚函数表,如果存在GPU侧表的话。在其它实施例中,可在共享虚拟存储器内创建可不保持数据一致性的共享非相干区域。存储在共享非相干区域内的CPU和GPU侧数据可具有与从CPU和GPU侧看到的相同的地址。然而,CPU侧数据的内容可不同于GPU侧数据的内容,因为共享虚拟存储器在运行时期间可不保持一致性。在一个实施例中,vptr可修改成指向存储在共享虚拟存储器中的CPU虚函数表和GPU虚函数表。文档编号G06F15/167GK103109286SQ201080069225公开日2013年5月15日申请日期2010年9月24日优先权日2010年9月24日发明者S.颜,S.罗,X.周,Y.高,H.陈,B.萨哈申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1