是否存在使用cudamemcopy(...,devicetohost)传输数据的最佳数据结构?我发现数组的工作速度比结构快很多。有没有这个原因,并有一个更优化的方法?cudamemcopy的最佳数据结构
编辑 -
看来我的时间没有被正确地记录下来。结构和数组的时间应该大致相等。我会尝试使用cuda事件API来记录时间。
是否存在使用cudamemcopy(...,devicetohost)传输数据的最佳数据结构?我发现数组的工作速度比结构快很多。有没有这个原因,并有一个更优化的方法?cudamemcopy的最佳数据结构
编辑 -
看来我的时间没有被正确地记录下来。结构和数组的时间应该大致相等。我会尝试使用cuda事件API来记录时间。
结构 - 的阵列在内核当从/向全局存储器将数据加载到共享/寄存器时通常比的Structs阵列-的-更好。但是,当将数据从/从主机复制到/从设备(在一个大的memcopy事务中)时,我认为SoA和AoS之间没有任何性能差异。毕竟,数据量是相同的。
唯一的例外是,如果一些额外的填充字节是在该结构的端部加入,以实现AOS的元件的某些存储器对准。
我觉得可能是为什么你正在经历的性能差异某些其他原因。
就个人而言,我怀疑性能差异是由于副本。
也许你的数据结构的方式,还有空缺口对齐。
第二个原因可能是由于内存页面对齐处理。当你使用malloc获取内存时,它可以被分割成类似于Windows文件系统的布局。碎片的级别可以非常高,但是说如果你对malloc进行一次调用就可以获得持续对齐的内存,而如果你做了很多调用,就可以得到有缺口的内存。
CUDA的内存拷贝已通过检查页面逐一手动将它们转移到GPU来处理这个额外的开销。
真正解决您的问题将使用cudaMallocHost
分配内存的CPU不必担心。尝试这样做,看看它是否修复你的问题。
只要数据是连续的并且可以使用单个指针进行传输,底层数据排列的内容就没有区别。如果数据不是连续而是有序的,cudaMemcpy2D可能会有所帮助。单个cudaMemcpy调用将所有内容都解析为一个指针以及该指针之后要传输的字节序列。因此,例如,只要字节总数相同,int和array结构之间应该没有区别。现在,如果结构数组在结构中具有填充或其他未使用的空间,那么效率会较低 –
数据在结构中是连续的。该结构有四个整数和一个浮点数。我将这个结构体的数组分配到GPU上。我也有一个5倍的阵列。我也将它分配到GPU上。当我将内存从gpu复制到cpu上时,比结构体中字节数多的数组传递得比结构体更快。所以我的印象是,阵列可以更快地从设备的内存复制到主机。您是否有任何问题可以帮助验证此问题? – napl
您的复印操作计时方法可能有问题。在内核调用后定时操作(例如,从gpu到cpu的数据的memcopy)没有考虑到内核调用立即返回到主机的控制权,但是复制操作直到内核被启动才开始完成。请发布(编辑您的问题)一个简单,完整,可编辑的例子,演示时间差异。你使用cuda事件api来做时机吗? –