多线程-如何尽可能多地使用CPU
Multithreading - How to use CPU as much as possible?
我目前正在使用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)你应该做的是调整你的代码在单线程执行的最大性能(与编译器优化关闭),在你做了之后,打开编译器的优化器,使代码多线程,没有更多的线程比你有核心。
注:一个常见的误解是,性能调优只能在编译器优化的代码上进行。这解释了为什么不是这样
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 编写一个函数以使用 n 百分比的 CPU 使用率
- 如何禁用 CPU 的无序执行
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 分别测量每个线程上花费的 CPU 时间(C++)
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 我应该尽可能避免递归吗?
- 在程序运行时监视 VxWorks 中的任务 CPU 利用率
- 'std::wstring_convert'尽可能多地转换(从 UTF8 文件读取块)
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- 您选择的 CPU 不支持 x86-64 指令集
- 如何降低应用程序的 CPU 使用率?
- 对于 CPU 无法原子操作的类型,std::atomic 有什么意义?
- 如何区分CPU和内存瓶颈?
- 如何以编程方式获取任务管理器进程CPU使用率(不是PerfMon API)
- CPU 如何提供memory_order_acquire保证?
- 多线程-如何尽可能多地使用CPU
- 使用尽可能多的CPU内核编写一个超级UDP服务器