zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    Microsoft .NET Framework 以及 CLR 的版本
    如何:备份 Team Foundation Server
    通过VS2008SP1 访问TFS2010
    Project 2007 Understanding Project's Percent Complete vs. Percent Work Complete
    TFS:从单服务器部署移到双服务器部署
    C#网络编程(基本概念和操作) Part.1
    图解Windows server 2012故障转移群集的安装、建立
    产品经理经验总结
    TCP同步与异步及阻塞模式,多线程+阻塞模式,非阻塞模式简单介绍
    Windows Phone开发概论
  • 原文地址:https://www.cnblogs.com/yuqiujie/p/8884064.html
Copyright © 2011-2022 走看看