用于cudaMemCpy2D()的堆内存上具有连续行的2D数组

时间:2015-11-03 16:59:51

标签: c++ arrays cuda

CUDA documentation建议将cudaMemCpy2D()用于2D数组(类似cudaMemCpy3D()用于3D数组)而不是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实施到现有项目中,这是我面临的问题。现在,我创建一个临时的1D数组,将我的2D数组的内容复制到其中并使用cudaMemCpy()并重复整个过程以在内核启动后获得结果,但这似乎不是一种优雅/有效的方式。

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

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

1 个答案:

答案 0 :(得分:2)

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

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所需的连续内存块。