CUDA面内存用法总结

本文介绍如何在CUDA中无需内核调用的情况下,从一个100x100的GMEM区域的特定位置(25,25)复制50x50的子区域到另一个GMEM。详细展示了如何设置CUDA_MEMCPY2D结构并调用cuMemcpy2DUnaligned函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近群里有网友问CUDA中2D GMEM copy的问题,昨天论坛中也有问同样问题的:copy a sub slice of source GMEM to another GMEM,下面详细介绍再不需要内核的情况下如何实现:

view plaincopy to clipboardprint?
测试(从100x100的GMEM区域,起始索引为(25,25)的位置开始复制一块大小为50x50的子区域到目标GMEM):  
 
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,否则必须使用该函数,另外当内存是使用cu垃圾广告llocPitch分配的时候,如果内存布局本事不是2的次幂,则需要将planeMem的srcPitch和dstPitch设置为通过cu垃圾广告llocPitch得到的pitch参数,而不是内存本身的布局大小*sizeof(TYPE) 
测试(从100x100的GMEM区域,起始索引为(25,25)的位置开始复制一块大小为50x50的子区域到目标GMEM):

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,否则必须使用该函数,另外当内存是使用cu垃圾广告llocPitch分配的时候,如果内存布局本事不是2的次幂,则需要将planeMem的srcPitch和dstPitch设置为通过cu垃圾广告llocPitch得到的pitch参数,而不是内存本身的布局大小*sizeof(TYPE)

 

注:以上代码经过测试

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22785983/viewspace-625650/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22785983/viewspace-625650/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值