首页> 中国专利> 计算平台的异质处理器之间的共享虚拟存储器中的虚函数共享

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

摘要

一种计算平台可包含异质处理器(例如CPU和GPU)以支持这种处理器之间虚函数的共享。在一个实施例中,用于访问来自CPU 110的共享对象的CPU侧虚函数表指针可用于确定GPU虚函数表,如果存在GPU侧表的话。在其它实施例中,可在共享虚拟存储器内创建可不保持数据一致性的共享非相干区域。存储在共享非相干区域内的CPU和GPU侧数据可具有与从CPU和GPU侧看到的相同的地址。然而,CPU侧数据的内容可不同于GPU侧数据的内容,因为共享虚拟存储器在运行时期间可不保持一致性。在一个实施例中,vptr可修改成指向存储在共享虚拟存储器中的CPU虚函数表和GPU虚函数表。

著录项

  • 公开/公告号CN104536740A

    专利类型发明专利

  • 公开/公告日2015-04-22

    原文格式PDF

  • 申请/专利权人 英特尔公司;

    申请/专利号CN201410790536.8

  • 发明设计人 S.颜;S.罗;X.周;Y.高;H.陈;B.萨哈;

    申请日2010-09-24

  • 分类号G06F9/44;G06F9/54;

  • 代理机构中国专利代理(香港)有限公司;

  • 代理人汤春龙

  • 地址 美国加利福尼亚州

  • 入库时间 2023-12-18 08:20:29

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2018-05-08

    授权

    授权

  • 2015-05-20

    实质审查的生效 IPC(主分类):G06F9/44 申请日:20100924

    实质审查的生效

  • 2015-04-22

    公开

    公开

说明书

背景技术

计算平台可包含异质处理器,诸如中央处理单元(CPU)和图形处理单元(GPU)、对称 和不对称处理器。类实例(或对象)可驻留在与CPU-GPU平台的第一侧(例如CPU)相关联的 第一存储器中。不可能使第二侧(GPU侧)调用驻留在与CPU-GPU平台的第一侧(CPU侧)相 关联的第一存储器中的对象和相关联的成员函数。也不可能使第一侧能够调用驻留在第二侧 (GPU)侧上第二存储器中的对象和相关联的成员函数。当类实例或对象被存储在不同地址空 间时,现有通信机制可能仅允许异质处理器(CPU与GPU)之间的单向通信来调用类实例和相 关联的虚函数。

这种单向通信方法防止了异质处理器之间的类实例的自然功能性划分。对象可包括 面向吞吐量的成员函数和一些标量成员函数。例如,游戏应用中的场景类可具有可适合于 GPU的渲染函数,并且还可包括可适合于在CPU上执行的物理学和人工智能(AI)函数。用 当前的单向通信机制,通常存在两个不同的场景类,分别包括CPU(上例中的物理学和AI) 成员函数和GPU(适合GPU的渲染函数)成员函数。使两个不同的场景类一个用于CPU而另 一个用于GPU可能需要在两个场景类之间来回拷贝数据。

附图说明

在附图中作为示例而非作为限制说明了本文描述的本发明。为了说明的简化和清 晰,图中示出的单元不一定按比例绘制。例如,为了清楚起见,一些单元的尺寸可能相对于 其它单元放大了。另外,在认为适当的情况下,附图标记已经在各图之间重复使用来指示对 应或类似的单元。

图1示出了根据一个实施例支持在计算机平台中提供的异质处理器之间的共享虚拟 存储器中存储的虚函数共享的平台100;

图2是示出了根据一个实施例由平台100执行的支持在计算机平台中提供的异质处理器之间 的共享虚拟存储器中存储的虚函数共享的操作的流程图;

图3示出了根据一个实施例用于从共享对象加载虚函数指针的CPU侧和GPU侧代码;

图4是示出了根据第一实施例由平台100执行的生成表以支持在计算机平台中提供的异质处 理器之间的共享虚拟存储器中存储的虚函数共享的操作的流程图;

图5示出了根据一个实施例由平台100用于支持通过异质处理器可共享的对象的成员函数进 行CPU 110与GPU 180之间双向通信的流程图;

