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)

  • 相关阅读:
    (4.15)存储DAS,NAS,SAN在数据库存储上的应用
    (4.14)存储:RAID在数据库存储上的应用
    关于like %%的优化思路
    (4.13)SQL Server profile使用、数据库优化引擎顾问使用
    图形界面执行计划图标释义
    (4.15)全文索引的使用
    倒排索引/全文搜索基本原理
    SQLServer: 用 ApexSQLLog 恢复 SQL Server 数据
    (4.12)2012及以上列存储索引
    教你管理SQL实例系列(1-15)
  • 原文地址:https://www.cnblogs.com/yuqiujie/p/8884064.html
Copyright © 2011-2022 走看看