Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 使用多线程加载多个模型_Multithreading_Pthreads_Threadpool - Fatal编程技术网

Multithreading 使用多线程加载多个模型

Multithreading 使用多线程加载多个模型,multithreading,pthreads,threadpool,Multithreading,Pthreads,Threadpool,我有180个SVM模型要同时运行。 目前,我在开始时将模型加载到一个数组中。 然后当我需要运行模型时,我使用pthread创建180个线程, 然后每个线程获取指向每个模型的指针,并进行一些计算 我担心的是,每次我想做一些计算时创建180个线程可能会产生严重的开销(还有很多计算要做)。 所以我想的是,在开始时将SVM模型加载到180个线程中,每次我想做一些计算时都重用它们 我的想法可行吗?将不同的模型加载到每个线程并同时使用所有线程? 我考虑过线程池,但我不认为这是一个典型的线程池用例。 我希望你

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

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

我的想法可行吗?将不同的模型加载到每个线程并同时使用所有线程? 我考虑过线程池,但我不认为这是一个典型的线程池用例。
我希望你能给我任何建议。谢谢。

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

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

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


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

确定它是可行的-为什么不可行?在你的计算中循环一段时间,在顶部加上一些合适的信号,应该可以。如果您可以避免持续创建/终止/销毁180个线程,那就太好了!不确定线程池问题-如果其中任何线程进行阻塞调用,180个线程都可以,但是如果它们是CPU密集型的,您可能需要尝试任务/池解决方案。谢谢您的回复!!我的任务实际上是CPU密集型的,所以我用“threadpool.sourceforge.net”做了一些测试。但是性能并不比使用pthread好多少。我想既然boost::thread是pthread的包装器,就性能而言就不会有任何“伟大”的改进。我现在计划测试OpenMP。如果这不起作用,我还不如继续使用pthread。谢谢你的提示!!实际上,我已经用上面提到的线程池方案尝试过了。我使用的是Xeon 12核机器,所以12个“工作”线程自然会给我最好的结果。然后我尝试使用OpenMP,得到了比12“工作者”线程方案略好的结果(将挂钟时间从256秒减少到249秒)。我想OpenMP是一个不错的选择,因为它更容易实现。