图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)110、与CPU 110相关联的操作系统(OS)112、CPU私有空间115、CPU编译器118、 共享虚拟存储器(或多版本共享存储器)130、图形处理单元(GPU)180、与GPU 180相关联的 操作系统(OS)182、GPU私有空间185和GPU编译器188。在一个实施例中,OS 112和OS  182可分别管理CPU 110和CPU私有空间115,以及GPU 180和GPU私有空间185的资 源。在一个实施例中,为了支持共享虚拟存储器130,CPU私有空间115和GPU私有空间 185可包括多版本数据的拷贝。在一个实施例中,为了保持存储器一致性,诸如对象131的 元数据可用于同步存储在CPU私有空间115和GPU私有空间185中的拷贝。在其它实施例 中,多版本数据可存储在物理共享存储器诸如共享存储器950(图9的,下面描述)中。在一 个实施例中,共享虚拟存储器可由物理私有存储器空间(诸如异质处理器CPU 110和GPU  180的CPU私有空间115和GPU私有空间185)或物理共享存储器(诸如由异质处理器共享的 共享存储器950)支持。

在一个实施例中,CPU编译器118和GPU编译器188可分别耦合到CPU 110和 GPU 180,或者也可远程提供在其它平台或计算机系统上。与CPU 110相关联的编译器(一 个或多个)118可生成用于CPU 110的编译代码,并且与GPU 180相关联的编译器188可生 成用于GPU 180的编译代码。在一个实施例中,CPU编译器118和GPU编译器188可通过 编译用户用高级语言诸如面向对象的语言提供的对象的一个或多个成员函数来生成编译代 码。在一个实施例中,编译器118和188可使对象存储在共享存储器130中,并且共享对象 131可包括分配给CPU侧110或GPU侧180的成员函数。在一个实施例中,存储在共享存 储器130中的共享对象131可包括成员函数诸如虚函数VF 133-A到133-K和非虚函数NVF  136-A到136-L。在一个实施例中,成员函数诸如共享对象131的VF 133和NVF 136可提 供CPU 110与GPU 180之间的双向通信。

在一个实施例中,为了实现动态绑定目的,CPU 110或GPU 180之一可通过索引虚 函数表(虚函数表)来调用虚函数,诸如VF 133-A(例如C++虚函数)。在一个实施例中,共享 对象131中的隐藏指针可指向该虚函数表。然而,CPU 110和GPU 180可具有不同的指令 集架构(ISA),并且当对于具有不同ISA的CPU 110和GPU 180编译函数时,表示由编译器 118和188编译的相同函数的代码可具有不同的大小。以同样方式将代码布局在GPU侧和 CPU侧(即,共享类中的虚函数的CPU版本和共享类中的同一虚函数的GPU版本),可能具 有挑战性。如果在共享类Foo()中存在三个虚函数,则在代码的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相关联来实现在 CPU 110与GPU 180之间的共享虚拟存储器中存储的虚函数共享。在一个实施例中,可通 过将共享对象131的第一与第二虚函数表相关联来创建公用虚函数表,其可用于CPU侧和 GPU侧上的虚函数调用。

在图2的流程图中描绘了异质处理器CPU 110和GPU 180共享存储在共享虚拟存储 器中的虚函数的实施例。在块210,第一处理器诸如CPU 110可标识共享对象131的第一处 理器侧虚函数表指针(CPU侧虚函数表指针)。在一个实施例中,对于共享对象131,可存在 CPU侧虚函数表指针,不管共享对象131可由CPU侧还是GPU侧访问。

在一个实施例中,对于计算系统诸如仅有CPU的环境中的正常虚函数调用,代码序 列可如图3的块310中所示。在一个实施例中,甚至在计算系统诸如100中,其可包含异质 处理器,用于正常虚函数调用的CPU侧代码序列可与在图3的块310中描绘的相同。如在 块310中所描绘的,行301中的代码:Mov r1,[obj]可将共享对象131的虚函数表加载到变 量r1。行305中的代码:(Call*[r1+offsetFunction])可调用虚函数,诸如共享对象131的VF  133-A。

在块250中,第二处理器诸如GPU 180可使用共享对象131的第一处理器侧虚函数 表指针(CPU侧虚函数表指针)确定第二处理器侧虚函数表(GPU侧虚函数表),如果存在第二 处理器侧表(GPU表)的话。在一个实施例中,第二处理器侧表(GPU表)可包含<"类名"、第 一处理器侧虚函数表地址、第二处理器侧虚函数表地址>。

