【CUDA開發】CUDA面內存拷貝用法總結
標簽(空格分隔): 【CUDA開發】
主要是在調試CUDA硬解碼并用D3D9或者D3D11顯示的時候遇到了一些代碼,如下所示:
CUdeviceptr g_pRgba = 0;
CUDA_MEMCPY2D memcpy2D = { 0 };
memcpy2D.srcMemoryType = CU_MEMORYTYPE_DEVICE;
memcpy2D.srcDevice = g_pRgba;
memcpy2D.srcPitch = nWidth * 4;
memcpy2D.dstMemoryType = CU_MEMORYTYPE_ARRAY;
memcpy2D.dstArray = array;
memcpy2D.dstPitch = nWidth * 4;
memcpy2D.WidthInBytes = nWidth * 4;
memcpy2D.Height = nHeight;// clear the surface to solid white
checkCudaErrors(cuMemcpy2D(&memcpy2D));
將設備內存g_pRgba中的數據拷貝到面內存中;還有另外一種情況:
src GMEM pointer : dpSrc
src GMEM layout : 100x100
dst GMEM pointer : dpDst
dst GMEM layout : 50*50
將src GMEM按行序初始化為:0~9999的值
CUDA_MEMCPY2D planeMem;
memset(&planeMem,0,sizeof(planeMem));
planeMem.srcMemoryType=CU_MEMORYTYPE_DEVICE;
planeMem.srcDevice =dpSrc;
planeMem.srcXInBytes =25*sizeof(float);
planeMem.srcY =25;
planeMem.srcPitch =100*sizeof(float);
planeMem.dstMemoryType=CU_MEMORYTYPE_DEVICE;
planeMem.dstDevice =dpDst;
planeMem.dstXInBytes =0;
planeMem.dstY =0;
planeMem.dstPitch =50*sizeof(float);
planeMem.WidthInBytes =planeMem.dstPitch;
planeMem.Height =50;
cuMemcpy2DUnaligned(&planeMem); //如果數據已經對齊則最好使用cuMemcpy2D,否則必須使用該函數,另外當內存是使用cuMemAllocPitch分配的時候,如果內存布局本事不是2的次冪,則需要將planeMem的srcPitch和dstPitch設置為通過cuMemAllocPitch得到的pitch參數,而不是內存本身的布局大小*sizeof(TYPE)
2017-01-26 23:28
張朋藝 pyZhangBIT2010@126.com