CUDA编程模型之内存管理
CUDA编程模型假设系统是由一个主机和一个设备组成的,而且各自拥有独立的内存。
主机:CPU及其内存(主机内存),主机内存中的变量名以h_为前缀,主机代码按照ANSI C标准进行编写
设备:GPU及其内存(设备内存),设备内存中的变量名以d_为前缀,设备代码使用CUDA C标准进行编写
一个典型的CUDA程序实现流程:
1.把数据从CPU内存拷贝到GPU内存
- 在CPU上申请内存:float *h_A;
h_A=(float*)malloc(nBytes);
- 在GPU上申请内存:float *d_A;
cudaMalloc((float**)&d_A,nBytes);
- 数据传输:cudaMemcpy(d_A,h_A,nBytes,cudaMemcpyHostToDevice);
2.调用核函数对存储在GPU内存中的数据进行操作
3.将数据从GPU内存传送回到CPU内存
- 数据传输:cudaMemcpy(h_C,d_C,nBytes,cudaMemcpyDeviceToHost);
- 释放GPU内存:cudaFree(d_A);
- 释放CPU内存:free(h_A);
说明:
1.GPU内存分配:cudaMalloc函数
函数原型:cudaError_t cudaMalloc(void** devPtr, size_t size)
该函数负责向设备分配一定字节的线性内存,并以devPtr的形式返回指向所分配内存的指针。
2.主机和设备之间的数据传输:cudaMemcpy函数
函数原型:cudaError_t cudaMemcpy(void* dst, const void* src, size_t count, cudaMemcpyKind kind)
该函数以同步方式执行,从src指向的源存储区复制一定数量的字节到dst指向的目标存储区。复制方向由kind指定。
kind有四种选择:cudaMemcpyHostToHost、cudaMemcpyHostToDevice、cudaMemcpyDeviceToHost、cudaMemcpyDeviceToDevice
如果GPU内存分配成功,函数返回cudaSuccess;否则返回cudaErrorMemoryAllocation
可以使用CUDA运行时函数将错误代码转化为可读的错误信息:char* cudaGetErrorString(cudaError_t error)
3.释放GPU内存:cudaFree函数
函数原型:cudaError_t cudaFree(void* devPtr)
上一篇: idea实现类快捷生成接口方法示例
下一篇: 解决TabLayout 不显示下划线问题
推荐阅读
-
Java内存模型之原子性问题
-
IOS开发(40)之objective-C 的内存管理之-引用计数
-
【原创】(十三)Linux内存管理之vma/malloc/mmap
-
Python深入之python内存管理机制(重点)
-
IOS开发(77)之iOS高级内存管理:比较__unsafe_unretain、__strong、__weak、__autoreleasing
-
详解Spring学习之编程式事务管理
-
【原创】(十四)Linux内存管理之page fault处理
-
Spark之编程模型RDD
-
python面试题之Python是如何进行内存管理的
-
python 之 并发编程(非阻塞IO模型、I/O多路复用、socketserver的使用)