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)

  • 相关阅读:
    分支与循环(1)
    Python+selenium基本操作二
    python+selenium的八种定位方法
    变量与字符,数字连续
    Django虚拟环境拷贝到另一台电脑,不能直接使用的问题
    django部署到服务器使用manage.py runserver简单测试
    python中将main函数写成接口后main函数中的参数不能传递问题
    mac word2016尾部下划线不能显示
    简单的秒表实例
    Math.random理解练习
  • 原文地址:https://www.cnblogs.com/yuqiujie/p/8884064.html
Copyright © 2011-2022 走看看