是否有使用cudamemcopy(...,devicetohost)传输数据的最佳数据结构?我发现数组比结构更快。这是否有原因,是否有更优化的方法?
编辑 -
我的时间似乎没有被正确记录。结构和数组的时间应该大致相等。我将尝试使用cuda events api记录时间。
答案 0 :(得分:1)
当在内核中将数据从/向全局内存加载到共享/寄存器时,数组结构通常比结构数组更好。但是,我不认为在将数据从/向主机复制到设备(在一个大的memcopy事务中)时,SoA和AoS之间没有任何性能差异。毕竟,数据量是相同的。
唯一的例外是如果在结构的末尾添加了一些额外的填充字节,以实现AoS元素的某些内存对齐。
我认为可能还有其他原因导致您遇到性能差异。
答案 1 :(得分:0)
就个人而言,我怀疑性能差异是由副本造成的。
也许您的数据结构正在以空隙的方式对齐。
第二个原因可能是由于内存页面对齐处理。当您使用malloc获取内存时,它可能会碎片化,类似于Windows文件系统的布局。碎片的级别可以非常,但是如果你对malloc进行一次调用就会获得持续对齐的内存,而如果你进行多次调用,你就可以获得内存空缺,这并不是没有道理的。
CUDA的内存副本必须通过逐个检查页面并手动将它们移动到GPU来处理这种额外的开销。
问题的真正解决方案是使用cudaMallocHost
来分配CPU不必担心的内存。尝试这样做,看看它是否解决了你的问题。