【问题标题】:Multiple models to load using multi-thread使用多线程加载多个模型
【发布时间】:2012-12-23 03:53:42
【问题描述】:

我有 180 个 SVM 模型要同时运行。 目前我在开始时将模型加载到数组中。 然后当我需要运行模型时,我使用 pthread 创建 180 个线程, 然后每个线程获取指向每个模型的指针,并进行一些计算。

我担心的是,每次我想做一些计算时创建 180 个线程可能会产生严重的开销(并且有很多计算要做)。 所以我想的是,一开始就将 SVM 模型加载到 180 个线程中,并在每次我想做一些计算时重用它们。

我的想法是否可行?将不同的模型加载到每个线程中并同时使用所有线程? 我考虑过线程池,但我认为这不是典型的线程池用例。 我将不胜感激任何建议。谢谢。

【问题讨论】:

  • 当然可行——为什么不呢?用一些合适的信号在顶部循环你的计算应该没问题。如果您可以避免不断创建/终止/销毁 180 个线程,那就太好了!不确定线程​​池问题 - 如果其中任何一个线程进行阻塞调用,180 个线程就可以了,但如果它们是 CPU 密集型的,您可能需要尝试任务/池解决方案。
  • 感谢您的回复!!我的任务实际上是 CPU 密集型的,所以我用“threadpool.sourceforge.net”做了一些测试。但是性能并不比使用 pthread 好。我猜由于 boost::thread 是 pthread 的包装器,因此在性能方面不可能有任何“大”的改进。我现在计划测试 OpenMP。如果这不起作用,我还不如坚持使用 pthread。

标签: multithreading pthreads threadpool


【解决方案1】:

您不能真正同时运行它们,除非您有 180 个 CPU 可供使用。否则,在线程相互争斗以取得进展时,您会浪费大量精力在线程之间切换。

更好的方法可能是创建与您可用的 CPU 或内核数量相近的线程,并将各个模型从队列中分配给线程。

假设您有 8 个内核希望用于此目的。创建 8 个“工作”线程,让每个线程从 180 个队列中挑选一个并处理它。当任何工作线程完成时,它会对上述 180 线程场景中的结果执行任何操作,并从队列中获取下一个 SVM 模型。继续此操作,直到处理完所有 180 个模型。

与一次 180 个线程相比,它可能需要更少的挂钟时间来完成,并且几乎肯定会减少系统上的资源负载。完成此设置后,您可以试验运行的工作线程数以确定池大小的最佳位置。

【讨论】:

  • 感谢您的提示!实际上,我已经使用上面提到的线程池方案进行了尝试。我使用的是 Xeon 12 核机器,所以自然 12 个“工作”线程给了我最好的结果。然后我尝试使用 OpenMP,得到的结果比 12 个“worker”线程方案略好(将挂钟时间从 256 秒减少到 249 秒)。我想 OpenMP 是要走的路,因为它更容易实现。
猜你喜欢
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 2020-01-23
  • 2018-05-03
  • 1970-01-01
  • 2021-02-21
相关资源
最近更新 更多