2009-11-16 67 views
0

我試圖找出一種方法來分配的內存塊是由兩個主機(CPU)和裝置(GPU)可訪問的訪問。除了使用cudaHostAlloc()函數來分配CPU和GPU都可以訪問的頁面鎖定內存以外,還有其他的方式來分配這樣的內存塊嗎?預先感謝您的意見。CUDA內存分配用於主機和設備

回答

2

主機和設備「共享」內存的唯一方法是使用較新的零複製功能。這在GT200架構卡和一些較新的筆記本電腦卡上可用。正如你注意到的那樣,該內存必須與cudaHostAlloc一起分配,以便頁面被鎖定。沒有其他選擇,即使這種功能在舊版CUDA兼容卡上也不可用。

如果你只是尋找一種簡單的(可能非高性能)的方式來管理主機設備傳輸,檢查出的推力庫。它具有一個向量類,可以讓您在設備上分配內存,但是可以像在主機上一樣從主機代碼讀取和寫入內存。

另一種選擇是編寫自己的包裝器來管理您的傳輸。

0

不,沒有在GPU內存上上傳緩衝區的「自動方式」。

+0

不,但問題是關於可從主機和設備訪問的內存。零拷貝(固定主機內存)在較新版本的CUDA中提供了此功能。將GPU集成到芯片組並將系統內存用作GPU內存顯然非常有用。對於獨立GPU(即插入PCIe插槽),零拷貝會導致總線傳輸。 – mch 2009-11-19 20:52:56

1

沒有辦法分配一個緩衝區,除非你使用cudaHostAlloc()是由GPU和CPU都可以訪問。這是因爲您不僅必須在CPU上分配固定內存(您可以在CUDA之外執行該操作),還必須將內存映射到GPU(或更具體地說,上下文的)虛擬內存中。

確實,在獨立GPU上零拷貝確實會導致總線傳輸。但是,如果您的訪問很好地結合在一起,並且只在數據仍然有效時才使用,因爲替代方法是將數據傳輸到設備,然後分兩個階段將其讀入多處理器。