2017-06-04 59 views
0

CUDA設備存儲器可使用cudaMalloc/cudaFree,確定被分配。這很好,但很原始。CUDA的malloc,MMAP/mremap

我很想知道,是以某種方式虛擬化的設備內存?是否有與mmap等效的操作,更重要的是,對於設備存儲器有mremap? 如果設備內存是虛擬化的,我希望這些功能應該存在。看來現代GPU驅動程序實現分頁時出現爭用多個進程有限的視頻資源,這表明它的虛擬化在一些這樣或那樣...

有誰知道在哪裏可以閱讀更多關於這個?

編輯:
好的,我的問題有點泛泛。我已閱讀手冊中討論爲設備訪問映射系統內存的部分內容。然而,我對設備分配內存更感興趣。

具體問題:
- 有沒有任何可能的方式來重新映射設備內存? (即增加設備分配)
- 是否可以將設備分配的內存映射到系統內存?
- 使用映射固定內存是否存在一些性能危險?內存是否根據需要在設備上覆制,或者是否總是通過012-通過pci-e總線獲取內存?

我有其中存儲器使用由GPU的99%的時間的情況下;因此它應該是設備本地的,但將設備內存映射到系統內存以便偶爾進行結構化回讀可能很方便,而無需執行難以處理的深層副本。

是的,統一的內存中存在,但我很高興與明確的分配,保存爲奇那一刻,我想偷偷摸摸回讀。

我發現手冊在一般的細節上相當輕。

+1

中獲取。如果我們離開UM出來的它對新發布的問題的答案是否定的,第三:不,內存不重複,除了L2緩存之外,GPU所需的映射數據將始終通過PCI-E總線獲取。 –

+0

謝謝,你應該把它變成一個答案。 –

回答

2

CUDA附帶罰款CUDA C Programming Guide,因爲它的主要手冊有Mapped Memory以及Unified Memory Programming部分。

響應您的額外發布的問題,並按照您的線索離開UM付出的代價的:

  • 是否有重新映射設備內存的任何可能的方式是什麼? (即增長設備分配)

    沒有直接的方法。您必須手動創建所需大小的新分配,然後將舊數據複製到該分配,然後釋放舊分配。如果你希望做到這一點,並且不介意與之相關的重大開銷,你可以看看thrust device vectors這將隱藏一些手工勞動並允許你調整一個矢量風格的分配。.resize()操作。然而,沒有什麼魔力,所以推力只是一個建立在CUDA C之上的模板庫(對於CUDA設備後端),所以它將執行一系列的操作,就像你手動操作一樣。

  • 是否有可能設備分配的內存映射到系統內存?

    撇開UM,沒有。設備內存不能映射到主機地址空間。

  • 使用映射固定內存有一些性能危險嗎?內存是否根據需要在設備上覆制,或者是否始終通過pci-e總線獲取內存?

    沒有,主機映射的數據在設備內存永不復制,除了L2緩存,映射由GPU所需要的數據總是會通過PCI-E總線

+0

@tera我冒昧地根據問題下的評論流編輯你的答案。如果這是令人反感的,請接受我的道歉並回滾。謝謝。 –

+0

謝謝羅伯特,一切都好。由於您的貢獻比我的貢獻更大,我已經創建了答案社區wiki。 – tera