在一个实施例中,在GPU侧,GPU 180可生成在块350中描绘的代码序列,其可不 同于在块310中描绘的代码序列。在一个实施例中,因为GPU编译器188可根据类型知道 每个可共享类,因此GPU 180可生成在块350中描绘的代码序列,用于从共享对象诸如共 享对象131加载虚函数指针。在一个实施例中,行351中的代码:Mov r1,[obj]可加载CPU 虚函数表地址,并且行353中的代码:R2=getvtableAddress(r1)可从GPU表中获得GPU虚 函数表。在一个实施例中,行358中的代码:(Call*[r2+offsetFunction])可基于使用CPU虚 函数表地址生成的GPU虚函数表调用虚函数。在一个实施例中,getvtableAddress函数可使 用CPU侧虚函数表地址索引到GPU表中来确定GPU侧虚函数表。

在块280,使用共享对象131可实现第一处理器(CPU 110)和第二处理器(GPU 180)进 行双向通信。

使用图4的流程图示出了创建GPU表的实施例。在块410,可在初始化时间期间, 在一个实施例中,通过将指向可共享类(共享对象131)的注册函数(registration function)的函 数指针包含到初始化段(例如MSC++的CRT$XCI段)中,形成该表。例如,可共享类的注册 函数可被包含到MS CRT$XCI段初始化段中。

在块420,可在初始化时间期间执行注册函数。作为将指向注册函数的函数指针包含 到初始化段中的结果,可在执行初始化段的同时执行注册函数。

在块430,在第一处理器侧(CPU侧),注册函数可将“类名”和“CPU虚函数表地 址”注册到第一表中。在块440,在第二处理器侧(GPU侧),注册函数可将“类名”和 “GPU虚函数表地址”注册到第二表中。

在块480,第一表和第二表可合并成一个公用表。例如,如果第一和第二表包含相同 “类名”,则第一表的第一项可与第二表的第一项组合。作为合并的结果,第一和第二表的 组合项可看起来像具有单个类名的一项。在一个实施例中,公用表可驻留在GPU侧,并且 公用表或GPU表可包含“类名”、CPU虚函数表地址和GPU虚函数表地址。

在一个实施例中,创建公用表或GPU表可避免对CPU侧和GPU侧上虚函数表地址 匹配的要求。还有,GPU表可支持动态链接库(DLL)。在一个实施例中,在GPU侧上可使 用或初始化共享对象131之前,可在CPU侧上加载类。然而,因为应用一般被加载在CPU 侧,因此对于在应用中定义的类还有静态链接库,GPU表可实现CPU 110与GPU 180之间 的双向通信。对于DLL,DLL可加载在CPU侧上,并且GPU表也可用于DLL的双向通 信。

可共享对象131可包含CPU侧虚函数表指针,并且可没有额外的虚函数表指针用于 GPU侧虚函数表。在一个实施例中,使用对象中的CPU虚函数表指针,可生成GPU虚函 数表指针,如上面在图4的块350中所描述的。在一个实施例中,可原样使用CPU侧上的 CPU虚函数表指针,而GPU侧上的GPU虚函数表指针可用于虚函数调用。在一个实施例 中,这种方法可不涉及链接器/加载器的修改或参与,并且不要求共享对象131中的额外vptr 指针字段。这种方法可允许在CPU 110与GPU 180之间用面向对象的语言写的应用的细粒 度划分。

图5中示出了计算平台100用于支持通过可由异质处理器共享的对象的成员函数进 行CPU 110与GPU 180之间双向通信的流程图的实施例。在一个实施例中,GPU编译器 188可生成用于GPU函数的CPU存根(stub)510和CPU侧110上的CPU远程调用API  520。还有,GPU编译器188可生成GPU侧粘合逻辑(gluing logic)530用于第一成员函数的 GPU侧180上的GPU函数。在一个实施例中,CPU 110可使用第一路径的第一启用路径(包 括存根逻辑510、API 520和粘合逻辑530)对第一成员函数进行调用。在一个实施例中,第 一启用路径可允许CPU 110与GPU侧180建立远程调用,并将信息从CPU侧110传送到 GPU侧180。在一个实施例中,GPU侧粘合逻辑530可允许GPU 180接收从CPU侧110传 送的信息。

