Zero Copy:
零拷貝是CUDA工具包2.2版中添加的一項功能。 它使GPU線程可以直接通路主機記憶體。 為此,它需要映射固定(不可分頁)記憶體。 在內建GPU上(即CUDA裝置屬性結構的內建字段設定為1的GPU),映射固定記憶體始終是性能增益,因為它避免了多餘的副本,因為內建的GPU和CPU記憶體在實體上是相同的。 在獨立的GPU上,映射固定記憶體僅在某些情況下才有優勢。 由于資料未在GPU上緩存,映射的固定記憶體應該隻讀取或寫入一次,并且讀取和寫入記憶體的全局加載和存儲應該合并。 可以使用零拷貝代替流,因為核心發起的資料傳輸會自動覆寫核心執行,而無需設定和确定最佳資料流的開銷。
低優先級:對于CUDA Toolkit 2.2及更高版本,在內建GPU上使用零拷貝操作。
零拷貝主機代碼:
在此代碼中,由cudaGetDeviceProperties()傳回的結構的canMapHostMemory字段用于檢查裝置是否支援将主機記憶體映射到裝置的位址空間。 通過使用cudaDeviceMapHost調用cudaSetDeviceFlags()來啟用頁面鎖定記憶體映射。 請注意,必須在設定裝置或進行需要狀态的CUDA調用(即本質上,在建立上下文之前)之前調用cudaSetDeviceFlags()。 頁面鎖定的映射主機記憶體使用cudaHostAlloc()進行配置設定,指向映射裝置位址空間的指針通過函數cudaHostGetDevicePointer()擷取。 在零拷貝主機代碼的代碼中,kernel()可以使用指針a_map來引用映射的固定主機記憶體,其方式與如果a_map引用裝置記憶體中的位置完全相同。
映射固定主機記憶體允許您将CPU-GPU記憶體傳輸與計算重疊,同時避免使用CUDA流。 但由于對這些記憶體區域的任何重複通路都會導緻重複的PCIe傳輸,是以請考慮在裝置記憶體中建立第二個區域以手動緩存先前讀取的主機記憶體資料。
統一虛拟尋址:
計算能力2.0和更高版本的裝置在使用TCC驅動程式模式時,支援在64位Linux,Mac OS和Windows XP以及Windows Vista / 7上稱為統一虛拟尋址(UVA)的特殊尋址模式。 使用UVA,所有安裝的受支援裝置的主機記憶體和裝置記憶體共享一個虛拟位址空間。
在UVA之前,應用程式必須跟蹤哪些指向裝置記憶體(以及哪個裝置)的指針,哪些指向主機記憶體作為每個指針的單獨中繼資料位(或者程式中的寫死資訊)。 另一方面,使用UVA,通過使用cudaPointerGetAttributes()檢查指針的值,可以簡單地确定指針指向的實體記憶體空間。
在UVA下,與cudaHostAlloc()一起配置設定的固定主機記憶體将具有相同的主機和裝置指針,是以不必為此類配置設定調用cudaHostGetDevicePointer()。 然而,事後通過cudaHostRegister()固定的主機記憶體配置設定将繼續具有與其主機指針不同的裝置指針,是以在這種情況下,cudaHostGetDevicePointer()仍然是必需的。
在受支援的配置中,UVA也是通過PCIe總線直接支援對等(P2P)資料傳輸以支援GPU的必要先決條件,繞過主機記憶體。