我遇到了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)。但同时我试图了解可能发生的事情。
我描述了算法执行预测所花费的时间,并且它在运行时增加了。只是为了好奇,我决定在每次运行之前重新加载所有网络,然后花在预测算法上的时间保持稳定,因此对我来说,它似乎取决于算法的连续执行。 / p>
对我而言,奇怪的是,随着时间的推移它变得越来越慢是对内核的调用,即。对clEnqueueNDRangeKernel的调用。我不是OpenCL的专家,但是执行内核几次变慢似乎不合逻辑。这可能是记忆问题吗?它如何影响执行时间?我有点失落,感谢任何帮助。
PD:在A weird Timinig issue with "clEnqueueNDRangeKernel" in OpenCL中报告了类似的问题,但没有标记答案。它有关于测量时间的方式的评论,但我认为这不是我的情况,因为时间显然在增长。
修改: 我修改了代码以启用CL_QUEUE_PROFILING_ENABLE。然后我添加了以下行来分析入队呼叫:
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);
答案 0 :(得分:0)
这,您观察到的是我相信GPU VRAM泄漏。我认为这是您面临的培训过程中的错误OpenCL。将DarkNet移植到OpenCL非常困难。我遇到了这个问题,许多内核无法简单地从CUDA转换为OpenCL。 18个月后,我用纯OpenCL和C制作了一个可以正常工作的版本,您可以使用它。
请检查这一实现。到目前为止,它已经过了60颗星的良好测试。我知道我对此感到抱歉,但希望我可以在此处发布此信息。我并不想促进我的工作,只是给您一个不同的观点,因为下面的实现是在纯C中实现的,几乎具有与CUDA版本相同的结构。因此,您甚至可以使用Beyond Compare之类的工具来查看我所做的更改?
谢谢!