CUDA笔记
cuda 内存管理
- cuda通过内存分配、数据传递、内存初始化、内存释放进行内存管理;
Standard C Function | CUDA C Function |
---|---|
malloc | cudaMalloc |
memcpy | cudaMemcpy |
memset | cudaMemset |
free | cudaFree |
内存分配
- 主机内存分配:extern void malloc(unsigned int num_bytes);
代码:floatfpHost_A;
fpHost_A = (float*)malloc(nBytes); - 设备内存分配:
代码: float fpDevice_A;
cudamalloc((float*)&fpDevice_A, nBytes); (能在主机中调用,也能在设备中调用)
注意:传入的地址是双重指针;
内存拷贝
- 主机数据拷贝:void * memcpy(void* dest, const void * src, size_t n);
memcpy((void*) d, (void*) s, nBytes); - 设备数据拷贝:
代码: cudaMemcpy(Device_A, Host_A, nBytes, cudaMemcpyHostToHost) (只能在主机中调用)
cudaMemcpyHostToHost:主机向主机中拷贝;
cudaMemcpyHostToDevice:主机向设备中拷贝;
cudaMemcpyDeviceToHost:设备向主机中拷贝;
cudaMemcpyDeviceToDevice:设备向设备中拷贝;
cudaMemcpyDeflt:默认(默认方式只允许在支持统一虚拟寻址的系统上使用)。
内存初始化
- 主机内存初始化:void * memset (void * str, int c, size_t n);
代码:memset (fpHost_A, 0, nBytes); - 设备内存初始化:
代码:void * cudaMemset(fpDevice_A, 0, nBytes); (只在主机内存上使用)
内存释放
- 释放主机内存:free(pHost_A);
- 释放设备内存:cudaFree(pDevice_A); (只能在主机中调用 )
自定义设备函数
设备函数
- 定义只能在设备上执行的GPU函数为设备函数
- 设备函数只能被核函数和其他设备函数调用
- 设备韩式被__device__修饰
核函数
- 用__global__ 修饰的函数被称为核函数,一般由主机调用,在设备上执行;
- __global__修饰符既不能核__device__修饰符一起使用,也不能和__host__修饰符一起使用。
主机函数
- 主机端的普通C++函数可以用__host__修饰;
- 对于主机端的函数,__host__修饰符可以省略;
- 可以使用__host__和__device__同时修饰一个函数减少冗余代码。编译器会根据主机和设备分别编译函数。