我有一些派生自托管内存分配器的类,例如:
------------它会覆盖新的运算符,执行cudaMallocManaged然后转换* /
class Cell : public Managed {
int a;float b;char c; // say ~50 fields
}
现在,假设我有一个100,000个Cell对象的数组,并希望发送到一些全局函数,它只使用一小组字段(比如说5-10个)来进行一些计算。
最简单的方法是发送整个单元格对象。但是,它会复制大量未使用的数据。
更紧凑的方法是仅分配所需的5-10个字段的设备数组,复制值并将它们发送到全局函数。这有点烦人,因为如果全局函数体需要来自单元类的其他一些字段,则必须重写其签名以接受新数组。
我的问题 - 一般来说,使用最简单的方法会导致性能损失有多严重?
谢谢!
答案 0 :(得分:1)
如何处理托管内存depends on the compute capability of you device。 Pascal(6.x)及更高版本将仅在那些被访问的页面中请求页面。
具有较低计算能力的设备通常会传输整套托管内存,无论访问多少内容,甚至是否完全访问它。
但是你可以explicitly declare the memory regions to transfer on a per-stream basis using cudaStreamAttachMemAsync()
。这允许您限制传输的数据量,而无需更改分配或数据结构。