CUDA—复制整个托管内存类的性能损失有多大

CUDA—复制整个托管内存类的性能损失有多大,cuda,Cuda,我有一些从托管内存分配器派生的类,例如: /*----管理来自 ------它覆盖新操作符,执行cudaMallocManaged,然后强制转换*/ class Cell : public Managed { int a;float b;char c; // say ~50 fields } 现在,假设我有一个100000个单元格对象的数组,并且想要发送到某个全局函数,该函数只使用一个小集合,比如5-10个字段来进行一些计算 最简单的方法是发送整个单元格对象数组。但是,它确实复制了大

我有一些从托管内存分配器派生的类,例如:

/*----管理来自

------它覆盖新操作符,执行cudaMallocManaged,然后强制转换*/

class Cell : public Managed {
    int a;float b;char c; // say ~50 fields
} 
现在,假设我有一个100000个单元格对象的数组,并且想要发送到某个全局函数,该函数只使用一个小集合,比如5-10个字段来进行一些计算

最简单的方法是发送整个单元格对象数组。但是,它确实复制了大量未使用的数据

更严格的方法是只分配所需5-10个字段的设备数组,复制值并将其发送给全局函数。这有点烦人,因为如果全局函数体需要cell类中的其他字段,则必须重新写入其签名以接受新数组

我的问题-一般来说,使用最简单方法的性能损失有多大


谢谢

管理内存是如何处理的。Pascal6.x及更高版本将只要求访问那些页面中的页面

计算能力较低的设备通常会传输整个托管内存集,而不管它被访问了多少,甚至不管它是否被访问。
不管你怎么做。这允许您限制传输的数据量,而无需更改分配或数据结构。

发送整个阵列是什么意思?如果您使用的是托管内存,则不会发送任何内容。驱动程序和设备通过PCI-E接口协调设备的临时访问。发送-将Cell*对象数组传递给全局函数。我不知道,我想这取决于它的实现?同样,将指向内核的指针作为参数传递是按值传递的,不存在对底层结构数组的数据复制或传输。您只传递一个64位地址。