cudaMallocPitch 和 cudaMemcpy2D
来源:互联网 发布:www.226bbb.com新域名 编辑:程序博客网 时间:2024/06/05 08:43
一、cudaMalloc()
cudaMalloc(void** devPtr,
devPtr: 在显存上分配数据的头指针
cout: 分配空间的大小,以字节为单位。
int height = 64,
float *devPtr;
cudaMalloc((void**)&devPtr,
sizeof(float) * width *height)
二、cudaMemcpy()
cudaMemcpy(void*dst,
dst: 目的矩阵内存头指针
src:源矩阵内存头指针
count: 拷贝数据的大小
kind:拷贝数据的方向
int height = 64,
……..
float*src;//内存中的矩阵头指针,假设矩阵已经初始化
float *dst;//指向设备矩阵的头指针,假设设备内存空间已经开辟
…….
cudaMemcpy(dst,
三、cudaMallocPitch()
cudaMallocPitch(void**devPtr,
devPtr:开辟矩阵的数据的头指针
pitch:分配存储器的宽度,以字节为单位(cuda的返回值)
width:分配矩阵的列数
height:分配矩阵的行数
Int width = 64, height = 64;
float* devPtr;
size_t pitch;
cudaMallocPitch((void**)&devPtr,
&pitch,
width *sizeof(float),
height)
假设GPU中global memory被划分为128Byte的段(0-127,128-255,256-383,……),你要为内存分配float型矩阵数据。假设矩阵的行数为N,列数为M,在C和C++中数据是按行优先存储的。当N*4是128倍数的时候(float型数据占4个Byte),那么用cudaMalloc分配出来的内存空间也是对齐的,也就是说你一行分配的字节数刚好是128Bytes的倍数的时候,cudaMalloc()也是对齐的;
再看另一种情况,N=33,此时33*4=132,不是128的倍数,当warp从第二行开头(从132开始读,第一行是0到131)读取globalmemory的时候,首地址并非globalmemory划分的对齐段的首地址,那么这样的访问就是非合并的,cudaMallocPitch()就是为了解决每行首地址是否是globalmemory对齐段的问题,如果用cudaMallocPitch()来分配N=33(即列数为33)的矩阵时,每一行大小会变成256个Bytes(0-131为我们需要使用的空间,132-255未使用),而不是cudaMalloc中的132个Bytes,这样分配以后,每行的首地址将会是与globlamemory分段地址对齐的(都是128的整数倍),warp在访问的时候就可以对齐了!
四、cudaMemcpy2D()
cudaMemcpy2D(void* dst,
size_tdpitch,
const void*src,
size_tspitch,
size_twidth,
size_theight,
enum cudaMemcpyKindkind);
dpitch: dst指向的2D数组中的内存宽度,以字节为单位,是cuda为了读取方便,
对齐过的内存宽度,可能大于一行元素占据的实际内存。
src:源矩阵内存头指针
spitch: src指向的2D数组中的内存宽度,以字节为单位
width: src指向的2D数组中一行元素占据的实际宽度。以字节为单位,等于
width*sizeof(type)
kind:拷贝数据的方向
- cudaMallocPitch 和 cudaMemcpy2D
- cudaMallocPitch 和 cudaMemcpy2D
- 整合 Ecshop 和 Discuz。
- ++ 和 * 的优先级
- latex minipage 和 parbox
- KVC 和 KVO
- Post 和 Get
-  
- struct inode 和 struct file
- struct inode 和 struct file
- IOS 开发 loadView 和 viewDidLoad…
- 5.6 文件压缩 gzip 和bipz2
- mysql 存储引擎 和 事务
- Python - pyqt 和 opencv
- C# StreamReader 和 StreamWriter …
- EXIST 和 IN 使用
- set unused column column_name 和…
- ip classless和 no ip classless
- Lucene学习总结之二:Lucene的总体架构
- 数据类型
- python 学习
- CUDA 程序优化
- CUDA 测时
- cudaMallocPitch 和 cudaMemcpy2D
- CUDA中GPU信息获取
- CUDA——GPU参数获取
- java动态代理
- cublas的配置使用
- CUDA函数错误判断
- Matlab+CUDA混合编程(一)
- Accelerating MATLAB wi…
- 文本编辑工具vim