一、内存使用
1.CUDA程序会使用GPU内存与CPU内存
2.CPU内存的分配与释放是标准的,例如new和delete,malloc与free
3.GPU上内存涉及分配和释放使用CUDA提供的库函数实现
4.CUDA/GPU内存与CPU内存的互相传输
这里主要讲全局内存与共享内存的管理
二、CPU内存
栈:有编译器自动分配释放
堆:用户自己分配释放
C: malloc, calloc, free
C++: new,delete
三、GPU内存
1.GPU内存有很多种类型,例如全局,纹理,常量,共享,每种内存的管理不一样。
2.GPU内存也有不同的属性,如1D,2D,3D,锁页,统一内存
3.CUDA会增加新的内存类型
全局内存分配与释放
内存分配
cudaError t cudaMalloc(void **devPtr, size t size);
内存释放
cudaError t cudaFree(void *devPtr);
Host内存分配释放
Host内存属于CPU内存,传输速度比普通CPU内存快很多
内存分配
cudaError t cudaMallocHost(void **devPtr, size t size);
内存释放
cudaError t cudaFreeHost(void *devPtr);
统一Unified内存分配释放
Unified内存可以同时被CPU和GPU访问
内存分配
cudaError t cudaMallocManaged(void **devPtr, size t size,unsigned int flags = cudaMemAttachGlobal)
flags=cudaMemAttachGlobal: 内存可以被任意处理器访问CPU和GPU flags=cudaMemAttachGHost:只可以被CPU访问
内存释放
cudaError t cudaFree(void *devPtr) ;
CPU与GPU内存同步拷贝
cudaError t cudaMemcpy(void *dst, const void *src, size t count,cudaMemcpyKind kind)
kind: cudaMemcpyHostToHost, cudaMemcpyHostToDevicecudaMemcpyDeviceToHost, cudaMemcpyDeviceToDevice, orcudaMemcpyDefault
其中kind代表拷贝的方向
CPU与GPU内存异步拷贝,可能会导致冲突。
cudaError t cudaMemcpyAsync(void *dst, const void *src, sizet count,cudaMemcpyKind kind, cudaStream t stream = 0)
kind: cudaMemcpyHostToHost, cudaMemcpyHostToDevice,cudaMemcpyDeviceToHost, cudaMemcpyDeviceToDevice, orcudaMemcpyDefault
stream:如果是非0可能与其他stream的操作有重叠
共享内存
共享内存定义在SM中,访问延迟比全局内存低两个数量级,访问速度比全局内存快一个数量级,共享内存定义在线程块中,线程块中每个线程都可以访问,但不可以被其他线程块访问。
用途:在一个线程块中共享数据,用作用户自己管理的高速缓存。
共享内存使用方式