c++ - cudaMemCpy2D() 的堆内存上具有连续行的二维数组

标签 c++ arrays cuda

CUDA documentation建议对 2D 数组使用 cudaMemCpy2D()(对于 3D 数组同样使用 cudaMemCpy3D())而不是 cudaMemCpy() 以获得更好的性能前者更恰本地分配设备内存。另一方面,所有 cudaMemCpy 函数,就像 memcpy() 一样,需要连续分配内存。

如果我创建我的(主机)数组,这一切都很好,例如,float myArray[h][w];。但是,如果我使用类似的东西,它很可能不起作用:

float** myArray2 = new float*[h];
for( int i = 0 ; i < h ; i++ ){
   myArray2[i] = new float[w];
}

这不是什么大问题,除非有人试图将 CUDA 实现到现有项目中,这正是我面临的问题。现在,我创建了一个临时的一维数组,将我的二维数组的内容复制到其中并使用 cudaMemCpy() 并在内核启动后重复整个过程以获取结果,但这似乎不是一种优雅/高效的方式。

有没有更好的方法来处理这种情况?具体来说,有没有办法在具有连续分配行的堆上创建真正的二维数组,以便我可以使用 cudaMemCpy2D()

P.S:我在之前的类似帖子中找不到这个问题的答案:

最佳答案

分配大数组,然后使用指针算法找到行的实际开头。

float* bigArray = new float[h * w]
float** myArray2 = new float*[h]
for( int i = 0 ; i < h ; i++ ){
   myArray2[i] = &bigArray[i * w];
}

您的 myArray2 指针数组为您提供了 C/C++ 风格的二维数组行为,bigArray 为您提供了 CUDA 所需的连续内存块。

关于c++ - cudaMemCpy2D() 的堆内存上具有连续行的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33504943/

相关文章:

c++ - 什么构成了 RValues?

c++ - 分配大内存的最佳方法

C++(标准)异常和 Unicode

c++ - 通过 Swig 在 C++ 和 Lua 之间传递变量

javascript - 将数组中的值分配给键

c++ - 在 CUDA 中循环遍历 3 维数组以求和它们的元素

cuda - 未满扭曲中的事件线程数?

arrays - PostgreSQL 的 id 匹配列表

java - 循环问题导致在退出程序之前重复输出

c++ - 在可执行文件中链接 CUDA 文件时出现 cuSparse 函数的多个定义错误