在一个实施例中,CPU存根510可包括与第一成员函数(即原始GPU成员函数)相同 的名称,但可封入API 520以将调用从CPU 110定向到GPU 180。在一个实施例中,由 CPU编译器118生成的代码可原样地调用第一成员函数,但调用可被重新定向到CPU存根 510和远程调用API 520。再者,当进行远程调用时,CPU存根510可发送表示正在调用的 第一成员函数的唯一名称和指向共享对象的指针以及被调用的第一成员函数的其它参数。在 一个实施例中,GPU侧粘合逻辑530可接收参数,并调度第一成员函数调用。在一个实施 例中,GPU编译器188可生成粘合逻辑(或调度器),其可通过用作为第一参数传递的对象指 针调用第一成员函数的GPU侧函数地址来调度非虚函数。在一个实施例中,GPU编译器 188可生成GPU侧上的跳转表注册调用来注册GPU侧粘合逻辑530,以使CPU存根510能 够与GPU侧粘合逻辑530通信。

在一个实施例中,GPU编译器188可创建第二启用路径,包括用于CPU函数的GPU 存根550、GPU侧180上的GPU远程调用API 570以及用于分配给CPU 110的第二成员函 数的CPU侧粘合逻辑580。在一个实施例中,GPU 180可使用第二启用路径对CPU侧110 进行调用。在一个实施例中,GPU存根560和API 570可允许GPU 180与CPU侧110建立 远程调用,并将信息从GPU侧180传送到CPU侧110。在一个实施例中,CPU侧粘合逻辑 580可允许CPU 110接收从GPU侧180传送的信息。

在一个实施例中,为了支持第二成员函数调用,GPU编译器188可生成用于CPU侧 粘合逻辑580的跳转表注册。在一个实施例中,可在CPU粘合逻辑580中调用第二成员函 数的CPU侧函数地址。在一个实施例中,由CPU粘合逻辑580生成的代码可与由CPU编 译器118生成的其它代码链接。这种方法可提供支持异质处理器110与180之间双向通信的 路径。在一个实施例中,CPU存根逻辑510和CPU侧粘合逻辑580可经由CPU链接器590 耦合到CPU 110。在一个实施例中,CPU链接器590可使用CPU存根510、CPU侧粘合逻 辑580和由CPU编译器118生成的其它代码生成CPU可执行595。在一个实施例中,GPU 存根逻辑560和GPU侧粘合逻辑570可经由GPU链接器540耦合到GPU 180。在一个实施 例中,GPU链接器540可使用GPU粘合逻辑570、GPU存根560和由GPU编译器188生 成的其它代码生成GPU可执行545。

图6中示出了CPU侧110使用上面描述的基于表的技术调用GPU虚函数和GPU非 虚函数的流程图600的实施例。示出了块610,包括共享类实例或标题为共享类Foo()的对 象,其包含注释虚函数(例如VF 133-A)和虚函数调用“Virtual void SomeVirtFunc()”的第一 注释标签#Pragma GPU以及注释非虚函数(例如NVF 136-A)和非虚函数调用“void  SomeNonVirtuFunc()”的第二注释标签#Pragma GPU。

在一个实施例中,'pFoo'可指向类Foo()的共享对象131,并且可从CPU侧110到 GPU侧180完成远程虚函数调用。在一个实施例中, 'pFoo=new(SharedMemoryAllocator())Foo();'可以是用共享存储器分配/释放运行时调用覆盖新 的/删除运算符的一种可能方式。在一个实施例中,CPU编译器118响应于在块610中编译 'pFoo->SomeVirtuFunc()',可发起在块620中描绘的任务。

在块620,CPU侧110可调用GPU虚函数。在块630,CPU侧存根(用于GPU成员 函数)510和API 520可向GPU侧180发送信息(参数)。在块640,GPU侧粘合逻辑(用于 GPU成员函数)530可从THIS对象获得pGPUVptr(CPU侧虚函数表指针),并且可找到GPU 虚函数表。在块650,GPU侧粘合逻辑540(或调度器)可具有上面描述的在块350中描绘的 代码序列,以使用CPU侧虚函数表指针获得GPU侧虚函数表。

在一个实施例中,GPU编译器188响应于在块610中编译#Pragma GPU 'voidSomeNonVirtuFunc()',可生成使用'pFooSomeNonVirtuFunc()'发起在块670中描绘的任务 的代码。在块670,CPU侧110可调用GPU非虚函数。在块680,CPU侧存根510和API  520可向GPU侧180发送信息(参数)。在块690,GPU侧粘合逻辑530可推送参数并直接调 用地址,因为函数地址可能已经已知了。

