我目前正在使用C ++实现Tensorflow自定义op(用于自定义数据获取器)以加速我的Tensorflow模型。由于我的Tensorflow模型并没有经常使用GPU,我相信我可以同时使用多个工作线程来实现最大性能。
问题是,即使我有足够的工作人员,我的程序也不能利用所有CPU。在我的开发机器中,(4个物理内核)它占用了大约90%的用户时间,4%的系统时间,4个工作线程和tf.ConfigProto(inter_op_parallelism_threads=6)
选项。
使用更多工作线程和inter_op_parallelism_threads
选项,我的模型运行性能比以前的配置差得多。由于我不擅长prpfiling,我不知道我的代码的瓶颈在哪里。
是否有任何经验法则可以最大限度地提高CPU使用率和/或良好的工具,以便在Linux中找到单个进程(非系统范围)的性能瓶颈/互斥锁?
编辑:我的代码运行python,但(几乎)每个执行都使用C ++代码。其中一些不是我的(Tensorflow和Eigen),我已经创建了一个可以在Python中动态加载的共享库,它由Tensorflow内核调用。 Tensorflow拥有自己的线程池,我的动态库代码也拥有线程池,我的代码是thread safe。我还创建了线程来同时调用sess.run()
以便调用它们。像Python一样可以同时调用多个HTTP请求,sess.run()
释放GIL。我的目标是尽可能地呼叫sess.run()
以增加"真实"性能,以及任何与python相关的分析器都没有成功。
答案 0 :(得分:3)
1)更多线程并不意味着更快的速度。如果你有4个核心,你的速度不能超过1核1倍。
2)你应该做的是tune your code for maximum performance in single-thread execution (with compiler optimization turned off),并且在你完成之后,打开编译器的优化器并使代码成为多线程的,没有比你的核心更多的线程。
P.S。一种常见的误解是性能调优只能在编译器优化的代码上完成。 This explains为什么不是这样。