#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include "device_functions.h"
#include <stdio.h>
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/imgproc/types_c.h"
CUDA 6.0以后,出现了:统一内存,unified memory,其具有以下特性:
1 其声明有以下两种方式:
a 使用关键字managed,可选的和device,一起使用,比如:device managed int ret[1000];
b 使用函数cudaMallocManaged():
int *ret;
cudaMallocManaged(&ret,1000*s
Unified Memory是啥参见其他博主文章,主要就是简化代码,不需要各种cudamalloc和cudamemcpy。
cuda_runtime_api.h中的接口:extern host cudart_builtin cudaError_t CUDARTAPI cudaMallocManaged(void **devPtr, size_t size, unsigned int flags __dv(cudaMemAttachGlobal));
一般传前两个参数即可。
传指针时先在C代码中malloc,
CUDA编程的内存管理与C语言的类似,需要程序员显式管理主机和设备之间的数据移动。随着CUDA版本的升级,NVIDIA正系统地实现主机和设备内存空间的统一,但对于大多数应用程序来说,仍需要手动移动数据。对于CUDA内存管理来说,工作重点在于如何使用CUDA函数来显式地管理内存和数据移动,主要是两个方面:分配和释放设备内存;在主机和设备之间传输数据。为了达到最优性能,CUDA提供了在主机端准备设备内存地函数,并且显式地向设备传输数据和从设备中获取数据。
内 存 分 配 和 释 放
CUDA编程模型假设
内存管理
CUDA是C语言的扩展,内存方面基本集成了C语言的方式,由程序员控制CUDA内存,当然,这些内存的物理设备是在GPU上的,而且与CPU内存分配不同,CPU内存分配完就完事了,GPU还涉及到数据传输,主机和设备之间的传输。
为达到最优性能,CUDA提供了在主机端准备设备内存的函数,并且显式地向设备传递数据,显式的从设备取回数据。
统一内存Unified Memory
统一内存是可从系统中的任何处理器访问的单个内存地址空间(参见上图)。 这种硬件/软件技术允许应用程序分配可以从 CPU 或 GPU 上