在图7的流程图中示出了由计算平台100执行的使用虚拟共享非相干区域支持异质 处理器之间的虚函数共享的操作的实施例。在计算系统诸如包含异质处理器(诸如CPU 110 和GPU 180)的计算系统100中,CPU 110和GPU 180可运行由不同编译器诸如118和 188(或具有不同目标的相同编译器)生成的不同代码,不可能保证相同虚函数位于相同地 址。虽然有可能将编译器/链接器/加载器修改成支持虚函数共享,但下面描述的“非相干区 域”方法(仅有运行时的方法)可能是允许CPU 110与GPU 180之间虚函数共享的更简单技 术。这种方法可允许容易地接受和部署共享虚拟存储器系统,诸如我的/你的/我们的 (MYO)。尽管作为示例使用C++面向对象的语言,但下面的方法可应用于支持虚函数的其它 面向对象的编程语言。

在块710,CPU 110可在共享虚拟存储器130内创建共享非相干区域以存储CPU 110 和GPU 180的共享类的虚函数表。在一个实施例中,可通过规定到共享虚拟存储器130内 区域的非相干标签来创建共享非相干区域。在一个实施例中,MYO运行时可提供一个或多 个应用可编程接口(API)函数来创建虚拟共享区域(在MYO的术语中称为“场所(arena)”,并 且在MYO中可创建许多此类场所)。例如,可使用诸如 myoArenaCreate(xxx,...,NonCoherentTag)或myoArenaCreateNon CoherentTag(xxx,...)的标签。 在一个实施例中,使用以上标签可创建相干或非相干场所。然而,在其它实施例中,可使用 API函数来改变存储器大块(或部分)的属性。例如,可使用myoChangeToNonCoherent(addr  size)创建第一区域作为非相干区域或场所,以及第二区域(或部分)作为相干场所。在一个实 施例中,第一区域可由地址大小规定。

在一个实施例中,可创建存储器场所(即,管理的存储器大块),其可允许数据共享而 无需保持数据一致性,并且这种存储器场所可称为共享非相干区域。在一个实施例中,存储 在共享非相干区域内的CPU数据和GPU数据可具有与由CPU 110和GPU 180看到的相同 的地址。然而,内容(CPU数据和GPU数据)可不同,因为共享虚拟存储器130诸如MYO 在运行时可以不保持一致性。在一个实施例中,共享非相干区域可用于存储每个共享类的虚 拟方法表的新拷贝。在一个实施例中,从CPU 110和GPU 180所看到的虚函数表地址可相 同;然而,虚函数表可不同。

在块750,在初始化时间期间,每个可共享类的虚函数表可从CPU私有空间115和 GPU私有空间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。在一个实施例中,虚 函数可按如下调用:

Mov eax,[ecx]#ecx含有“this”指针,eax含有vptr;

Call[eax,vfunc]#vfunc是虚函数表中的虚函数索引。

在CPU侧,以上代码可调用虚函数的CPU实现;而在GPU侧,以上代码可调用虚 函数的GPU实现。这种方法可允许类的数据共享和虚函数共享。

在图8中示出了使用虚拟共享非相干区域支持异质处理器之间的虚函数共享的关系 图800的实施例。在一个实施例中,对象布局801可包含第一槽801-A中的虚拟表指针(vptr) 以及其它字段诸如槽801-B和801-C中的字段1和字段2。在一个实施例中,在CPU编译 器118和GPU编译器188执行位于槽801-A中的虚函数表指针(vptr)之后,生成(如虚线 802-A所指示的)CPU虚函数表和GPU虚函数表(如虚线802-B所指示的)。CPU虚函数表 (CPU虚函数表)可位于CPU私有地址空间115内的地址810,并且GPU虚函数表可位于 GPU私有地址空间185内的地址840。在一个实施例中,CPU虚函数表可包含诸如vfunc1 和vfunc2的函数指针,并且GPU虚函数表可包含诸如vfunc1'和vfunc2'的函数指针。在一 个实施例中,函数指针(vfunc1和vfunc2)与(vfunc1'和vfunc2')也可不同,因为指针指向同一 函数的不同实现。

