Caffe fails to use GPU in a new thread ??? see here
the `Caffe::mode_` variable that controls this is thread-local,
so ensure you’re calling `caffe.set_mode_gpu()` in each thread
before running any Caffe functions. That should solve your issue.
Caffe set_mode GPU 在多线程下失效
在main thread中设置GPU模式,在worker thread中调用网络进行检测,
GPU模式不起效,默认仍然使用CPU模式,所以速度很慢,和GPU相比慢了
10倍左右。
解决方案:在子线程中set_mode,然后调用网络进行检测。
(1)创建网络在main thread。static 网络存储在全局静态数据区。
worker thread可以直接使用。
(2) 在worker thread中检测,需要在子线程中set_mode,然后调用网络进行检测。
结论:
(1)caffe的set_mode所在的线程必须和使用nets进行forward的线程相同。否则默认使用CPU模式,速度会很慢。
(2)caffe的nets初始化可以在main thread也可以在worker thread。
voidtopwire_demo(bool run_in_worker_thread) { if (run_in_worker_thread) { CaffeApi::set_mode(true, 0, 1234);// set in worker thread-1, use GPU-0 } // do net detect // ... }
voidrailway_demo(bool run_in_worker_thread) { if (run_in_worker_thread) { CaffeApi::set_mode(true, 0, 1234);// set in worker thread-1, use GPU-0 } // do net detect // ... }
voidsidewall_demo(bool run_in_worker_thread) { if (run_in_worker_thread) { CaffeApi::set_mode(true, 0, 1234);// set in worker thread-1, use GPU-0 }
// do net detect // ... }
voidlockcatch_demo(bool run_in_worker_thread) { if (run_in_worker_thread) { CaffeApi::set_mode(true, 0, 1234);// set in worker thread-1, use GPU-0 }