1 2 3 4 5 6 7 8 | typedef enum aclrtMemManagedAdviseType { ACL_MEM_ADVISE_SET_READ_MOSTLY = 0, ACL_MEM_ADVISE_UNSET_READ_MOSTLY, ACL_MEM_ADVISE_SET_PREFERRED_LOCATION, ACL_MEM_ADVISE_UNSET_PREFERRED_LOCATION, ACL_MEM_ADVISE_SET_ACCESSED_BY, ACL_MEM_ADVISE_UNSET_ACCESSED_BY, } aclrtMemManagedAdviseType; |
枚举项说明如下:
设置内存多副本属性,通常称为read mostly属性。
若为某段UVM内存设置read mostly属性,除了首次访问该段内存的对象外(注:此处的对象指Host或Device),其他对象访问时,都会创建一个只读内存副本,即一个虚拟地址可以拥有多个只读副本。在有只读内存副本的对象上,只有首次访问时,需建立虚拟内存到物理内存的页表映射关系。再次在有只读内存副本的对象访问内存时,就不会触发缺页中断,以减少缺页中断带来的性能开销。
但如果对设置了read mostly属性的内存进行了写操作,除了发生写操作的对象,其他对象上的副本都将会失效并取消read mostly属性,再次访问时会触发缺页中断,系统需要重新建立页表映射,从而影响性能。所以建议对通常只读、极少进行写操作的UVM内存设置read mostly属性。
若设置为ACL_MEM_ADVISE_SET_READ_MOSTLY选项,则location参数被忽略,这时会在Host上建立一个只读副本,默认拥有一份数据。
取消设置read mostly属性。
取消之后,该段UVM内存仅保留一个内存副本,保留哪个对象上的内存副本,取决于传入的location参数,若传invalid,则认为保留Host上的内存副本;若传入的location上没有副本,则会建立一个副本。同时,除了保留内存副本的对象,其他对象上的内存副本都会失效,相应的物理内存会释放。
设置内存首选位置属性,通常称为preferred location属性,表示访问该段内存的首选位置是Host或Device。
该属性可与内存访问者属性(即ACL_MEM_ADVISE_SET_ACCESSED_BY)配合使用,当location相同时,用于提前分配物理内存,建立页表映射,从而避免在首选位置访问内存时出现缺页中断的开销。
在设置preferred location属性时,需要注意read mostly属性是否设置:
取消设置preferred location属性。
设置远端映射属性,通常称为accessed by属性。
该属性需与首选位置属性(即ACL_MEM_ADVISE_SET_PREFERRED_LOCATION)配合使用,当location相同时,用于提前分配物理内存,建立页表映射,从而避免在首选位置访问内存时出现缺页中断的开销。
取消设置accessed by属性。