cuda内存管理

内存使用

  1. cuda程序会使用gpu和cpu内 存
  2. cpu内存释放与分配是标准的

1)栈,自动分配的

2)堆:用户自己分配释放的,如new,delete,malloc,free等

    3.gpu内存分配

1)cudaMalloc(void**devPtr , size_t size)

2)  cudafree(void*devPtr)

4.gpu,cpu都可以访问的内存,统一内存

1)  cudaMallocManaged(void**devPtr , size_t size)

 2)  cudafree(void*devPtr)

5.gpu内存拷贝

    cudaMemcpy(depth_vec.data, depth_in, depthWidth * depthHeight * sizeof(float), cudaMemcpyDeviceToHost);
6.共享内存
__share__
例子:
 
复制代码
//1.cpu上开辟空间
        //cv::Mat depth_vec(depthHeight, depthWidth, CV_32FC1);
        //cv::Mat depth_res(color_im[i].rows, color_im[i].cols, CV_32FC1);

//2.gpu上开辟空间
        float *depth_gpu = nullptr; // 输入图片在GPU内的内存
        float *color_gpu = nullptr; // 输入图片在GPU内的内存
        float *mask_gpu = nullptr; // 输入图片在GPU内的内存
        float *cam_intr_gpu = nullptr; // 输入图片在GPU内的内存
        //float *depth_out = nullptr; // 归一化后图片在GPU内的内存

        cudaMalloc((void **) &depth_gpu, depthWidth * depthHeight * sizeof(float));
        cudaMalloc((void **) &color_gpu, colorWidth * colorHeight * sizeof(float));
        cudaMalloc((void **) &mask_gpu, colorWidth * colorHeight * sizeof(float));
        cudaMalloc((void **) &cam_intr_gpu, 4 * sizeof(float));


//3.把cpu上的数据拷贝到gpu上
        //拷贝深度图,注意是data是一维的
        cudaMemcpy(depth_gpu, depth_im[i].data, depthWidth * depthHeight * sizeof(float), cudaMemcpyHostToDevice);
        //拷贝彩色图,注意是data是一维的
        cudaMemcpy(color_gpu, color_im[i].data, colorWidth * colorHeight * sizeof(float), cudaMemcpyHostToDevice);
        //拷贝mask图
        cudaMemcpy(mask_gpu, mask_im[i].data, colorWidth * colorHeight * sizeof(float), cudaMemcpyHostToDevice);
        //拷贝内参
        cudaMemcpy(cam_intr_gpu, cam_intr_arry_p, 4 * sizeof(float), cudaMemcpyHostToDevice);


//4.将整张图映射到一个grid中
        dim3 threadsPerBlock(32, 32);

        dim3 blocksPerGrid(depthWidth / threadsPerBlock.x + 1,
                           depthHeight / threadsPerBlock.y + 1);
        
        is_mask <<< blocksPerGrid, threadsPerBlock>>>(depth_in, mask_in);

//5.gpu拷贝回cpu
        cudaMemcpy(depth_res.data, depth_out, depthWidth * depthHeight * sizeof(float), cudaMemcpyDeviceToHost);
        cudaFree(depth_in);
复制代码

 

 
 
  
posted @   开锁球  阅读(295)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
点击右上角即可分享
微信分享提示