我遇到了 OpenCL 版本的 Darknet 的问题。我深入研究了实现并意识到问题出在softmax内核的调用中(发生在https://github.com/ganyc717/Darknet-On-OpenCL/blob/c13fefc66a13da5805986937fccd486b2b313c24/darknet_cl/src/blas_kernels_cl.cpp# L1020 )。我在 github ( https://github.com/ganyc717/Darknet-On-OpenCL/issues/4 ) 上的一个问题中报告了它。但与此同时,我试图了解可能发生的事情。
我分析了算法执行预测所需的时间,并且它会随着运行而增加。出于好奇,我决定在每次运行之前重新加载所有网络,然后算法预测所花费的时间保持稳定,因此在我看来,这取决于算法的持续执行。
对我来说奇怪的是,随着时间的推移,它似乎变慢的是对内核的调用,即对 clEnqueueNDRangeKernel 的调用。我不是 OpenCL 专家,但多次执行内核变慢似乎不合逻辑。会不会是内存问题?它对执行时间有何影响?我有点失落,任何帮助表示赞赏。
PD:在 OpenCL 中的“clEnqueueNDRangeKernel”的一个奇怪的 Timinig 问题中报告了一个类似的问题,但未标记答案。它有一个与测量时间的方式有关的评论,但我认为这不是我的情况,因为时间显然在增长。
编辑:我修改了代码以启用 CL_QUEUE_PROFILING_ENABLE。然后我添加了以下几行来分析 enqueue 调用:
cl_ulong time_start;
cl_ulong time_end;
clGetEventProfilingInfo(e, CL_PROFILING_COMMAND_START, sizeof(time_start), &time_start, NULL);
clGetEventProfilingInfo(e, CL_PROFILING_COMMAND_END, sizeof(time_end), &time_end, NULL);
double nanoSeconds = time_end-time_start;
printf("OpenCl Execution time is: %0.3f milliseconds \n",nanoSeconds / 1000000.0);
这些时间度量保持稳定......这让我更加困惑。似乎 GPU 运行它自己需要相同的时间,但是当 cpu 调用的度量时它会随着时间增长:
clock_t t1 = clock();
cl_event e;
cl_int status = clEnqueueNDRangeKernel(*cl->queue, kernel, 3, NULL, global_size, NULL, NULL, NULL, &e);
clock_t t2 = clock();
printf("enqueue : \t %f\n",(float)(t2 - t1) / CLOCKS_PER_SEC);