第一个链接:https://devtalk.nvidia.com/default/topic/392370/how-to-cudamalloc-two-dimensional-array-/
问题:分配一个二维指针数组
用户解决方案:使用mallocPitch
“正确”的低效解决方案:对于每行使用malloc和memcpy的for循环(荒谬的开销)
“更正确”的解决方案:将它压缩成一维数组,“专业意见”,一条评论说没有人会在GPU上使用2D指针结构来考虑性能。
第二个链接:https://devtalk.nvidia.com/default/topic/413905/passing-a-multidimensional-array-to-kernel-how-to-allocate-space-in-host-and-pass-to-device-/
问题:在主机上分配空间并将其传递到设备上
子链接:https://devtalk.nvidia.com/default/topic/398305/cuda-programming-and-performance/dynamically-allocate-array-of-structs/
子链接解决方案:在GPU上编写基于指针的结构是一种不好的体验,而且效率非常低下,将其压缩为一维数组。
第三个链接:https://dev59.com/1XNA5IYBdhLWcg3wNrAy
问题:分配和传输2D数组
用户解决方案:使用mallocPitch
其他解决方案:将其压平
第四个链接:https://dev59.com/pW445IYBdhLWcg3wH2rH
问题:分配和遍历2D数组
提交的解决方案:不显示分配
其他解决方案:将其压缩
还有很多其他的来源,大多数都在说同样的事情,但在多个实例中,我看到了关于GPU上指针结构的警告。
许多人声称分配指针数组的正确方法是对于每行调用malloc和memcpy,但是函数mallocPitch和memcpy2D存在。这些功能是否不够高效?为什么不是默认答案?
另一种“正确”的处理二维数组的方法是将它们压缩成一个数组。我应该把这视为生活的事实并习惯吗?但我对我的代码非常挑剔,觉得这样很不优雅。
我正在考虑的另一种解决方案是使用一个矩阵类来完成,该类使用一个一维指针数组,但我找不到实现双括号操作符的方法。
另外根据这个链接:Copy an object to device? 和子链接的答案:cudaMemcpy segmentation fault ,情况有些棘手。
我想要在CUDA中使用的类都有2/3d数组,将它们转换为CUDA的1d数组会有很多开销吗?
总之,我问了很多问题,总结一下,我应该习惯压缩数组作为生活的事实,还是可以使用2d分配和复制函数而不像在调用for循环中调用alloc和cpy函数那样产生大量开销?