CUDA编程模型之内存管理

CUDA编程模型假设系统是由一个主机和一个设备组成的,而且各自拥有独立的内存。

CUDA编程模型之内存管理

主机:CPU及其内存(主机内存),主机内存中的变量名以h_为前缀,主机代码按照ANSI C标准进行编写

设备:GPU及其内存(设备内存),设备内存中的变量名以d_为前缀,设备代码使用CUDA C标准进行编写

一个典型的CUDA程序实现流程:

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)

上一篇:Linux 中查看网口流量的利器 -- sar


下一篇:WPF案例:如何设计历史记录查看UI