繁体   English   中英

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

[英]2D arrays with contiguous rows on the heap memory for cudaMemCpy2D()

CUDA文档建议将cudaMemCpy2D()用于2D阵列(对于3D阵列,则类似地使用cudaMemCpy3D() ),而不是cudaMemCpy()以获得更好的性能,因为前者会更适当地分配设备内存。 另一方面,所有的cudaMemCpy函数(如memcpy()都需要连续分配内存。

如果我创建我的(宿主)数组例如float myArray[h][w];这很好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()

PS:在以下类似的帖子中找不到该问题的答案:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM