cudaMemcpy2DToArray 和 cudaMemcpy2DFromArray 中的“音高”是啥

Posted

技术标签:

【中文标题】cudaMemcpy2DToArray 和 cudaMemcpy2DFromArray 中的“音高”是啥【英文标题】:What's "pitch" in cudaMemcpy2DToArray and cudaMemcpy2DFromArraycudaMemcpy2DToArray 和 cudaMemcpy2DFromArray 中的“音高”是什么 【发布时间】:2022-01-13 01:11:02 【问题描述】:

我正在将已弃用的 cudaMemcpyToArraycudaMemcpyFromArray 转换为 cudaMemcpy2DToArraycudaMemcpy2DFromArray。新的 API 调用 widthheightpitch,而不是已弃用的调用中的 sizespitchdpitch的描述对应的是“源内存的间距”和“目的内存的间距”。我想知道这些值是什么:数据项的大小,还有什么?

更具体地说,如果我要复制 W*H 浮动,我应该有 pitch=sizeof(float)width=Wheight=Hpitch=sizeof(float)*Wwidth=sizeof(float)*Wheight=H 还是其他?

【问题讨论】:

文档告诉你:docs.nvidia.com/cuda/cuda-runtime-api/… "spitch 是 src 指向的二维数组在内存中的宽度,包括添加到每行末尾的任何填充。" 【参考方案1】:

应该是:

pitch=sizeof(float)*W
width = sizeof(float)*W
height = H

以上内容适用于cudaMemcpy2DToArray,并假设您正在从主机传输到设备,这很可能涉及作为源的主机内存中的未调整分配。

pitched allocation 的间距 是 2D 分配的一行的字节大小,包括行尾的填充字节。例如,它是cudaMallocPitch 返回的值。对于无间距分配,它仍然是线的宽度,由W*sizeof(element) 给出,其中2D 分配宽度由W 给出,每个元素大小为sizeof(element)

这个question 和the link it refers to 可能也很有趣。

【讨论】:

您提到的question 的最佳答案似乎建议pitchwidth 都应该是sizeof(float)*W 区别在于您指的是源音高还是目标音高,以及基础分配是倾斜的还是非倾斜的。您的问题中没有足够的信息来说明您到底在问什么场景。尽管如此,我在回答中已经涵盖了这两种情况(有间距分配和无间距分配)。 对于cudaMemcpy2DToArray,只有源音高是相关的(只有音高参数是spitch)。因此,您为此传递的实际音高值首先取决于您的源分配(您创建但未显示)是倾斜的还是非倾斜的。如果您从主机内存复制到 cudaArray,它可能没有音高,因此您可以使用 W*sizeof(element) 作为音高值。 对不起,我以为你问的是音高。是的,我的回答不正确,我刚刚修复了它。传输的宽度是以字节为单位的列,而不是元素。 谢谢,相应地更改了调用。

以上是关于cudaMemcpy2DToArray 和 cudaMemcpy2DFromArray 中的“音高”是啥的主要内容,如果未能解决你的问题,请参考以下文章

[mybatis]Mapper XML Files_CUD

mybatis-plus-Cud操作

数据库的平滑扩展

mybatis一级缓存和二级缓存

1.基础CRUD

HTTP API响应数据规范整理