多线程-如何尽可能多地使用CPU

Multithreading - How to use CPU as much as possible?

本文关键字:CPU 尽可能 多线程      更新时间:2023-10-16

我目前正在使用c++实现Tensorflow自定义op(用于自定义数据获取器),以加快我的Tensorflow模型。由于我的Tensorflow模型不使用GPU很多,我相信我可以实现最大性能使用多个工作线程并发。

问题是,即使我有足够的工人,我的程序并没有利用所有的CPU。在我的开发机器中,(4个物理核)它使用了大约90%的用户时间,4%的系统时间,4个工作线程和tf.ConfigProto(inter_op_parallelism_threads=6)选项。

使用更多的工作线程和inter_op_parallelism_threads选项,我得到的模型运行性能比以前的配置差得多。因为我不擅长分析,所以我不知道代码的瓶颈在哪里。

在Linux中是否有任何规则来最大化CPU使用率和/或好的工具来查找单个进程(非系统范围)的性能瓶颈/互斥锁?

编辑:我的代码运行python,但(几乎)每一次执行都是用c++代码。其中一些不是我的(Tensorflow和Eigen),我做了一个共享库,可以在Python中动态加载,它是由Tensorflow内核调用的。Tensorflow拥有自己的线程池,我的动态库代码也拥有线程池,我的代码是线程安全的。我还创建线程调用sess.run()并发,以便调用它们。像Python可以同时调用多个HTTP请求一样,sess.run()释放GIL。我的目标是尽可能地调用sess.run()以增加"真实"的性能,并且任何与python相关的分析器都不成功。

1)更多的线程并不意味着更快的速度。如果你有4核,你不能超过4乘以1核。

2)你应该做的是调整你的代码在单线程执行的最大性能(与编译器优化关闭),在你做了之后,打开编译器的优化器,使代码多线程,没有更多的线程比你有核心。

注:一个常见的误解是,性能调优只能在编译器优化的代码上进行。这解释了为什么不是这样