如何确定最佳工作线程数

时间:2009-09-18 06:25:22

标签: parallel-processing

我编写了一个C程序,它从文件中读取数据集,然后应用数据挖掘算法来查找数据中的集群和类。目前我正在尝试用PThreads重写这个顺序程序多线程,我是一个并行编程的新手,我有一个关于工作线程数量问题的问题:

执行并行编程时查找工作线程数的最佳做法是什么?如何确定?您是否尝试不同数量的线程并查看其结果然后确定或是否有一个程序来找出最佳线程数。当然,我正从表现的角度来研究这个问题。

2 个答案:

答案 0 :(得分:2)

您基本上希望拥有与可用内核一样多的可立即运行的线程,或者最多只有1或2个以确保没有可用的内核将永久保持空闲状态。诀窍在于估计通常会阻塞多少线程等待其他东西(主要是I / O),因为这完全取决于您的应用程序甚至是您无法控制的外部实体(数据库,其他分布式服务等等)

最后,一旦你确定了多少线程应该是最优的,正如你的建议,运行基于你的估计值的线程池大小的基准是很好的做法(至少,它可以让你仔细检查你的假设),特别是如果看起来你需要从你的系统中获得最后一滴性能!

答案 1 :(得分:2)

这里有几个问题。

  1. 正如Alex所说,您可以使用的线程数量是特定于应用程序的。但是,您尝试解决的问题的类型也存在约束。您的线程是否需要彼此通信,或者它们是否可以单独处理问题的各个部分?如果他们需要交换数据,那么将有最大数量的线程超出线程间通信将占主导地位,并且您将看不到进一步的加速(实际上,代码将变得更慢!)。如果他们不需要交换数据,那么等于处理器数量的线程可能接近最优。

  2. 动态调整线程池到底层架构以提高运行速度并非易事!您需要大量额外的代码来对函数进行运行时分析。例如,参见FFTW并行工作的方式。这当然是可能的,但是非常先进,如果您不熟悉并行编程,那将很难。如果相反核心数量估计就足够了,那么尝试在运行时从OS确定这个数字并相应地生成你的线程将是一件容易的工作。

  3. 回答你关于技术的问题:大多数大型并行代码都运行在具有已知架构的超级计算机上,需要很长时间才能运行。最佳数量的处理器不仅仅是数字的函数,还包括通信拓扑(处理器如何链接)。因此,它们受益于测试阶段,其中通过测量小问题所花费的时间来确定最佳处理器数量。这通常是手工完成的。如果可能的话,应始终优先进行分析,以便根据理论考虑进行猜测。