cudaMemcpy2DToArray 和 cudaMemcpy2DFromArray 中的“音高”是啥
Posted
技术标签:
【中文标题】cudaMemcpy2DToArray 和 cudaMemcpy2DFromArray 中的“音高”是啥【英文标题】:What's "pitch" in cudaMemcpy2DToArray and cudaMemcpy2DFromArraycudaMemcpy2DToArray 和 cudaMemcpy2DFromArray 中的“音高”是什么 【发布时间】:2022-01-13 01:11:02 【问题描述】:我正在将已弃用的 cudaMemcpyToArray
和 cudaMemcpyFromArray
转换为 cudaMemcpy2DToArray
和 cudaMemcpy2DFromArray
。新的 API 调用 width
、height
和 pitch
,而不是已弃用的调用中的 size
。 spitch
和dpitch
的描述对应的是“源内存的间距”和“目的内存的间距”。我想知道这些值是什么:数据项的大小,还有什么?
更具体地说,如果我要复制 W*H
浮动,我应该有 pitch=sizeof(float)
、width=W
、height=H
或 pitch=sizeof(float)*W
、width=sizeof(float)*W
、height=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 的最佳答案似乎建议pitch
和width
都应该是sizeof(float)*W
区别在于您指的是源音高还是目标音高,以及基础分配是倾斜的还是非倾斜的。您的问题中没有足够的信息来说明您到底在问什么场景。尽管如此,我在回答中已经涵盖了这两种情况(有间距分配和无间距分配)。
对于cudaMemcpy2DToArray,只有源音高是相关的(只有音高参数是spitch
)。因此,您为此传递的实际音高值首先取决于您的源分配(您创建但未显示)是倾斜的还是非倾斜的。如果您从主机内存复制到 cudaArray,它可能没有音高,因此您可以使用 W*sizeof(element)
作为音高值。
对不起,我以为你问的是音高。是的,我的回答不正确,我刚刚修复了它。传输的宽度是以字节为单位的列,而不是元素。
谢谢,相应地更改了调用。以上是关于cudaMemcpy2DToArray 和 cudaMemcpy2DFromArray 中的“音高”是啥的主要内容,如果未能解决你的问题,请参考以下文章