我有一些从托管内存分配器派生的类,例如:
-它覆盖了新运算符,执行cudaMallocManaged,然后强制转换*/
class Cell : public Managed {
int a;float b;char c; // say ~50 fields
} 现在,假设我有一个包含100,000个Cell对象的数组,并且想要发送到某个全局函数,该函数只使用一小部分字段(比如5-10个)来执行一些计算。
最简单的方法是发送整个单元对象数组。然而,它确实复制了大量未使用的数据。
一种更紧凑的方法是只分配所需的5-10个字段的设备数组,复制值并将其发送到全局函数。这有点烦人,因为如果全局函数体需要来自cell类的其他字段,则必须重写其签名以接受新的数组。
我的问题是--一般来说,使用最简单的方法会有多糟糕的性能损失?
谢谢!
发布于 2017-12-15 05:16:19
托管内存是如何在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()。这使您可以限制传输的数据量,而无需更改分配或数据结构。
https://stackoverflow.com/questions/47793939
复制相似问题