0

在用于分配新内存区域的 CUDA SDK 函数cudaHostAlloc()中可以使用标志:

  • cudaHostAllocDefault (默认- 0 并导致 cudaHostAlloc() 模拟 cudaMallocHost())
  • cudaHostAllocPortable
  • cudaHostAllocMapped
  • cudaHostAllocWriteCombined

要标记已分配的内存区域,我们可以使用cudaHostRegister()标志:

  • 0(默认
  • cudaHostRegisterPortable
  • cudaHostRegisterMapped

为什么我们在使用标志分配内存时可以将其标记为WriteCombined,但不能通过cudaHostAllocWriteCombined使用将已经存在的内存区域标记为WriteCombined ?cudaHostAlloc()cudaHostRegister()

已经分配的内存我们必须只通过POSIX函数来标记set_memory_wc()

4

1 回答 1

3

在您引用set_memory_wc(). 由于需要所有缓存刷新和 TLB 击落,这样的操作将非常昂贵;并且内存基本上是不可读的,直到您找到某种方法将其取消标记为 WC。

为什么要尝试使用 WC 内存?在 pre-i7 (Nehalem) CPU 上,WC 具有稍高的传输性能 (IIRC),因为它抑制了对进出内存的 PCI Express 流量的窥探。但是在 Nehalem 和后来的 CPU 上,我不知道有任何应用程序具体证明了 WC 内存的好处。

于 2013-10-06T02:08:44.283 回答