【问题标题】:Multithreading - How to use CPU as much as possible?多线程 - 如何尽可能多地使用 CPU?
【发布时间】:2017-03-06 05:03:10
【问题描述】:

我目前正在使用 C++ 实现 Tensorflow 自定义操作(用于自定义数据获取器),以加快我的 Tensorflow 模型。由于我的 Tensorflow 模型不经常使用 GPU,我相信我可以同时使用多个工作线程来实现最大性能。

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

有了更多的工作线程和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 相关的分析器都没有成功。

【问题讨论】:

  • 我觉得你有点自相矛盾。首先你提到“我的程序利用所有cpu”,然后你说“有没有什么经验法则可以最大限度地利用CPU”。那么你想增加 CPU 负载还是减少它呢?
  • @SingerOfTheFall 这是错字。固定。
  • 您应该首先使用分析器来查找瓶颈。对于它的价值,CPU 可能大部分时间都在等待从内存/磁盘中获取数据。
  • 有了更多的工作线程...我的模型运行性能变得更差了 -- 假设你使用的是 CPython,多线程会影响 CPU-bound 性能,因为只有 1 个线程在 Python 中一次工作,但由于线程如何获取和释放全局解释器锁,最终会产生很多开销。要改进 CPU 密集型工作,您需要多个进程。还要考虑到您的瓶颈实际上可能不是 CPU。
  • @sytech AFAIK tensorflow 的 sess.run() 发布 GIL,因此通常同时调用 sess.run() 函数。 stackoverflow.com/a/34420169

标签: python c++ multithreading tensorflow profiling


【解决方案1】:

1) 更多线程并不意味着更高的速度。如果你有 4 个核心,你的速度不能超过 1 个核心的 4 倍。

2) 你应该做的是tune your code for maximum performance in single-thread execution (with compiler optimization turned off),在你完成之后,打开编译器的优化器并使代码多线程,线程数不超过内核数。

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

【讨论】:

    猜你喜欢
    • 2010-09-27
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    相关资源
    最近更新 更多