• 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)

  • 相关阅读:
    3.31考试T2
    P3225 [HNOI2012]矿场搭建
    P2714 四元组统计
    3.29考试T2 变戏法
    开发中可能会用到的几个小tip----QT, pycharm, android, 等
    pycharm下: conda installation is not found ----一个公开的bug的解决方案
    ubuntu16.04 opencv3.4.1 opencv-contribute3.4.1 compile
    vs 2015 update 3各版本下载地址
    在金融业工作了六年,给想入这行的说几个经验
    在centos上安装smplayer播放器
  • 原文地址:https://www.cnblogs.com/yuqiujie/p/8884064.html
Copyright © 2020-2023  润新知