使用3D cuda内存时,最好传递关联的CUDAPITCHEDTPTR,还是只传递CUDAPITCHEDTPTR结构中的原始指针? 《英伟达编程指南》中的例子显示了他们将PtChEdpTR传递到内核: __global__ void MyKernel(cudaPitchedPtr devPitchedPtr,int width, int height, int depth)

使用3D cuda内存时,最好传递关联的CUDAPITCHEDTPTR,还是只传递CUDAPITCHEDTPTR结构中的原始指针? 《英伟达编程指南》中的例子显示了他们将PtChEdpTR传递到内核: __global__ void MyKernel(cudaPitchedPtr devPitchedPtr,int width, int height, int depth),c,cuda,C,Cuda,但与其如此,为什么不以同样的方式分配,然后像这样调用: __global__ void MyKernel(float* devPtr,int pitch, int width, int height, int depth) 然后访问您喜欢的元素。我更喜欢后一种实现,但为什么编程指南给出了另一个示例(尽管是一个糟糕的示例——说明了如何访问元素,但也说明了不应使用cuda实现的设计模式) 编辑:意思是说float*devPtr是cudaPitchedPtr的ptr(void*ptr)成员 我猜你在

但与其如此,为什么不以同样的方式分配,然后像这样调用:

__global__ void MyKernel(float* devPtr,int pitch, int width, int height, int depth)
然后访问您喜欢的元素。我更喜欢后一种实现,但为什么编程指南给出了另一个示例(尽管是一个糟糕的示例——说明了如何访问元素,但也说明了不应使用cuda实现的设计模式)


编辑:意思是说float*devPtr是cudaPitchedPtr的ptr(void*ptr)成员

我猜你在谈论Cudamaloc3d:

根据CUDA关于cudaMalloc3D的参考资料:

在设备上至少分配线性内存的宽度*高度*深度字节,并返回CUDAPITCHEDTPTR,其中ptr是指向已分配内存的指针。该功能可填充分配,以确保满足硬件对齐要求

所以

是否:

给Cudamaloc打电话没什么区别,但如果你喜欢,你会得到一些便利。您不必自己计算数组的大小,只需将cudaExtent结构传递给函数即可。当然,你会得到一个以字节为单位的数组。cudaExtent结构中没有指定数据类型大小的定义

如果将普通指针或cudaPitchedPtr传递给内核,则这是一个设计决策。cudaPitchedPtr不仅向内核提供devPtr,还存储内存量和维度大小。对于内存和寄存器保存,您只能得到x和y方向的大小,z只是节距/(x*y)


编辑:正如前面指出的那样,cudaMalloc3D添加了填充以确保合并的内存访问。但由于计算能力1.2,即使起始地址没有正确对齐,也可以合并内存访问。在CC>=1.2的设备上,这两种分配在性能方面没有区别。

两种方法都同样有效-这完全是您的审美决定


我甚至不清楚为什么cudaPitchedPtr有额外的成员-唯一真正重要的是基本指针和音高。

一如既往-每次查看,然后记得检查nvcc的下一个版本!基本上是为了可读性编写代码,然后再考虑。kronos,说“调用cudamaloc()没有区别”是不正确的——正如文档所说,cudamaloc3d()将填充分配以适应硬件需求。
cudaMalloc3D(&pitchedDevPtr, make_cudaExtent(w, h, d));
cudaMalloc(&devPtr, w * h * d);