0

是否有使用 cudamemcopy(... , devicetohost) 传输数据的最佳数据结构?我发现数组的工作速度比结构快得多。这是有原因的吗?是否有更优化的方法?

编辑 -

看来我的时间没有被正确记录。结构和数组的时间量应该大致相等。我将尝试使用 cuda events api 来记录时间。

4

2 回答 2

1

在内核中将数据从全局内存加载到共享/寄存器时,数组结构通常比结构数组好。但是,我认为在将数据从主机复制到主机或从设备复制数据时(在一个大的内存复制事务中),SoA 和 AoS 之间没有任何性能差异。毕竟数据量是一样的。

唯一的例外是如果在结构的末尾添加了一些额外的填充字节以实现 AoS 元素的某些内存对齐。

我认为您遇到性能差异可能还有其他原因。

于 2012-11-30T23:23:03.887 回答
0

就个人而言,我怀疑性能差异是由于副本造成的。

也许您的数据结构正在以存在空白的方式对齐。

第二个原因可能是由于内存页面对齐处理。当您使用 malloc 获取内存时,它可能会像 Windows 文件系统的布局一样被碎片化。碎片化程度可以非常高,但可以说,如果你对 malloc 进行一次调用,你会得到连续对齐的内存,而如果你多次调用,你会得到有间隙的内存。

CUDA 的内存副本必须通过逐页检查页面并手动将它们移动到 GPU 来处理这种额外的开销。


解决问题的真正方法是cudaMallocHost分配 CPU 不必担心的内存。尝试这样做,看看它是否能解决您的问题。

于 2012-12-01T23:59:39.397 回答