GPU内存分配回收内存的函数接口:
cudaMalloc(): 在设备端分配global memory
cudaFree(): 释放存储空间
CPU的数据和GPU端数据做数据传输的函数接口是一样的,他们通过传递的函数实参(枚举类型)来表示传输方向:
cudaMemcpy(void dst, void src, size_t nbytes, enum cudaMemcpyKind direction)
enum cudaMemcpyKind:
cudaMemcpyHostToDevice(CPU到GPU)
cudaMemcpyDeviceToHost(GPU到CPU)
cudaMemcpyDeviceToDevice(GPU到GPU)
cudaMalloc()
- 函数原型:
cudaError_t cudaMalloc (void **devPtr, size_t size)。
- 函数用处:与C语言中的malloc函数一样,只是此函数在GPU的内存你分配内存。
- 注意事项:
3.1. 可以将cudaMalloc()分配的指针传递给在设备上执行的函数;
3.2. 可以在设备代码中使用cudaMalloc()分配的指针进行设备内存读写操作;
3.3. 可以将cudaMalloc()分配的指针传递给在主机上执行的函数;
3.4. 不可以在主机代码中使用cudaMalloc()分配的指针进行主机内存读写操作(即不能进行解引用)。
用途:向GPU申请空间,类型为int型一维数组,大小为1024,GPU上的申请到的空间的地址保存在指针gpudata中,可能有同学会对(void**)&gpudata产生疑问,为什么是这种形式?下面解释一下,指针也是变量,只不过它里面的值是另外普通变量的地址,既然是变量,那它也就有地址,也就是说指针也是有地址的,我们也可以对指针进行取址操作。
- 第一个&,获得了gpudata的地址
- 靠近&的*,或得了gpudata里面储存的地址
- 第二个*,获得了gpudata里面地址对应的数据
cudaMemcpy()
- 函数原型:
cudaError_t cudaMemcpy (void *dst, const void *src, size_t count, cudaMemcpyKind kind)
- 函数作用:与c语言中的memcpy函数一样,只是此函数可以在主机内存和GPU内存之间互相拷贝数据。
- 函数参数:cudaMemcpyKind kind表示数据拷贝方向,如果kind赋值为cudaMemcpyDeviceToHost表示数据从设备内存拷贝到主机内存。
- 与C中的memcpy()一样,以同步方式执行,即当函数返回时,复制操作就已经完成了,并且在输出缓冲区中包含了复制进去的内容。
- 相应的有个异步方式执行的函数cudaMemcpyAsync(),这个函数详解请看下面的流一节有关内容。
cudaFree()
- 函数原型:
cudaError_t cudaFree ( void* devPtr )
- 函数作用:与c语言中的free()函数一样,只是此函数释放的是cudaMalloc()分配的内存。
cudaDeviceProp结构体
- *name[256]:*保存GPU的名字,例如:GeForce GTX 1070
- *totalGlobalMem:*我们通常说的显存,例如GTX 1070 8G为 8504868864 bytes
- *sharedMemPerBlock:*block中share memory的大小,速度比全局存储空间快,例如GTX 1070 8G为 49152 bytes
- *regsPerBlock:*block中register memory的大小,里面存储的寄存器
- *warpSize:*线程束大小
- *maxThreadsPerBlock:*每个block最多的thread数量
- *maxThreadsDim[3]:*block每个维度的最大值
- *maxGridSize[3]:*grid每个维度的最大值
- *clockRate:*GPU的时钟频率
- *multiProcessorCount:*GPU上SM的数量,说实话老黄真是一个好刀客,本来性能就不行,还不停地砍性能