【发布时间】:2021-12-30 13:33:28
【问题描述】:
网上有很多关于在 CUDA 上分配、复制、索引等 2d 和 3d 数组的问题。我得到了很多相互矛盾的答案,所以我试图编译过去的问题,看看我是否可以问正确的问题。
第一个链接:https://devtalk.nvidia.com/default/topic/392370/how-to-cudamalloc-two-dimensional-array-/
问题:分配一个二维指针数组
用户解决方案:使用 mallocPitch
“正确”的低效解决方案:在 for 循环中为每一行使用 malloc 和 memcpy(荒谬的开销)
“更正确”的解决方案:将其压缩成一维数组“专业意见”,一条评论说没有人关注性能在 gpu 上使用二维指针结构
问题:在主机上分配空间并将其传递给设备
子链接解决方案:在 GPU 上编码基于指针的结构是一种糟糕的体验并且效率非常低,将其压缩成一维数组。
第三个链接:Allocate 2D Array on Device Memory in CUDA
问题:分配和传输二维数组
用户解决方案:使用 mallocPitch
其他解决方案:将其展平
第四个链接:How to use 2D Arrays in CUDA?
问题:分配和遍历二维数组
提交的解决方案:不显示分配
其他解决方案:压扁它
有很多其他消息来源大多都在说同样的事情,但在多个实例中,我看到有关 GPU 上的指针结构的警告。
许多人声称分配指针数组的正确方法是为每一行调用 malloc 和 memcpy,但存在 mallocPitch 和 memcpy2D 函数。这些功能是否效率较低?为什么这不是默认答案?
二维数组的另一个“正确”答案是将它们压缩成一个数组。我应该习惯这作为生活的事实吗?我对我的代码非常挑剔,我觉得它不雅。
我正在考虑的另一个解决方案是最大化使用一维指针数组的矩阵类,但我找不到实现双括号运算符的方法。
也可以根据这个链接:Copy an object to device?
和子链接回答:cudaMemcpy segmentation fault
这有点不确定。
我想使用 CUDA 的类都有 2/3d 数组,将这些类转换为 CUDA 的 1d 数组不会有很多开销吗?
我知道我已经问了很多,但总而言之,我是否应该习惯将压缩数组作为生活中的事实,或者我是否可以使用 2d 分配和复制函数而不会像在调用 alloc 和 cpy 的解决方案中那样产生糟糕的开销在for循环中?
【问题讨论】: