本帖最后由 十四王爷 于 2016-7-15 14:30 编辑
(1)关于存储位置和访问性能: 前者也叫managedmemory, 是一种在逻辑上可以同时被GPU和CPU使用的缓冲区。具体位置在哪里,由runtime进行自动或者手工的安排和迁移。 (例如,某时刻可以是内存,当kernel要用的时候,自动传给GPU,并可能在GPU端被缓冲;而kernel结束后,当CPU这边访问全部或者部分数据的时候, 然后CUDA自动为你从显存那边自动全部或者部分传过来--例如以一定大小的粒度)zero copy memory则是就是内存,是传统上长期被支持的,能被显卡直接当成globalmemory使用的一段缓冲区。(实际上,这是两种经典的globalmemory之一,一种是显存,一种是内存映射的)。因为前者存在自动迁移安排,和不固定的存储位置(以及,在多卡间使用时候可能自动触发的P2PAccess),所以往往它的访问性能要比后者好。 (2)关于适用性: 在32-bit和UVA无效的情况下,zero-copymemory依然可以使用,直接获取一次devicepointer, 即可。此时依然具有能直接访问的能力,但需要维持两个不同的指针。而此时unifiedmemory将不能使用。在64-bit和UVA有效的情况下,两者均可以使用,但unifiedmemory具有额外的更简洁的使用形式(见下面3段),和可能的更高的性能(见上面1段)。 (3)关于使用方便性: unified memory具有__managed__书写形式的扩展,用起来非常方便,可以直接在语言(CUDAC)中集成,对于小数据(例如单个变量,或者小规模的数组)使用起来简洁明了。同时它还具有和传统的zerocopy类似的通过cudaMallocManaged()方式的进行缓冲区分配。而zero-copymemory只能通过缓冲区分配(cudaHostAlloc/MallocHost/Register之类的), 部分情况使用起来不方便。综合存储位置、性能、适用性和使用方便性,用户可以将unifiedmemory看成zerocopy memory的威力加强版(更多细节还有,这里就不一一详述了)。
|