在一个实施例中,作为修改vptr(如在块780中所示)的结果,vptr可指向共享虚拟存 储器130内的共享非相干区域860。在一个实施例中,CPU虚函数表可位于地址Address  870,并且GPU虚函数表可位于相同地址Address 870。在一个实施例中,CPU虚函数表可 包含诸如vfunc1和vfunc2的函数指针,并且GPU虚函数表可包含诸如vfunc1'和vfunc2'的 函数指针。在一个实施例中,函数指针(vfunc1和vfunc2)与(vfunc1'和vfunc2')可不同。在一 个实施例中,将CPU虚函数表和GPU虚函数表保存在共享非相干区域860中可使CPU 110 和GPU 180分别能够在同一地址位置Address870看到CPU虚函数表和GPU虚函数表,然 而,CPU虚函数表的内容(vfunc1和vfunc2)可不同于GPU虚函数表的内容(vfunc1'和 vfunc2')。

在图9中示出了包括支持双向通信的异质处理器的计算机系统900的实施例。参考 图9,计算机系统900可包含包括单指令多数据(SIMD)处理器的通用处理器(或CPU)902和 图形处理器单元(GPU)905。在一个实施例中,CPU 902除了执行各种其它任务或存储指令序 列之外还可执行增强操作,以在机器可读存储介质925中提供增强操作。然而,指令序列还 可存储在CPU私有存储器920中,或者任何其它适当的存储介质中。在一个实施例中, CPU 902可与CPU旧编译器903和CPU链接器/加载器904相关联。在一个实施例中,GPU  905可与GPU专有编译器906和GPU链接器/加载器907相关联。

虽然在图9中描绘了单独图形处理器单元GPU 905,但在一些实施例中,作为另一 个示例,处理器902可用于执行增强操作。操作计算机系统900的处理器902可以是耦合到 逻辑930的一个或多个处理器核。逻辑930可耦合到一个或多个I/O装置960,其可提供到 计算机系统900的接口。逻辑930在一个实施例中例如可以是芯片集逻辑。逻辑930耦合到 存储器920,其可以是任何种类的储存器,包含光、磁或半导体储存装置。图形处理器单元 905通过帧缓冲器耦合到显示器940。

在一个实施例中,计算平台900可支持一种或多种技术以允许通过细粒度划分共享 对象来通过诸如共享对象的虚函数的成员函数进行异质处理器CPU 902与GPU 905之间的 双向通信(函数调用)。在一个实施例中,计算机系统900可允许使用称为“基于表”的技术 的第一技术进行CPU 902与GPU 905之间的双向通信。在其它实施例中,计算平台可允许 使用称为“非相干区域”技术的第二技术进行CPU 902与GPU 905之间的双向通信,在该 技术中,可在位于私有CPU存储器920、私有GPU存储器930或共享存储器950中的虚拟 共享存储器中创建虚拟共享非相干区域。在一个实施例中,在计算机系统900中可不提供单 独的共享存储器诸如共享存储器950,并且在这种情况下,可在其中一个私有存储器诸如 CPU存储器920或GPU存储器930内提供共享存储器。

在一个实施例中,当使用基于表的技术时,可用于访问来自CPU 110或GPU 180的 共享对象的共享对象的CPU侧虚函数表指针可用于确定GPU虚函数表,如果存在GPU侧 表的话。在一个实施例中,GPU侧虚函数表可包含<"类名"、CPU虚函数表地址、GPU虚函 数表地址>。在一个实施例中,获得GPU侧虚函数表地址和生成GPU侧表的技术,如上所 述。

在其它实施例中,当使用“非相干区域”技术时,在共享虚拟存储器内创建共享非 相干区域。在一个实施例中,共享非相干区域可以不保持数据一致性。在一个实施例中,共 享非相干区域内的CPU侧数据和GPU侧数据可具有与从CPU侧和GPU侧看到的相同的地 址。然而,CPU侧数据的内容可不同于GPU侧数据的内容,因为共享虚拟存储器在运行时 期间可以不保持一致性。在一个实施例中,共享非相干区域可用于存储每个共享类的虚拟方 法表的新拷贝。在一个实施例中,这种方法可将虚拟表保持在同一地址。

本文描述的图形处理技术可用各种硬件架构实现。例如,图形功能性可集成在芯片 集内。备选地,可使用分立图形处理器。作为又一实施例,图形功能可由通用处理器实现, 包含多核处理器,或实现为存储在机器可读介质中的软件指令集。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号