国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      對計算機平臺的異構(gòu)處理器的雙向通信支持的制作方法

      文檔序號:6596705閱讀:223來源:國知局

      專利名稱::對計算機平臺的異構(gòu)處理器的雙向通信支持的制作方法對計算機平臺的異構(gòu)處理器的雙向通信支持
      背景技術(shù)
      :計算機系統(tǒng)可以包括支持異構(gòu)處理器(諸如中央處理單元(CPU)與圖形處理單元(GPU)、對稱與非對稱處理器)的平臺。面向?qū)ο笳Z言的類實例(或?qū)ο?可以位于與CPU-GPU平臺的第一側(cè)(例如,CPU)相關(guān)聯(lián)的第一存儲器中。第二側(cè)(GPU側(cè))不能調(diào)用位于與CPU-GPU平臺的第一側(cè)(CPU側(cè))相關(guān)聯(lián)的第一存儲器中的對象和相關(guān)聯(lián)的成員函數(shù)。而且,第一側(cè)不能調(diào)用位于第二側(cè)(GPU側(cè))上的第二存儲器中的對象和相關(guān)聯(lián)的成員函數(shù)。由于類實例或?qū)ο蟊淮鎯υ诓煌牡刂房臻g中,所以現(xiàn)有的通信機制可以僅允許異構(gòu)處理器(CPU和GPU)之間的單向通信來調(diào)用類實例和相關(guān)聯(lián)的虛函數(shù)。這種單向通信方法防止了類實例在異構(gòu)處理器之間的自然功能劃分。對象可以包括面向吞吐量的成員函數(shù)和一些標量成員函數(shù)。例如,游戲應(yīng)用程序中的場景類可以具有可以適用于GPU的渲染函數(shù),而且還可以包括可以適用于在CPU上執(zhí)行的物理和人工智能(Al)函數(shù)。通過采用目前的單向通信機制,典型地必須具有分別包括CPU(上面示例中的物理和Al)成員函數(shù)和GPU(適用于GPU的渲染函數(shù))成員函數(shù)的兩種不同的場景類。通過采用一個用于CPU數(shù)據(jù)而另一個用于GPU數(shù)據(jù)的兩種不同的場景類,會不得不在這兩種場景類之間來回復(fù)制。在附圖中,通過示例而非限制性的方式示出了本文描述的發(fā)明。出于說明簡化和清楚的目的,附圖中所示的元件不必按照尺寸繪制。例如,清楚起見,一些元件的尺寸可以相對于其它元件而被放大。此外,在認為合適的情況中,將附圖標記在各圖之間重復(fù)以指示相應(yīng)或相似的元件。圖I示出根據(jù)一個實施例的用于在異構(gòu)處理器(諸如CPU和GPU)之間提供雙向通信支持的平臺100。圖2是示出了根據(jù)一個實施例的由用于在異構(gòu)處理器(諸如CPU和GPU)之間提供雙向通信支持的平臺100執(zhí)行的操作的流程圖。圖3示出根據(jù)一個實施例的包括諸如CPU和GPU之類的異構(gòu)處理器的平臺300,其中CPU和GPU分別耦合到提供對共享對象的細粒度劃分的面向?qū)ο笳Z言支持的CPU傳統(tǒng)編譯器和GPU專用編譯器。圖4示出根據(jù)一個實施例的包括諸如CPU和GPU之類的異構(gòu)處理器的平臺300,其中CPU和GPU分別耦合到提供對共享對象的細粒度劃分的面向?qū)ο笳Z言支持的CPU專用編譯器和GPU專用編譯器。圖5是示出了根據(jù)第一實施例的由用于提供異構(gòu)處理器之間的雙向通信的平臺100執(zhí)行的操作的流程圖。圖6示出根據(jù)一個實施例的描述通過共享對象的成員函數(shù)實現(xiàn)異構(gòu)處理器之間的雙向通信的流程圖。圖7A-7C示出根據(jù)本發(fā)明第一實施例的共享對象和該共享對象在存儲器中的布局。圖8示出根據(jù)第一實施例的描述由CPU側(cè)按實際執(zhí)行的GPU虛函數(shù)和GPU函數(shù)調(diào)用的過程的流程圖。圖9示出根據(jù)第一實施例的描述由GPU側(cè)執(zhí)行的CPU虛函數(shù)和CPU函數(shù)調(diào)用的過程的流程圖。圖10是示出了根據(jù)第二實施例的由用于提供異構(gòu)處理器之間的雙向通信的平臺100執(zhí)行的操作的流程圖。圖11A-11C示出根據(jù)本發(fā)明第二實施例的共享對象和該共享對象在存儲器中的布局。圖12示出根據(jù)第二實施例的描述由CPU側(cè)按實際執(zhí)行的GPU虛函數(shù)和GPU函數(shù)調(diào)用的過程的流程圖。圖13示出根據(jù)第二實施例的描述由GPU側(cè)執(zhí)行的CPU虛函數(shù)和CPU函數(shù)調(diào)用的過程的流程圖。圖14示出根據(jù)一個實施例的可以通過使用共享對象的細粒度劃分來提供平臺的異構(gòu)處理器之間的雙向通信支持的計算機系統(tǒng)。具體實施例方式下面的描述描述了通過支持共享對象的細粒度劃分來提供計算機平臺的異構(gòu)處理器之間的雙向通信的技術(shù)。在下面的描述中,闡述了若干具體細節(jié),諸如邏輯實現(xiàn)方式、資源劃分或共享、或復(fù)制實現(xiàn)方式、系統(tǒng)部件的類型與相互關(guān)系、以及邏輯劃分或集成選擇,以便提供對本發(fā)明的更透徹的理解。然而,本領(lǐng)域技術(shù)人員應(yīng)當意識到,可以在沒有這些具體細節(jié)的情況下實踐本發(fā)明。在其他實例中,沒有詳細示出控制結(jié)構(gòu)、門級電路和全軟件指令序列,以免模糊本發(fā)明。通過采用所包含的描述,本領(lǐng)域普通技術(shù)人員將能夠在不進行過度實驗的情況下實施適當?shù)墓δ?。本說明書中提及的“一個實施例”、“實施例”或“示例性實施例”表示所描述的實施例可以包括特定的特征、結(jié)構(gòu)或特性,但是每個實施例可以不是必須地包括這些特定的特征、結(jié)構(gòu)或特性。而且,這些短語不是必然地指代相同的實施例。此外,當結(jié)合實施例描述特定的特征、結(jié)構(gòu)或特性時,應(yīng)當認為,不論是否明確地進行描述,在本領(lǐng)域技術(shù)人員的知識范圍內(nèi)都可以結(jié)合其它實施例來實現(xiàn)這些特征、結(jié)構(gòu)或特性。本發(fā)明的實施例可以在硬件、固件、軟件或它們的任意組合中實施。還可以將本發(fā)明的實施例實施為存儲在機器可讀介質(zhì)上的指令,這些指令可以由一個或多個處理器讀取和執(zhí)行。機器可讀存儲介質(zhì)可以包括用于以機器(例如,計算設(shè)備)可讀的形式來存儲或傳送信息的任何機制。例如,機器可讀存儲介質(zhì)可以包括只讀存儲器(ROM);隨機存取存儲器(RAM);磁盤存儲媒介;光存儲媒介;閃存設(shè)備;電、光形式的信號。此外,本文中可以將固件、軟件、例程和指令描述為執(zhí)行特定的動作。然而,應(yīng)當意識到,這些描述僅是出于方便的目的,而且這些動作實際上源自計算設(shè)備、處理器、控制器以及執(zhí)行固件、軟件、例程和指令的其他設(shè)備。在一個實施例中,計算機平臺可以支持用于通過共享對象的細粒度劃分來通過該共享對象的成員函數(shù)允許異構(gòu)處理器(例如,CPU和GPU)之間的雙向通信(函數(shù)調(diào)用)的一種或多種技術(shù)。在一個實施例中,計算機平臺可以通過使用可由用戶并入的宏導(dǎo)致的第一技術(shù)(下文中稱為“用戶介入技術(shù)”)來允許CPU與GPU之間的雙向通信。在其他實施例中,計算機平臺可以通過使用獨立于用戶介入的第二技術(shù)(下文中稱為“自動技術(shù)”)來允許CPU與GPU之間的雙向通信。在一個實施例中,當使用用戶介入技術(shù)時,共享對象可以在第一側(cè)(即CPU)上被分配并之后在第二側(cè)(即GPU)上被使用,以便GPU可以調(diào)用可以用CPU分配的共享對象的第一成員函數(shù)。在一個實施例中,用GPU分配的共享對象的第二成員函數(shù)可以被CPU調(diào)用。結(jié)果,異構(gòu)處理器之間的雙向通信可以由計算機平臺支持。在一個實施例中,用戶可以促使對象(共享對象)被存儲在共享存儲器中,并之后向CPU或GPU中的其中一者分配成員函數(shù)。在一個實施例中,用戶可以用注釋標簽來注釋成員函數(shù),以將成員函數(shù)分配給CPU或GPU中的其中一者。在一個實施例中,僅由GPU執(zhí)行但是可以由CPU調(diào)用的第一成員函數(shù)用第一注釋標簽注釋。而且,僅可以由CPU執(zhí)行并可以由GPU調(diào)用的第二成員函數(shù)可以用第二注釋標簽注釋。在一個實施例中,GPU或CPU編譯器在編譯對象時可以識別與成員函數(shù)相關(guān)聯(lián)的注釋標簽。在一個實施例中,用戶可以添加用于分別聲明和初始化指向虛函數(shù)表(Vtable)的指針的宏(諸如指針宏和初始化宏)。在一個實施例中,諸如(constvoid*constpGPUvptr)之類的指針宏可以聲明指向GPU側(cè)虛函數(shù)表(GPUvtable)的指針,而且可以用共享存儲器分配/釋放運行時間調(diào)用來覆蓋新/刪除操作符。在一個實施例中,諸如(pGPUvptr=GetGPUvtabIeAddr())之類的初始化宏可以用恰當?shù)倪\行時間調(diào)用來初始化指向GPUvtable的指針。在一個實施例中,GPU編譯器可以編譯對象并生成針對用第一注釋值注釋的成員函數(shù)的代碼。GPU編譯器可以生成針對GPU成員函數(shù)的CPU側(cè)遠程調(diào)用存根(stub),而且CPU側(cè)遠程調(diào)用存根可以在與用CPU傳統(tǒng)編譯器構(gòu)建的其他用戶代碼鏈接之后替換GPU成員函數(shù)的初始定義。在一個實施例中,GPU編譯器可以生成用于從CPU側(cè)派遣遠程GPU成員函數(shù)調(diào)用的GPU側(cè)粘結(jié)邏輯。在一個實施例中,GPU編譯器可以生成GPU側(cè)遠程調(diào)用存根和用于從GPU側(cè)派遣CPU成員函數(shù)調(diào)用的CPU側(cè)粘結(jié)邏輯。在其他實施例中,當使用自動技術(shù)時,虛函數(shù)表(vtable)被加載到異構(gòu)CPU和GPU平臺中的同一地址處。在一個實施例中,GPU編譯器可以生成針對共享類vtable的CPU對象文件(first_obj_files),而且GPU編譯器可以生成關(guān)于確定對象是在CPU與GPU之間被共享的代碼。GPU編譯器可以在該對象文件的專用部分(S卩.VtGPU)中存儲這種共享類vtable。CPU編譯器可以生成CPU對象文件(second_obj_files),該CPU對象文件可以與由GPU編譯器生成的CPU對象文件(first_obj_fiIes)相鏈接。構(gòu)建設(shè)施的模板(即建立文件或項目文件)可以被布置,以使(由GPU編譯器生成的)first_obj_files先于(由CPU編譯器生成的)second_obj_files。在一個實施例中,鏈接器可以通過使用GPU生成的GPUvtable代碼(其可以是例如C0MDATA符號)而非由CPU編譯器生成的CPUVtable代碼來生成最終的CPU可執(zhí)行文件。由于first_obj_files具有相同的名稱.VtGPU,所以該鏈接器可以在CPU可執(zhí)行文件中的一個毗鄰部分處收集GPU編譯器生成的vtable代碼。在一個實施例中,為了獲知該專用部分(.VtGPU)的邊界,運行時間庫可以分配用于獲知.VtGPU部分的開始和結(jié)束的變量(boundary_var)。運行時間庫可以使用開始符號來識別專用部分.VtGPU的開始地址。在識別了該部分的開始地址后,GPU側(cè)鏈接器/加載器可以調(diào)整GPU可執(zhí)行文件基地址,以便GPUvtable部分也可以位于同一地址處。在一個實施例中,上面的動作對用戶而言可以是不可見的,而且用戶不可以為了在CPU與LRB之間共享這種對象而改變類定義中的任何內(nèi)容。在一個實施例中,上面的動作(或任務(wù))可以由編譯器、鏈接器或加載器塊中的一者或多者來執(zhí)行。用于提供對細粒度計算的面向?qū)ο笳Z言支持以支持異構(gòu)處理器之間的雙向通信的平臺100的實施例在圖I中示出。在一個實施例中,平臺100可以包括中央處理單元(CPU)110、與CPU110相關(guān)聯(lián)的操作系統(tǒng)(OS)112、CPU專用空間115、CPU編譯器118、共享存儲器130、圖形處理單元(GPU)180、與GPU180相關(guān)聯(lián)的操作系統(tǒng)(OS)182、GPU專用空間185以及GPU編譯器188。在一個實施例中,OS112可以管理CPU110、CPU專用空間115和共享存儲器130的資源,而OS182可以管理GPU180、GPU專用空間185和共享存儲器130的資源。在一個實施例中,CPU編譯器118和GPU編譯器188可以分別耦合到CPU110和GPU180,或者也可以遠程地被提供在其他平臺或計算機系統(tǒng)上。與CPU110相關(guān)聯(lián)的編譯器118可以為CPU110生成編譯代碼,以及與GPU180相關(guān)聯(lián)的編譯器188可以為GPU180生成編譯代碼。在一個實施例中,CPU編譯器118和GPU編譯器188可以通過對用戶用高級語言(諸如面向?qū)ο笳Z言)提供的對象的一個或多個成員函數(shù)進行編譯來生成編譯代碼。在一個實施例中,編譯器118和188可以促使該對象被存儲在共享存儲器130中,而且共享對象131可以包括被分配給CPU側(cè)110或GPU側(cè)180的成員函數(shù)。在一個實施例中,存儲在共享存儲器130中的共享對象131可以包括成員函數(shù),諸如虛函數(shù)VF133-A至133-K和非虛函數(shù)NVF136-A至136-L。在一個實施例中,CPU110與GPU180之間的雙向通信可由成員函數(shù)(諸如共享對象131的VF133和NVF136)來提供。在一個實施例中,GPU編譯器188可以基于與成員函數(shù)相關(guān)聯(lián)的注釋標簽來將對象131的成員函數(shù)劃分為CPU可執(zhí)行文件和GPU可執(zhí)行文件。在一個實施例中,GPU編譯器188可以將對象131的第一成員函數(shù)分配給GPU180,該第一成員函數(shù)用GPU或第一注釋標簽(#PragmaGPU)來注釋。在一個實施例中,CPU編譯器118可以將對象131的第二成員函數(shù)分配給CPU110,該第二成員函數(shù)用CPU或第二注釋標簽(#PragmaCPU)來注釋。在一個實施例中,GPU編譯器188可以在CPU側(cè)和GPU側(cè)上都生成存根和遠程調(diào)用邏輯和粘結(jié)邏輯,以提供對雙向通信的支持。在其他實施例中,當使用自動技術(shù)時,GPU編譯器188可以通過將CPU和GPUvtable加載到異構(gòu)CPU和GPU平臺中的同一地址處來提供對CPU110與GPU180之間雙向通信的支持。然而,GPUvtable的內(nèi)容可以與CPUvtable的內(nèi)容不同。圖2中描繪了執(zhí)行異構(gòu)處理器(CPU110和GPU180)之間的雙向通信的異構(gòu)平臺100的實施例。在框210,包括可被異構(gòu)處理器共享的成員函數(shù)的對象可以在平臺100中被創(chuàng)建。在一個實施例中,用戶可以用第一或第二注釋標簽來注釋對象131的成員函數(shù),而且這些注釋標簽可由編譯器118和/或188用來創(chuàng)建可被CPU110和GPU180共享的對象的成員函數(shù)。在其他實施例中,編譯器118和188可以被設(shè)計和實施,以便虛成員函數(shù)表可以被存儲在同一存儲器地址中以在不需要用戶介入的情況下創(chuàng)建共享對象。典型地,CPU110和GPU180可以與不同的地址空間、鏈接器和加載器相關(guān)聯(lián),而且所述地址可以被加載到CPU110和GPU180地址域中的不同地址處。上述方法的問題在于CPU110和GPU180的函數(shù)地址沒有被關(guān)聯(lián)在一起。為了克服上述問題,在一個實施例中,可以使用包括函數(shù)地址和函數(shù)表的跳轉(zhuǎn)表。在一個實施例中,跳轉(zhuǎn)表可以用于將CPU110和GPU180這兩側(cè)的函數(shù)地址關(guān)聯(lián)在一起,而且該表可以在加載應(yīng)用程序時被適當?shù)丶虞d。在一個實施例中,可以在創(chuàng)建程序或代碼段時,由用戶將注釋標簽附標在成員函數(shù)上。在一個實施例中,編譯器118和/或188可以檢查與成員函數(shù)相關(guān)聯(lián)的注釋標簽,并之后可以生成針對對象(諸如位于共享存儲器130中的共享對象131)的成員函數(shù)(即虛函數(shù)VF133-A至133-K、非虛函數(shù)NVF136-A至136-L和共享數(shù)據(jù)132)的代碼。在框250中,使能雙向通信,以允許通過共享對象的成員函數(shù)133和136實現(xiàn)異構(gòu)處理器110與180之間的通信。在一個實施例中,GPU編譯器188可以在CPU側(cè)和GPU側(cè)上生成使能邏輯,諸如存根邏輯、遠程調(diào)用邏輯和粘結(jié)邏輯(在圖6中將進一步詳細描述),以便能夠?qū)崿F(xiàn)CPU110與GPU180之間的共享對象131的自然功能劃分。在一個實施例中,存根邏輯、遠程調(diào)用邏輯和粘結(jié)邏輯可以允許第二異構(gòu)處理器(CPU110)調(diào)用被分配給第一異構(gòu)處理器(GPU180)的成員函數(shù)。類似地,使能邏輯可以允許第一異構(gòu)處理器(GPU180)調(diào)用被分配給第二異構(gòu)處理器(CPU110)的成員函數(shù)。在一個實施例中,異構(gòu)處理器110與180之間的這種雙向通信可以提供異構(gòu)處理器之間的細粒度計算。CPU110與GPU180之間的雙向通信的一些說明在下面的圖8、9、12和13中示出。圖3中示出了能夠?qū)崿F(xiàn)雙向通信的平臺300的實施例,在平臺300中,CPU110與傳統(tǒng)編譯器相關(guān)聯(lián),而GPU180與專用編譯器相關(guān)聯(lián)。在一個實施例中,CPU110可以與(PU傳統(tǒng)編譯器310相關(guān)聯(lián),而GPU180可以與GPU專用編譯器320相關(guān)聯(lián)。在一個實施例中,CPU傳統(tǒng)編譯器310可以包括由獨立軟件銷售商(ISV)提供的編譯器,而GPU專用編譯器320可以包括由GPU制造商提供的編譯器。CPU傳統(tǒng)編譯器310可以編譯CPU側(cè)代碼,而且這種CPU傳統(tǒng)編譯器可以提供最小的控制和靈活性。為了克服與CPU傳統(tǒng)編譯器310相關(guān)的局限性,GPU專用編譯器320可以提供用于支持CPU110與GPU180之間的雙向通信的靈活性。在一個實施例中,GPU專用編譯器320可以創(chuàng)建包括CPU存根、CPU側(cè)遠程調(diào)用API和GPU側(cè)粘結(jié)邏輯的第一使能通路以及包括GPU存根、GPU側(cè)遠程調(diào)用API和CPU側(cè)粘結(jié)邏輯的第二使能通路,以在CPU110與GPU180之間提供雙向通信。第一使能通路和第二使能通路的創(chuàng)建和操作在下面的圖5的框570和580以及圖6的描述中描述。圖4示出了能夠?qū)崿F(xiàn)雙向通信的平臺400的實施例,在平臺400中,CPU110和GPU180都與專用編譯器相關(guān)聯(lián)。在一個實施例中,CPU110可以與CPU專用編譯器410相關(guān)聯(lián),而GPU180可以與GPU專用編譯器320相關(guān)聯(lián)。在一個實施例中,CPU專用編譯器410和GPU專用編譯器320可以包括分別由CPU和GPU的制造商所提供的編譯器。在一個實施例中,專用編譯器410和320可以提供用于支持平臺100的異構(gòu)處理器之間的雙向通信的更高的靈活性。參照這樣的場景繼續(xù)進行描述,即CPU110與CPU傳統(tǒng)編譯器310相關(guān)聯(lián),而且修改CPU傳統(tǒng)編譯器310以支持CPU110與GPU180之間的雙向通信的靈活性是最小的。然而,上面參照圖3中的平臺300所討論的技術(shù)可以容易地應(yīng)用到其他場景中,包括圖4中的平臺400中。在圖5的流程圖中示出了可以在CPU110與GPU180之間提供雙向通信的平臺300的實施例。在框510中,用戶可以使用第一注釋標簽或GPU注釋標簽來注釋可以被分配給GPU180的對象131的第一成員函數(shù)(例如,VF133-A和133-D,以及NVF136-A和136-B)。在一個實施例中,第一成員函數(shù)可以在代碼開發(fā)階段期間被注釋,其中在該代碼開發(fā)階段中可以對對象進行定義。在一個實施例中,對象131可以包括虛函數(shù)VF133-A至133-K和非虛函數(shù)NVF136-A至136-L的至少第一子集(稱為第一成員函數(shù)),而且第一成員函數(shù)可以使用第一注釋標簽進行注釋。在一個實施例中,第一成員函數(shù)可以使用第一注釋標簽(#PragmaGPU)進行注釋。在框520中,用戶可以使用第二注釋標簽或CPU注釋標簽來注釋可以被分配給CPU110的對象131的對象的第二成員函數(shù)(例如,VF133-B和133-K以及NVF136-C和136-D)。在一個實施例中,第二成員函數(shù)可以在代碼開發(fā)階段期間被注釋,其中在該代碼開發(fā)階段中可以對對象的類進行定義。在一個實施例中,第二成員函數(shù)可以使用第二注釋標簽(#PragmaWrapper)進行注釋。在框540中,CPU傳統(tǒng)編譯器310和GPU專用編譯器320可以分別生成第一編譯代碼和第二編譯代碼。在一個實施例中,可以分別通過編譯第一成員函數(shù)(例如,VF133-A和133-D以及NVF136-A和136-B)和第二成員函數(shù)(例如,VF133-B和133-K以及NVF136-C和136-D)來生成第一編譯代碼和第二編譯代碼。在一個實施例中,GPU專用編譯器320可以通過編譯第一成員函數(shù)來生成第一編碼代碼,其中第一成員函數(shù)用第一注釋標簽(#PragmaGPU)進行注釋。然而,CPU110可以使用雙向通信技術(shù)調(diào)用第一成員函數(shù)。在一個實施例中,CPU傳統(tǒng)編譯器310可以通過編譯第二成員函數(shù)來生成第二編碼代碼,其中第二成員函數(shù)用第二注釋標簽(#PragmaWrapper)進行注釋。然而,GPU180可以使用雙向通信技術(shù)調(diào)用第二成員函數(shù)。在框560中,GPU專用編譯器320可以針對用第一或GPU注釋標簽注釋的第一成員函數(shù)而在第二處理器(CPU)側(cè)上生成CPU或第二遠程調(diào)用存根以及在第一處理器(GPU)側(cè)上生成GPU或第一粘結(jié)邏輯。在框580中,GPU專用編譯器320可以針對第二成員函數(shù)而在第一處理器(GPU)側(cè)上生成GPU或第一遠程調(diào)用存根以及在第二處理器(CPU)側(cè)上生成CPU或第二粘結(jié)邏輯。圖6示出了由通過可以被異構(gòu)處理器共享的對象的成員函數(shù)來支持CPU110與GPU180之間的雙向通信的平臺100所使用的流程圖的實施例。在一個實施例中,GPU專用編譯器320可以在CPU側(cè)110上生成GPU注釋的函數(shù)610的CPU存根和CPU遠程調(diào)用API620。而且,GPU專用編譯器320可以針對第一成員函數(shù)在GPU側(cè)180上生成GPU注釋的函數(shù)630的GPU側(cè)粘結(jié)邏輯。在一個實施例中,CPU110可以使用第一通路的第一使能通路(包括存根邏輯610、API620和粘結(jié)邏輯630)來調(diào)用第一成員函數(shù)。在一個實施例中,第一使能通路可以允許CPU110建立與GPU側(cè)180的遠程調(diào)用,并將信息從CPU側(cè)110傳送到GPU側(cè)180。在一個實施例中,GPU側(cè)粘結(jié)邏輯630可以允許GPU180接收從CPU側(cè)110傳送的信息。在一個實施例中,CPU存根610可以包括與第一成員函數(shù)(即原始GPU成員函數(shù))相同的名稱,但是可以封閉API620以將來自CPU110的調(diào)用指向GPU180。在一個實施例中,用戶代碼可以和其初衷一樣調(diào)用第一成員函數(shù),但是該調(diào)用可以被重新指向CPU存根610和遠程調(diào)用API620。而且,當進行遠程調(diào)用時,CPU存根610可以發(fā)送表示第一成員函數(shù)正在被調(diào)用的唯一名稱以及指向共享對象和被調(diào)用的第一成員函數(shù)的其他變元的指針。在一個實施例中,GPU側(cè)粘結(jié)邏輯630可以接收所述變元并派遣第一成員函數(shù)調(diào)用。在一個實施例中,GPU專用編譯器320可以生成粘結(jié)邏輯(或派遣器),其可以通過用作為第一參數(shù)而被傳遞的對象指針來調(diào)用第一成員函數(shù)的GPU側(cè)函數(shù)地址來派遣非虛函數(shù)。在一個實施例中,GPU專用編譯器320可以在GPU側(cè)上生成用于注冊GPU側(cè)粘結(jié)邏輯630的跳轉(zhuǎn)表注冊調(diào)用,以使得CPU存根610能夠與GPU側(cè)粘結(jié)邏輯630進行通信。在一個實施例中,GPU專用編譯器320可以為被分配給CPU110的第二成員函數(shù)創(chuàng)建第二使能通路,其包括針對CPU注釋的函數(shù)660的GPU存根、GPU側(cè)180上的GPU遠程調(diào)用API670和針對CPU注釋的函數(shù)680的CPU側(cè)粘結(jié)邏輯。在一個實施例中,GPU180可以使用第二使能通路來對CPU側(cè)110進行調(diào)用。在一個實施例中,GPU存根660和API670可以允許GPU180建立與CPU側(cè)180的遠程調(diào)用,并從GPU側(cè)180向CPU側(cè)110傳遞信息。在一個實施例中,CPU側(cè)粘結(jié)邏輯680可以允許CPU180接收從GPU側(cè)110傳送的信息。在一個實施例中,為了支持第二成員函數(shù)調(diào)用,GPU專用編譯器320可以生成針對CPU側(cè)粘結(jié)邏輯680的跳轉(zhuǎn)表注冊。在一個實施例中,第二成員函數(shù)的CPU側(cè)函數(shù)地址可以在CPU粘結(jié)邏輯680中被調(diào)用。在一個實施例中,由CPU粘結(jié)邏輯680生成的代碼可以與由CPU傳統(tǒng)編譯器310所生成的其他代碼相鏈接。這種方法可以提供用于支持異構(gòu)處理器110與180之間的雙向通信的通路。在一個實施例中,CPU存根邏輯610和CPU側(cè)粘結(jié)邏輯680可以經(jīng)由CPU鏈接器690耦合到CPU110。在一個實施例中,CPU鏈接器690可以通過使用CPU存根610、CPU側(cè)粘結(jié)邏輯680和由CPU傳統(tǒng)編譯器310所生成的其他代碼來生成CPU可執(zhí)行文件695。在一個實施例中,GPU存根邏輯660和GPU側(cè)粘結(jié)邏輯670可以經(jīng)由GPU鏈接器640耦合到GPU180。在一個實施例中,GPU鏈接器640可以通過使用GPU粘結(jié)邏輯530、GPU存根660和由GPU專用編譯器320所生成的其他代碼來生成GPU可執(zhí)行文件645。與面向?qū)ο笳Z言的虛函數(shù)相關(guān)的另一問題是缺乏動態(tài)的方法來識別用于調(diào)用共享對象的虛遠程成員函數(shù)的適當遠程函數(shù)地址。為了克服上述問題,下面描述將共享對象131與GPU側(cè)(180)vtable相關(guān)聯(lián)的實施例,其中GPU側(cè)vtable繼而在GPUvtable中提供適當?shù)腉PU函數(shù)地址。CPU傳統(tǒng)編譯器310可以包括針對它的對象布局的隱藏指針(pCPUvptr),而且pCPUvptr可以指向CPUvtable,其中CPUvtable可以包括CPU/wrapper/GPU存根虛函數(shù)。在一個實施例中,GPU專用編譯器320可以包括GPUvtable,其中GPUvtable可以包括GPU/wrapper存根虛函數(shù)。在一個實施例中,如果共享對象131與GPUvtable相關(guān)聯(lián),適當?shù)腉PU函數(shù)地址(其是GPUvtable的入口)可以被識別。在一個實施例中,可以通過將新的指針(pGPUvptr)并入類聲明中來建立這種關(guān)聯(lián)。在一個實施例中,可以在構(gòu)建對象131時通過調(diào)用運行時間API以獲得GPU側(cè)vtable地址,來對新的指針(pGPUvptr)進行初始化。在一個實施例中,倉Il建對象131與GPUvtable之間的關(guān)聯(lián)的任務(wù)可以通過使用用戶并入的聲明和初始化宏(諸如(constvoid*constpGPUvptr))來執(zhí)行。在一個實施例中,所述宏可以聲明指向GPU側(cè)虛函數(shù)表(GPUvtable)的指針,而且可以用共享存儲器分配/釋放運行時間調(diào)用來覆蓋新/刪除操作符??梢员淮鎯υ诠蚕泶鎯ζ?30中的對象131及其存儲器布局的實施例在圖7A、7B和7C中示出。在一個實施例中,對象“A”(諸如對象131)可以包括整型變量“inta”和“intb”以及CPU側(cè)函數(shù)“VirtualVoidfoo()”和GPU側(cè)函數(shù)“#PragmaGPUVirtualvoidbar()”,如圖7A所示。在一個實施例中,如圖7B所示,對象A(或?qū)ο?31)的布局可以包括兩個指針和用于存儲整型變量“a”和“b”的存儲空間,所述兩個指針包括(l)pCPUVptr,該指針可以指向包括CPU側(cè)110中的地址foo和bar_stub的vtable;以及(2)pGPUVptr,該指針可以指向包括GPU側(cè)180中的地址bar的vtable。如圖7C所示,在一個實施例中,pCPUVptr可以指向包括CPU側(cè)110中的地址foo和bar_stub的CPUVtable,該CPUVtable可以位于開始地址’0xa0000’處。在一個實施例中,指向CPUVtable的指針(pCPUVptr)可以是隱藏的并且可以默認地指向CPUVtable。在一個實施例中,pGPUVptr可以指向包括GPU側(cè)180中的地址bar()的GPUVtable,該GPUVtable可以位于開始地址’0Xb0000’處。在一個實施例中,指向GPUVtable的指針(pGPUVptr)可以由用戶并入代碼中,這創(chuàng)建了對象131與GPUVtable之間的關(guān)聯(lián)。圖8示出了其中通過使用用戶介入技術(shù)而由CPU側(cè)110按實際調(diào)用GPU虛函數(shù)和GPU非虛函數(shù)的流程圖800的實施例???10被示出為包括標題為foo()的類實例或?qū)ο?,其包括用戶并入的聲明constvoid*constpGPUVptr、隱藏指針pCPUVptr以及對虛函數(shù)(例如,VF133-A)’VirtualvoidSomeVirtuFunc()’和非虛函數(shù)(例如,NVF136-A)’voidSomeNonVirtuFunc()’進行注釋的注釋標簽#PragmaGPU。在一個實施例中,’pFoo’可以指向類FooO的共享對象131,而且遠程虛函數(shù)調(diào)用可以從CPU側(cè)110到GPU側(cè)180而被完成。在一個實施例中,’pFoo=newFoo();’可以用共享存儲器分配/釋放運行時間調(diào)用來覆蓋新/刪除操作符。在一個實施例中,響應(yīng)于編譯框810中的’pFoo—SomeVirtuFunc()’,(PU傳統(tǒng)編譯器310可以發(fā)起在框820中描繪的任務(wù)。在框820中,CPU側(cè)110可以調(diào)用GPU虛函數(shù)。在框830中,CPU側(cè)存根(針對GPU成員函數(shù))610和API620可以向GPU側(cè)180發(fā)送信息(變元)。在框840中,GPU側(cè)粘結(jié)邏輯(針對GPU成員函數(shù))630可以從THIS對象中獲得PGPUVptr而且可以找到GPUvtable。在框850中,GPU側(cè)粘結(jié)邏輯640可以從GPUvtable中獲得函數(shù)地址并推送參數(shù)和調(diào)用該地址。在一個實施例中,響應(yīng)于編譯框810中的#PragmaGPU’voidSomeVirtuFunc()’,GPU專用編譯器320可以生成用于使用’pFoo—SomeNonVirtuFunc()’來發(fā)起在框870中描繪的任務(wù)的代碼。在框870中,CPU側(cè)110可以調(diào)用GPU非虛函數(shù)。在框880中,CPU側(cè)存根(針對GPU成員函數(shù))610和API620可以向GPU側(cè)180發(fā)送信息(變元)。在框890中,GPU側(cè)粘結(jié)邏輯(針對GPU成員函數(shù))630可以在函數(shù)地址已經(jīng)被知道的情況下推送參數(shù)并直接調(diào)用所述地址。圖9示出了其中通過使用用戶介入技術(shù)而由GPU側(cè)180調(diào)用CPU虛函數(shù)和CPU非虛函數(shù)的流程圖900的實施例???10被示出為包括標題為foo()的類實例或?qū)ο?,其包括用戶并入的聲明constvoid*constpGPUVptr、隱藏指針pCPUVptr以及對虛函數(shù)(例如,VF133-A)'VirtualvoidSomeVirtuFunc()'和非虛函數(shù)(例如,NVF136-A)’voidSomeNonVirtuFunc()’進行注釋的注釋標簽#PragmaWrapper。在一個實施例中,’pFoo’可以指向類FooO的共享對象131,而且遠程虛函數(shù)調(diào)用可以從GPU側(cè)180到CPU側(cè)110而被完成。在一個實施例中,響應(yīng)于編譯框910中的#PragmaWrapper’VirtualvoidSomeVirtuFunc()’,GPU專用編譯器320可以生成用于使用’pFoo—SomeVirtuFunc()’來發(fā)起在框920中描繪的任務(wù)的代碼。在框920中,GPU側(cè)180可以調(diào)用Wrapper虛函數(shù)。在框930中,GPU側(cè)存根(針對Wrapper成員函數(shù))660和API670可以向CPU側(cè)110發(fā)送信息(變元)。在框940中,CPU側(cè)粘結(jié)邏輯(針對Wrapper成員函數(shù))680可以從THIS對象中獲得隱藏指針(PCPUVptr)而且可以找到CPUvtable。在框950中,CPU側(cè)粘結(jié)邏輯680可以從CPUvtable中獲得函數(shù)地址并推送參數(shù)和調(diào)用該地址。在一個實施例中,響應(yīng)于編譯框910中的#PragmaWrapper’voidSomeVirtuFunc()’,GPU專用編譯器320可以生成用于使用’pFoo—SomeNonVirtuFunc()’來發(fā)起在框970中描繪的任務(wù)的代碼。在框970中,GPU側(cè)180可以調(diào)用Wrapper非虛函數(shù)。在框980中,GPU側(cè)存根(針對Wrapper成員函數(shù))660和API670可以向CPU側(cè)110發(fā)送信息(變元)。在框990中,CPU側(cè)粘結(jié)邏輯(針對WrapperU成員函數(shù))680可以在函數(shù)地址已經(jīng)被知道的情況下推送參數(shù)并直接調(diào)用所述地址。圖10示出了可以通過使用自動技術(shù)而在異構(gòu)處理器之間支持雙向通信的平臺100的實施例。在使用自動技術(shù)時,GPU專用編譯器320、GPU鏈接器/加載器640和CPU鏈接器/加載器690可以被實施,以便CPU和GPU虛函數(shù)表(vtable)的地址可以被加載到異構(gòu)CPU和GPU平臺的同一地址處。在框1010,GPU專用編譯器320可以生成針對共享類vtable的第一CPU對象文件(first_obj_file)。在一個實施例中,GPU專用編譯器320可以生成關(guān)于確定對象在CPU110與GPU180之間被共享的代碼。在框1020,GPU專用編譯器320可以在對象文件的專用部分(即.VtGPU)中存儲這種共享類vtable。在框1030中,GPU專用編譯器320可以將由CPU傳統(tǒng)編譯器310生成的第二CPU對象文件(860011(1_013」_打16)與由GPU專用編譯器320所生成的第一CPU對象文件(first_obj_file)相鏈接。構(gòu)建設(shè)施的模板(即建立文件或項目文件)可以被布置,以使(由GPU編譯器生成的)first_obj_files先于(由CPU編譯器生成的)second_obj_files。在框1040中,CPU鏈接器690可以通過使用由GPU專用編譯器320生成的vtable而非由CPU傳統(tǒng)編譯器310所生成的vtable來生成最終的CPU可執(zhí)行文件。為了確保由GPU專用編譯器320所生成的vtable被放置在專用部分中的毗鄰部分中,GPU專用編譯器320可以向由GPU專用編譯器320所生成的CPU側(cè)vtable附著諸如COMDAT屬性之類的屬性。由CPU傳統(tǒng)編譯器310生成的CPU側(cè)vtable可以已經(jīng)與諸如COMDAT屬性之類的屬性相關(guān)聯(lián)。在一個實施例中,如果COMDAT符號在不止一個對象文件中被定義,則GPU鏈接器/加載器640可以選擇在其中一個對象文件中的COMDAT符號,而且可以忽略剩余對象文件。在一個實施例中,在排除由CPU傳統(tǒng)編譯器310生成的CPUvtable時,鏈接順序可以被布置,以便由GPU專用編譯器320生成的CPUvtable可以被包括在最終的可執(zhí)行文件中。在框1050中,由于first_obj_file具有相同名稱VtGPU,所以CPU鏈接器/加載器690可以在CPU可執(zhí)行文件中的一個毗鄰部分處收集由GPU專用編譯器320所生成的vtable。在框1060中,由CPU鏈接器/加載器690支持的運行時間庫可以分配用于識別專用部分(VtGPU)的開始和結(jié)束的符號/變量(boundary_var)。例如,在Windows上,可以在部分.VtGPUSA中定義部分開始符號,而且鏈接器/加載器690可以在專用部分.VtGPU的開始處使用開始符號.VtGPUSA0在框1070中,運行時間庫可以使用開始符號來獲取專用部分.VtGPU的開始地址。在框1080中,GPU側(cè)鏈接器/加載器640可以調(diào)整GPU可執(zhí)行文件基地址,以便GPUvtable部分也可以位于同一地址處。在一個實施例中,上面的動作對用戶而言可以是不可見的,而且用戶不可以為了在CPU與LRB之間共享這種對象而改變類定義中的任何內(nèi)容。在一個實施例中,上面的動作(或任務(wù))可以由編譯器、鏈接器或加載器塊中的一者或多者來執(zhí)行??梢员淮鎯υ诠蚕泶鎯ζ?30中的對象131及其存儲器布局的實施例在圖11中示出。在一個實施例中,對象“B”(諸如對象131)可以包括整型變量“inta”和“intb”以及CPU側(cè)函數(shù)“VirtualVoidfoo()”和GPU側(cè)函數(shù)“#PragmaGPUVirtualvoidbar()v,如圖11所示。在一個實施例中,如圖IlB所示,對象B(或?qū)ο?31)的布局可以包括單個指針(pCPUVptr)和用于存儲整型變量’a’和’b’的存儲空間,其中該單個指針可以指向CPU側(cè)110中的地址foo和bar_stub。如可以指出的,圖IlB中的存儲器布局可以包括僅一個指針(pCPUVptr),該指針可以既指向CPUvtable又指向GPUvtable。如圖IlC所示,在一個實施例中,pCPUVptr可以指向包括CPU側(cè)110中的地址foo和bar_stub的CPUvtable,該CPUvtable可以位于開始地址’0xa0000’處。在一個實施例中,指向CPUVtable的指針(pCPUVptr)可以是隱藏的并且可以默認地指向CPUVtable。在一個實施例中,pCPUVptr可以指向也位于同一地址’0xa0000’處的GPUvtable。然而,初始GPUvtable可以位于不同的地址處,諸如’OxbOOOO'。作為GPU鏈接器/加載器640調(diào)整(圖10中的框1080)GPU可執(zhí)行文件基地址的結(jié)果,GPUvtable部分也可以位于同一地址’0xa0000’處。然而,CPUvtable的內(nèi)容和GPUvtable的內(nèi)容可以不同(例如,CPUvtable包括地址foo和bar_stub,而GPUvtable包括地址bar),雖然CPUvtable和GPUvtable的地址可以是相同的。在一個實施例中,上面的動作可以由編譯器、鏈接器或加載器塊中的一者或多者執(zhí)行,而且所述動作也可以在不需用戶介入的情況下被執(zhí)行。圖12示出了其中通過使用自動技術(shù)而由CPU側(cè)110按實際調(diào)用GPU虛函數(shù)和GPU非虛函數(shù)的流程圖1200的實施例。在一個實施例中,流程圖1200可以與圖8中的流程圖800基本類似。然而,流程圖1200與800的不同之處在于,可以不需要用戶并入宏,而上面描述的用戶介入技術(shù)中則需要。結(jié)果,與圖8中的框810相比,框1210可以不包括宏constvoid*constpGPUVptr。如上所述,將CPU和GPU虛函數(shù)表(vtable)的地址加載到異構(gòu)CPU和GPU平臺中的同一地址處的任務(wù)可以由編譯器和鏈接器/加載器塊執(zhí)行,而不需要用戶介入。圖13示出了其中通過使用自動技術(shù)而由GPU側(cè)180調(diào)用CPU虛函數(shù)和CPU非虛函數(shù)的流程圖1300的實施例。在一個實施例中,流程圖1300可以與圖9中的流程圖900基本類似。然而,流程圖1300與900的不同之處在于,可以不需要用戶并入宏,而上面描述的用戶介入技術(shù)中則需要。結(jié)果,與圖9中的框910相比,框1310可以不包括宏constvoid*constpGPUVptr。如上所述,將CPU和GPU虛函數(shù)表(vtable)的地址加載到異構(gòu)CPU和GPU平臺中的同一地址處的任務(wù)可以由編譯器和鏈接器/加載器塊執(zhí)行,而不需要用戶介入。圖14示出包括異構(gòu)處理器的、用于支持雙向通信的計算機系統(tǒng)1400的實施例。參照圖14,計算機系統(tǒng)1400可以包括包含單指令多數(shù)據(jù)(SMD)處理器的通用處理器(或CPU)1402以及圖形處理單元(GPU)1405。在一個實施例中,CPU1402可以執(zhí)行除了執(zhí)行各種其他任務(wù)之外的增強操作,或者在機器可讀存儲介質(zhì)1425中存儲指令序列以提供增強操作。然而,該指令序列也可以存儲在CPU專用存儲器1420中或存儲在任何其他適當?shù)拇鎯橘|(zhì)中。在一個實施例中,CPU1402可以與CPU傳統(tǒng)編譯器1403以及CPU鏈接器/加載器1404相關(guān)聯(lián)。在一個實施例中,GPU1405可以與GPU專用編譯器1406以及GPU鏈接器/加載器1407相關(guān)聯(lián)。雖然圖14中描繪了分離的圖形處理單元GPU1405,但是在一些實施例中,作為另一示例,處理器1402可以用于執(zhí)行增強操作。操作計算機系統(tǒng)1400的處理器1402可以是耦合到邏輯1430的一個或多個處理器核心。邏輯1430可以耦合到一個或多個I/O設(shè)備1460,所述I/O設(shè)備1460可以提供到計算機系統(tǒng)1400的接口。在一個實施例中,邏輯1430例如可以是芯片組邏輯。邏輯1430耦合到存儲器1420,存儲器1420可以是任意類型的存儲設(shè)備,包括光、磁或者半導(dǎo)體存儲設(shè)備。圖形處理單元1405通過幀緩沖器耦合到顯示器1440。在一個實施例中,當使用用戶介入技術(shù)時,共享對象131可以在第一側(cè)(即CPU1402)上被分配并之后在第二側(cè)(即GPU1408)上被使用,以便GPU可以調(diào)用共享對象的成員函數(shù)。在個實施例中,用戶可以促使對象(對象131)被存儲在共孚存儲器中,并之后向CPU1402或GPU1405中的其中一者分配成員函數(shù)。在一個實施例中,GPU編譯器1406可以在編譯對象時識別與成員函數(shù)相關(guān)聯(lián)的注釋標簽。在一個實施例中,用戶可以添加用于分別聲明和初始化指向虛函數(shù)表(vtable)的指針的宏。在一個實施例中,GPU編譯器1406可以編譯對象并生成針對用第一注釋值注釋的成員函數(shù)的代碼。GPU編譯器1406可以生成針對GPU成員函數(shù)的CPU存根610,而且CPU側(cè)遠程調(diào)用存根610可以在與用CPU傳統(tǒng)編譯器1403構(gòu)建的其他用戶代碼鏈接之后替換GPU成員函數(shù)的初始定義。在一個實施例中,GPU編譯器1406可以生成用于從CPU側(cè)派遣遠程GPU成員函數(shù)調(diào)用的GPU側(cè)粘結(jié)邏輯630。在一個實施例中,GPU編譯器1406可以生成GPU存根660、遠程調(diào)用API670和用于從GPU側(cè)派遣CPU成員函數(shù)調(diào)用的CPU側(cè)粘結(jié)邏輯680。在其他實施例中,在使用自動技術(shù)時,GPU專用編譯器1406可以將GPU虛函數(shù)表(vtable)加載到與異構(gòu)CPU和GPU平臺中的CPUvtable地址相同的地址處。在一個實施例中,GPU編譯器1406可以生成針對共享類vtable的CPU對象文件(first_obj_files),并將這種共享類vtable存儲在對象文件的專用部分(S卩.VtGPU)中。CPU編譯器1403可以生成CPU對象文件(second_obj_files),該CPU對象文件可以與由GPU編譯器生成的CPU對象文件(first_obj_files)相鏈接。構(gòu)建設(shè)施的模板(即建立文件或項目文件)可以被布置,以使(由GPU編譯器生成的)first_obj_files先于(由CPU編譯器生成的)seC0nd_0bj_files。在一個實施例中,CPU鏈接器/加載器1404可以通過使用GPU編譯器生成的GPUvtable代碼(其可以是例如C0MDATA符號)而非由CPU編譯器生成的CPUvtable代碼來生成最終的CPU可執(zhí)行文件。由于first_obj_files具有相同名稱.VtGPU,所以GPU鏈接器/加載器1407可以在CPU可執(zhí)行文件中的一個毗鄰部分處收集GPUvtable代碼。在一個實施例中,為了識別該專用部分(.VtGPU)的邊界,運行時間庫可以分配用于獲知.VtLRB部分的開始和結(jié)束的變量(boundary_Var)。運行時間庫可以使用開始符號來識別專用部分.VtGPU的開始地址。在識別了該部分的開始地址后,GPU鏈接器/加載器1407可以調(diào)整GPU可執(zhí)行文件基地址,以便GPUvtable部分也可以位于同一地址處。本文描述的圖形處理技術(shù)可以在各種硬件架構(gòu)中實施。例如,可以將圖形功能集成到芯片組中??商鎿Q地,可以使用分立的圖形處理器。作為再一實施例,圖形功能可以由包含多核處理器的通用處理器來實施,或者被實施為存儲在機器可讀介質(zhì)中的軟件指令集。權(quán)利要求1.一種計算機平臺中的方法,包括創(chuàng)建能夠由多個異構(gòu)處理器訪問的共享對象,所述多個異構(gòu)處理器包括第一處理器和第二處理器,其中所述共享對象能夠包括第一成員函數(shù)和第二成員函數(shù),將所述第一成員函數(shù)分配給第一處理器并將所述第二成員函數(shù)分配給第二處理器,以及允許所述第一處理器調(diào)用所述第二成員函數(shù),并允許所述第二處理器調(diào)用所述第一成員函數(shù),其中所述第一處理器調(diào)用所述第二成員函數(shù)和所述第二處理器調(diào)用所述第一成員函數(shù)提供了所述第一處理器與所述第二處理器之間的雙向通信。2.根據(jù)權(quán)利要求I所述的方法,其中,所述第一成員函數(shù)和所述第二成員函數(shù)包括虛函數(shù)。3.根據(jù)權(quán)利要求2所述的方法,還包括將所述第一成員函數(shù)與第一注釋值相關(guān)聯(lián)以將所述第一成員函數(shù)分配給所述第一處理器,以及將所述第二成員函數(shù)與第二注釋值相關(guān)聯(lián)以將所述第二成員函數(shù)分配給所述第二處理器。4.根據(jù)權(quán)利要求3所述的方法,還包括生成用于允許所述第一處理器調(diào)用所述第二成員函數(shù)的第一使能通路,其中所述第一使能通路包括與所述第二處理器相關(guān)聯(lián)的第二遠程調(diào)用存根和與所述第一處理器相關(guān)聯(lián)的第一粘結(jié)邏輯,其中所述第二遠程調(diào)用存根和所述第一粘結(jié)邏輯是通過與所述第一處理器相關(guān)聯(lián)的編譯器生成的。5.根據(jù)權(quán)利要求4所述的方法,還包括生成用于允許所述第二處理器調(diào)用所述第一成員函數(shù)的第二使能通路,其中所述第二使能通路包括與所述第一處理器相關(guān)聯(lián)的第一遠程調(diào)用存根和與所述第二處理器相關(guān)聯(lián)的第二粘結(jié)邏輯,其中所述第一遠程調(diào)用存根和所述第二粘結(jié)邏輯是通過與所述第一處理器相關(guān)聯(lián)的所述編譯器生成的。6.根據(jù)權(quán)利要求3所述的方法,還包括使用第一宏函數(shù)來聲明指向所述第一處理器的虛函數(shù)表的指針,以及使用第二宏函數(shù)初始化指向所述第一處理器的所述虛函數(shù)表的所述指針。7.根據(jù)權(quán)利要求6所述的方法,其中,所述第一宏函數(shù)用于用共享存儲器分配來覆蓋新操作符并釋放運行時間調(diào)用,而且所述第二宏用于用恰當?shù)倪\行時間調(diào)用來初始化指向所述第一處理器的虛函數(shù)表的所述指針。8.根據(jù)權(quán)利要求I所述的方法,包括將所述第一處理器和所述第二處理器的虛函數(shù)表加載到同一地址處,而不需要用戶介入。9.根據(jù)權(quán)利要求8所述的方法,還包括使用所述第一編譯器生成針對所述共享對象的虛函數(shù)表的第一對象文件,使用與所述第二處理器相關(guān)聯(lián)的第二編譯器生成針對所述共享對象的虛函數(shù)表的第二對象文件,以及將所述第一對象文件與所述第二對象文件相鏈接。10.根據(jù)權(quán)利要求9所述的方法,包括將所述虛函數(shù)表存儲在對象文件的一部分中。11.根據(jù)權(quán)利要求10所述的方法,包括在生成所述第二處理器的第二可執(zhí)行文件時,使用由所述第一處理器所生成的虛函數(shù)表而非使用由所述第二處理器所生成的虛函數(shù)表。12.根據(jù)權(quán)利要求11所述的方法,包括將由所述第一處理器生成的虛函數(shù)表布置在先于由所述第二處理器生成的虛函數(shù)表的所述第二可執(zhí)行文件的毗鄰位置中。13.根據(jù)權(quán)利要求10所述的方法,包括調(diào)整由所述第一處理器生成的第一可執(zhí)行文件的基地址,以促使由所述第一處理器生成的虛函數(shù)表位于與所述第二可執(zhí)行文件相同的位置處。14.根據(jù)權(quán)利要求13所述的方法,包括識別所述部分的開始地址并獲取所述部分的所述開始地址。15.一種包括多個指令的機器可讀存儲介質(zhì),響應(yīng)于所述多個指令被執(zhí)行而使處理器執(zhí)行以下步驟創(chuàng)建能夠由多個異構(gòu)處理器訪問的共享對象,所述多個異構(gòu)處理器包括第一處理器和第二處理器,其中所述共享對象能夠包括第一成員函數(shù)和第二成員函數(shù),將所述第一成員函數(shù)分配給第一處理器并將所述第二成員函數(shù)分配給第二處理器,以及允許所述第一處理器調(diào)用所述第二成員函數(shù),并允許所述第二處理器調(diào)用所述第一成員函數(shù),其中所述第一處理器調(diào)用所述第二成員函數(shù)和所述第二處理器調(diào)用所述第一成員函數(shù)提供了所述第一處理器與所述第二處理器之間的雙向通信。16.根據(jù)權(quán)利要求15所述的機器可讀存儲介質(zhì),其中,所述第一成員函數(shù)和所述第二成員函數(shù)包括虛函數(shù)。17.根據(jù)權(quán)利要求16所述的機器可讀存儲介質(zhì),還包括將所述第一成員函數(shù)與第一注釋值相關(guān)聯(lián)以將所述第一成員函數(shù)分配給所述第一處理器,以及將所述第二成員函數(shù)與第二注釋值相關(guān)聯(lián)以將所述第二成員函數(shù)分配給所述第二處理器。18.根據(jù)權(quán)利要求17所述的機器可讀存儲介質(zhì),還包括生成用于允許所述第一處理器調(diào)用所述第二成員函數(shù)的第一使能通路,其中所述第一使能通路包括與所述第二處理器相關(guān)聯(lián)的第二遠程調(diào)用存根和與所述第一處理器相關(guān)聯(lián)的第一粘結(jié)邏輯,其中所述第二遠程調(diào)用存根和所述第一粘結(jié)邏輯是通過與所述第一處理器相關(guān)聯(lián)的編譯器生成的。19.根據(jù)權(quán)利要求18所述的機器可讀存儲介質(zhì),還包括生成用于允許所述第二處理器調(diào)用所述第一成員函數(shù)的第二使能通路,其中所述第二使能通路包括與所述第一處理器相關(guān)聯(lián)的第一遠程調(diào)用存根和與所述第二處理器相關(guān)聯(lián)的第二粘結(jié)邏輯,其中所述第一遠程調(diào)用存根和所述第二粘結(jié)邏輯是通過與所述第一處理器相關(guān)聯(lián)的所述編譯器生成的。20.根據(jù)權(quán)利要求17所述的機器可讀存儲介質(zhì),還包括使用第一宏函數(shù)來聲明指向所述第一處理器的虛函數(shù)表的指針,以及使用第二宏函數(shù)初始化指向所述第一處理器的所述虛函數(shù)表的所述指針。21.根據(jù)權(quán)利要求20所述的機器可讀存儲介質(zhì),其中,所述第一宏函數(shù)用于用共享存儲器分配來覆蓋新操作符并釋放運行時間調(diào)用,而且所述第二宏用于用恰當?shù)倪\行時間調(diào)用來初始化指向所述第一處理器的虛函數(shù)表的所述指針。22.根據(jù)權(quán)利要求15所述的機器可讀存儲介質(zhì),包括將所述第一處理器和所述第二處理器的虛函數(shù)表加載到同一地址處,而不需要用戶介入。23.根據(jù)權(quán)利要求22所述的機器可讀存儲介質(zhì),還包括使用所述第一編譯器生成針對所述共享對象的虛函數(shù)表的第一對象文件,使用與所述第二處理器相關(guān)聯(lián)的第二編譯器生成針對所述共享對象的虛函數(shù)表的第二對象文件,以及將所述第一對象文件與所述第二對象文件相鏈接。24.根據(jù)權(quán)利要求23所述的機器可讀存儲介質(zhì),包括將所述虛函數(shù)表存儲在對象文件的一部分中。25.根據(jù)權(quán)利要求24所述的機器可讀存儲介質(zhì),包括在生成所述第二處理器的第二可執(zhí)行文件時,使用由所述第一處理器生成的虛函數(shù)表而非使用由所述第二處理器生成的虛函數(shù)表。26.根據(jù)權(quán)利要求25所述的機器可讀存儲介質(zhì),包括將由所述第一處理器生成的虛函數(shù)表布置在先于由所述第二處理器生成的虛函數(shù)表的所述第二可執(zhí)行文件的毗鄰位置中。27.根據(jù)權(quán)利要求24所述的機器可讀存儲介質(zhì),包括調(diào)整由所述第一處理器生成的第一可執(zhí)行文件的基地址,以促使由所述第一處理器生成的虛函數(shù)表位于與所述第二可執(zhí)行文件相同的位置處。28.根據(jù)權(quán)利要求27所述的機器可讀存儲介質(zhì),包括識別所述部分的開始地址并獲取所述部分的所述開始地址。29.一種裝置,包括包括第一處理器和第二處理器的多個異構(gòu)處理器,其中所述第一處理器耦合到第一編譯器而所述第二處理器耦合到第二編譯器,其中所述第一編譯器用于創(chuàng)建包括被分配給所述第一處理器的第一虛成員函數(shù)和被分配給所述第二處理器的第二虛成員函數(shù)的共享對象,其中所述第一處理器能夠直接訪問所述第一虛成員函數(shù)并調(diào)用所述第二虛成員函數(shù),其中所述第二處理器能夠直接訪問所述第二虛成員函數(shù)并調(diào)用所述第一虛成員函數(shù),其中所述第一處理器能夠調(diào)用所述第二虛成員函數(shù)而且所述第二處理器能夠調(diào)用所述第一虛成員函數(shù),以提供所述第一處理器與所述第二處理器之間的雙向通信通路。30.根據(jù)權(quán)利要求29所述的裝置,其中,所述第一編譯器用于基于由用戶提供的第一注釋值而將所述第一虛成員函數(shù)關(guān)聯(lián)到所述第一處理器,以及基于由所述用戶提供的第二注釋值而將所述第二虛成員函數(shù)關(guān)聯(lián)到所述第二處理器。31.根據(jù)權(quán)利要求30所述的裝置,其中,所述第一編譯器用于生成與所述第二處理器相關(guān)聯(lián)的第二遠程調(diào)用存根和與所述第一處理器相關(guān)聯(lián)的第一粘結(jié)邏輯,以允許所述第二處理器調(diào)用所述第一虛成員函數(shù)。32.根據(jù)權(quán)利要求30所述的裝置,其中,所述第一編譯器用于生成與所述第一處理器相關(guān)聯(lián)的第一遠程調(diào)用存根和與所述第二處理器相關(guān)聯(lián)的第二粘結(jié)邏輯,以允許所述第一處理器調(diào)用所述第二虛成員函數(shù)。33.根據(jù)權(quán)利要求30所述的裝置,其中,所述第一編譯器用于編譯第一宏函數(shù),用于促使對指向所述第一處理器的虛函數(shù)表的指針的聲明,以及第二宏函數(shù),用于促使對指向所述第一處理器的所述虛函數(shù)表的所述指針的初始化,其中,所述第一宏函數(shù)用于用共享存儲器分配來覆蓋新操作符并釋放運行時間調(diào)用,而且所述第二宏用于用恰當?shù)倪\行時間調(diào)用來初始化指向所述第一處理器的虛函數(shù)表的所述指針。34.根據(jù)權(quán)利要求29所述的裝置,其中,所述第一編譯器用于將所述第一處理器和所述第二處理器的虛函數(shù)表加載到同一地址處,而不需要用戶介入。35.根據(jù)權(quán)利要求34所述的裝置,其中所述第一編譯器用于生成針對所述共享對象的虛函數(shù)表的第一對象文件,所述第二編譯器用于生成針對所述共享對象的虛函數(shù)表的第二對象文件,以及鏈接器耦合到所述第一編譯器,其中所述鏈接器用于將所述第一對象文件和所述第二對象文件相鏈接。36.根據(jù)權(quán)利要求35所述的裝置,其中,所述第一編譯器用于通過使用由所述第一處理器生成的虛函數(shù)表而非通過使用由所述第二處理器生成的虛函數(shù)表來生成所述第二處理器的第二可執(zhí)行文件。37.根據(jù)權(quán)利要求35所述的裝置,其中所述第一編譯器用于將所述虛函數(shù)表存儲在對象文件的一部分中,其中所述第一編譯器用于將所述第一處理器的虛函數(shù)表布置在先于由所述第二處理器生成的虛函數(shù)表的所述第二可執(zhí)行文件的毗鄰位置中。38.根據(jù)權(quán)利要求37所述的裝置,其中,所述第一編譯器用于調(diào)整由所述第一處理器生成的第一可執(zhí)行文件的基地址,以促使由所述第一處理器生成的虛函數(shù)表位于與所述第二可執(zhí)行文件相同的位置處。39.根據(jù)權(quán)利要求38所述的裝置,其中,所述第一編譯器用于在識別到所述部分的開始地址后獲取所述部分的所述開始地址。40.一種系統(tǒng),包括多個輸入輸出設(shè)備,以及計算機平臺,其中所述計算機平臺用于支持包括第一處理器和第二處理器的多個異構(gòu)處理器,其中所述第一處理器耦合到第一編譯器而所述第二處理器耦合到第二編譯器,其中所述第一編譯器用于創(chuàng)建包括被分配給所述第一處理器的第一虛成員函數(shù)和被分配給所述第二處理器的第二虛成員函數(shù)的共享對象,其中所述第一處理器能夠直接訪問所述第一虛成員函數(shù)并調(diào)用所述第二虛成員函數(shù),其中所述第二處理器能夠直接訪問所述第二虛成員函數(shù)并調(diào)用所述第一虛成員函數(shù),其中所述第一處理器能夠調(diào)用所述第二虛成員函數(shù)而且所述第二處理器能夠調(diào)用所述第一虛成員函數(shù),以提供所述第一處理器與所述第二處理器之間的雙向通信通路。41.根據(jù)權(quán)利要求40所述的系統(tǒng),其中,所述第一編譯器用于基于由用戶提供的第一注釋值而將所述第一虛成員函數(shù)關(guān)聯(lián)到所述第一處理器,以及基于由所述用戶提供的第二注釋值而將所述第二虛成員函數(shù)關(guān)聯(lián)到所述第二處理器。42.根據(jù)權(quán)利要求41所述的系統(tǒng),其中,所述第一編譯器用于生成與所述第二處理器相關(guān)聯(lián)的第二遠程調(diào)用存根和與所述第一處理器相關(guān)聯(lián)的第一粘結(jié)邏輯,以允許所述第二處理器調(diào)用所述第一虛成員函數(shù)。43.根據(jù)權(quán)利要求41所述的系統(tǒng),其中,所述第一編譯器用于生成與所述第一處理器相關(guān)聯(lián)的第一遠程調(diào)用存根和與所述第二處理器相關(guān)聯(lián)的第二粘結(jié)邏輯,以允許所述第一處理器調(diào)用所述第二虛成員函數(shù)。44.根據(jù)權(quán)利要求41所述的系統(tǒng),其中,所述第一編譯器用于編譯第一宏函數(shù),用于促使對指向所述第一處理器的虛函數(shù)表的指針的聲明,以及第二宏函數(shù),用于促使對指向所述第一處理器的所述虛函數(shù)表的所述指針的初始化,其中,所述第一宏函數(shù)用于用共享存儲器分配來覆蓋新操作符并釋放運行時間調(diào)用,而且所述第二宏用于用恰當?shù)倪\行時間調(diào)用來初始化指向所述第一處理器的虛函數(shù)表的所述指針。45.根據(jù)權(quán)利要求40所述的系統(tǒng),其中,所述第一編譯器用于將所述第一處理器和所述第二處理器的虛函數(shù)表加載到同一地址處,而不需要用戶介入。46.根據(jù)權(quán)利要求45所述的系統(tǒng),其中所述第一編譯器用于生成針對所述共享對象的虛函數(shù)表的第一對象文件,所述第二編譯器用于生成針對所述共享對象的虛函數(shù)表的第二對象文件,以及鏈接器耦合到所述第一編譯器,其中所述鏈接器用于將所述第一對象文件和所述第二對象文件相鏈接。47.根據(jù)權(quán)利要求46所述的系統(tǒng),其中,所述第一編譯器用于通過使用由所述第一處理器生成的虛函數(shù)表而非通過使用由所述第二處理器生成的虛函數(shù)表來生成所述第二處理器的第二可執(zhí)行文件。48.根據(jù)權(quán)利要求46所述的系統(tǒng),其中所述第一編譯器用于將所述虛函數(shù)表存儲在對象文件的一部分中,其中所述第一編譯器用于將所述第一處理器的虛函數(shù)表布置在先于由所述第二處理器生成的虛函數(shù)表的所述第二可執(zhí)行文件的毗鄰位置中。49.根據(jù)權(quán)利要求48所述的系統(tǒng),其中,所述第一編譯器用于調(diào)整由所述第一處理器生成的第一可執(zhí)行文件的基地址,以促使由所述第一處理器生成的虛函數(shù)表位于與所述第二可執(zhí)行文件相同的位置處。50.根據(jù)權(quán)利要求49所述的系統(tǒng),其中,所述第一編譯器用于在識別到所述部分的開始地址后獲取所述部分的所述開始地址。全文摘要計算機系統(tǒng)可以包括計算機平臺和輸入-輸出設(shè)備。計算機平臺可以包括多個異構(gòu)處理器,所述多個異構(gòu)處理器例如包括中央處理單元(CPU)和圖形處理單元(GPU)。GPU可以耦合到GPU編譯器和GPU鏈接器/加載器,而CPU可以耦合到CPU編譯器和CPU鏈接器/加載器。用戶可以用面向?qū)ο笳Z言創(chuàng)建共享對象,而且共享對象可以包括虛函數(shù)。共享對象可以在異構(gòu)處理器之間被細粒度劃分。GPU編譯器可以向CPU分配共享對象并可以創(chuàng)建用于允許GPU調(diào)用共享對象的虛函數(shù)的第一和第二使能通路。因此,可以包括虛函數(shù)的共享對象可以無縫地在CPU與GPU之間共享。文檔編號G06F15/16GK102741828SQ200980163225公開日2012年10月17日申請日期2009年10月30日優(yōu)先權(quán)日2009年10月30日發(fā)明者B·薩哈,C·納爾遜,D·普措盧,M·吉爾卡爾,M·拉賈戈帕蘭,P·席,R·德奧達爾,R·杰瓦,R·納拉亞納斯瓦米,S·嚴,S·瓊金斯,S·羅,T·陳,X·周,Y·高申請人:英特爾公司
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1