CUDA编程入门系列(七) GPU内存如何管理

一、内存使用

        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中,访问延迟比全局内存低两个数量级,访问速度比全局内存快一个数量级,共享内存定义在线程块中,线程块中每个线程都可以访问,但不可以被其他线程块访问。

        用途:在一个线程块中共享数据,用作用户自己管理的高速缓存。

        共享内存使用方式

CUDA编程入门系列(七) GPU内存如何管理_第1张图片

你可能感兴趣的:(人工智能)