更多darknet源代码学习笔记,参看:darknet源码学习:预测分类函数float *network_predict_gpu(network net, float *input)
1.cuda_push_array
将主机host的数据拷贝到GPU设备x_gpu中
void cuda_push_array(float *x_gpu, float *x, size_t n)
{
size_t size = sizeof(float)*n;
//cudaError_t status = cudaMemcpy(x_gpu, x, size, cudaMemcpyHostToDevice);
cudaError_t status = cudaMemcpyAsync(x_gpu, x, size, cudaMemcpyHostToDevice, get_cuda_stream());
CHECK_CUDA(status);
}
2.1cudaMemcpy与cudaMemcpyAsync
cudaError_t cudaMemcpy(void* dst, const void* src, size_t count, cudaMemcpyKind kind)
负责host和device之间数据通信,
其中src指向数据源,而dst是目标区域,count是复制的字节数,其中kind控制复制的方向:cudaMemcpyHostToHost, cudaMemcpyHostToDevice, cudaMemcpyDeviceToHost及cudaMemcpyDeviceToDevice,如cudaMemcpyHostToDevice将host上数据拷贝到device上。
CudaDeviceSynchronize vs cudaThreadSynchronize vs cudaStreamSynchronize
2.cuda_make_array
在设备device上分配一个显存x_gpu,并将x的数据拷贝到x_gpu中。
float *cuda_make_array(float *x, size_t n)
{
float *x_gpu;
size_t size = sizeof(float)*n;
cudaError_t status = cudaMalloc((void **)&x_gpu, size);
if (status != cudaSuccess) fprintf(stderr, " Try to set subdivisions=64 in your cfg-file. \n");
CHECK_CUDA(status);
if(x){
//status = cudaMemcpy(x_gpu, x, size, cudaMemcpyHostToDevice);
status = cudaMemcpyAsync(x_gpu, x, size, cudaMemcpyHostToDevice, get_cuda_stream());
CHECK_CUDA(status);
}
if(!x_gpu) error("Cuda malloc failed\n");
return x_gpu;
}
2.1.cudaMalloc
cudaError_t cudaMalloc(void** devPtr, size_t size);
在设备device上分配内存函数
这个函数和C语言中的malloc类似,但是在device上申请一定字节大小的显存,其中devPtr是指向所分配内存的指针。同时要释放分配的内存使用cudaFree函数,这和C语言中的free函数对应。