2013-10-05 36 views
0

在CUDA SDK用於分配新的內存區域可以使用的標誌功能cudaHostAlloc()爲什麼我們不能使用`cudaHostRegister()`標記爲已經存在的內存區域?

  • cudaHostAllocDefault(默認 - 0並且使cudaHostAlloc()來模擬cudaMallocHost())
  • cudaHostAllocPortable
  • cudaHostAllocMapped
  • cudaHostAllocWriteCombined

要標記內存已分配我們可以使用cudaHostRegister()與標誌區:

  • 0(默認
  • cudaHostRegisterPortable
  • cudaHostRegisterMapped

爲什麼我們可以通過標誌cudaHostAllocWriteCombined分配時,它標誌着內存WriteCombined使用cudaHostAlloc(),但不能用cudaHostRegister()標記爲WriteCombined已存在的內存區域?

已經分配了內存,我們只能通過POSIX函數set_memory_wc()來標記嗎?

回答

3

我不知道任何API可能會改變現有VA範圍的緩存能力,直到您引用set_memory_wc()。由於所有需要的緩存刷新和TLB降落,這樣的操作將非常昂貴;直到你找到某種方式將它取消爲WC,內存基本上是不可讀的。

你爲什麼要使用WC內存?在pre-i7(Nehalem)CPU上,WC具有略高的傳輸性能(IIRC),因爲它抑制了PCI Express流量進出內存的窺探。但是在Nehalem和後來的CPU上,我不知道任何已經從WC內存中獲益的具體應用程序。

+0

非常感謝!是的,我想通過使用WC存儲器區域和MOV [NT] Q'(NT - 非臨時)流SSE指令來提高性能,例如http://software.intel.com/en-us/articles/increase-memory-throughput-with-intel-streaming-simd-extensions-4-intel-sse4-streaming-load但是你可以給我一個鏈接,從** Nehalem ** WC和stream NT - SSE無關緊要? – Alex

+2

這是CUDA團隊在Nehalem處理器首次推出時的一個觀察結果 - 它呈現的主要開發人員可見方式是可分頁memcpy的速度幾​​乎與固定速度一樣快。它在CUDA手冊(5.1.4)中進行了簡要討論。 下面是關於此事的另一件事:http://fgiesen.wordpress.com/2013/01/29/write-combining-is-not-your-friend/ – ArchaeaSoftware

+0

謝謝!明確。 WC-memory在使用FSB的處理器上很有意義,因爲通過FSB窺探工作很慢:http://books.google.ru/books?id=ynydqKP225EC&pg=PR9&lpg=PR9&dq=cuda+handbook+Chapter+5.1.4&source=bl&ots = 5j06O0PCCH&SIG = pddrqKs7B9bxklXr_LEBxKf7ZxM&HL = RU&SA = X&EI = zqhSUruWL-Gu4ATr_oHABw&VED = 0CDQQ6AEwAQ#v = onepage&q = CUDA%20handbook%20Chapter%205.1.4&F =假 – Alex

相關問題