一,内存的概括
全局内存- __device__
常量内存- __constant__ 拷贝到GPU的函数
cudaError_t cudaMemcpyToSymbol(const void *symbol, const void * src, size_t count);
cudaError_t cudaMemcpyFromSymbol(const void * src, const void *symbol, size_t count);
GPU 缓存有
1.以及缓存
2.二级缓存
3.只读常量缓存
4.只读纹理内存
所有SM都是有自己的以及缓存,但是所有SM共享一个二级缓存;只有加载操作可以被缓存,存储操作不能被缓存
二,内存的分配与释放
你可以在主机上使用下列函数分配全局内存
cudaError_t cudaMalloc(void ** devPtr, size_t count);
在已分配的全局内存中的值不会 被清除。你需要用从主机上传输的数据来填充所分配的全局内存,或用下列函数将其初始 化:
cudaError_t cudaMemset(void * devPtr,int value, size_t count);
释放内存
cudaError_t cudaFree(void * devPtr);
内存传输
cudaError_t cudaMemcpy(void * dst,const void *src,size_t count,enum cudaMemcpyKind kind);
固定内存
cudaError_t cudaMallocHost(void ** devPtr,size_t coun);
释放固定内存
cudaError_t cudaFreeHost(void *ptr);
零拷贝内存(走PCI-E通道,有点慢)
cudaError_t cudaHostAlloc(void ** pHost,size_t coun, unsigned int flags);
获取指针
cudaError_t cudaHostGetDevicePointer(void ** pDevice,void * pHost, unsigned int flags);
套路基本上是,主机分配主机内存->初始化->设备获取指针->设备指针然后当作参数传递->释放
cudaFreeHost释放即可
至于统一寻址模式,有空再谈吧