Parallel processing 如何确定最佳工作线程数

Parallel processing 如何确定最佳工作线程数,parallel-processing,Parallel Processing,我编写了一个C程序,从文件中读取数据集,然后应用数据挖掘算法来查找数据中的集群和类。目前,我正试图用PThreads重写这个多线程的顺序程序,我是并行编程的新手,我有一个关于工作线程数量的问题,这让我很困惑: 当您进行并行编程时,找到工作线程数的最佳实践是什么?如何确定它?您是否尝试不同数量的线程并查看其结果,然后确定,或者是否有一个过程来找出最佳线程数量。当然,我是从性能的角度来研究这个问题的。基本上,您希望在有可用内核的情况下有尽可能多的准备好运行的线程,或者最多1或2个线程,以确保您可用的

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


当您进行并行编程时,找到工作线程数的最佳实践是什么?如何确定它?您是否尝试不同数量的线程并查看其结果,然后确定,或者是否有一个过程来找出最佳线程数量。当然,我是从性能的角度来研究这个问题的。

基本上,您希望在有可用内核的情况下有尽可能多的准备好运行的线程,或者最多1或2个线程,以确保您可用的任何内核都不会闲置。诀窍在于估计有多少线程通常会被阻止等待其他东西(主要是I/O),因为这完全取决于您的应用程序,甚至取决于您无法控制的外部实体(数据库、其他分布式服务等)


最后,一旦您确定了多少线程应该是最佳的,按照您的建议,围绕您的估计值运行线程池大小的基准测试是一种很好的做法(至少,它可以让您再次检查您的假设),特别是如果您确实需要从系统中获得最后一次性能下降

基本上,您希望在有可用内核的情况下有尽可能多的准备运行线程,或者最多有1到2个线程,以确保没有可用的内核处于空闲状态。诀窍在于估计有多少线程通常会被阻止等待其他东西(主要是I/O),因为这完全取决于您的应用程序,甚至取决于您无法控制的外部实体(数据库、其他分布式服务等)


最后,一旦您确定了多少线程应该是最佳的,按照您的建议,围绕您的估计值运行线程池大小的基准测试是一种很好的做法(至少,它可以让您再次检查您的假设),特别是如果您确实需要从系统中获得最后一次性能下降

这里有几个问题

  • 正如Alex所说,可以使用的线程数量是特定于应用程序的。但是,您试图解决的问题类型也存在一些限制。您的线程是否需要彼此通信,或者它们是否都可以在问题的各个部分上独立工作?如果他们需要交换数据,那么线程间通信将占主导地位的线程数量将达到最大值,并且您将看不到进一步的加速(事实上,代码将变慢!)。如果它们不需要交换数据,那么等于处理器数量的线程可能接近最优

  • 在运行时根据底层体系结构动态调整线程池以提高速度不是一件容易的事情!您将需要大量额外的代码来对函数进行运行时评测。例如,请参见并行工作的方式。这当然是可能的,但是非常高级,如果您是并行编程新手,那么这将非常困难。相反,如果估计的内核数量足够,那么在运行时尝试从操作系统中确定这个数量并相应地生成线程将是一件容易得多的工作


  • 回答你们关于这项技术的问题:大多数大型并行代码运行在具有已知体系结构的超级计算机上,需要很长时间才能运行。处理器的最佳数量不仅是数量的函数,而且是通信拓扑(处理器之间的链接方式)的函数。因此,他们从测试阶段中受益,测试阶段通过测量小问题所花费的时间来确定处理器的最佳数量。这通常是手工完成的。如果可能的话,分析应该总是比基于理论考虑的猜测更可取。

    这里有几个问题

  • 正如Alex所说,可以使用的线程数量是特定于应用程序的。但是,您试图解决的问题类型也存在一些限制。您的线程是否需要彼此通信,或者它们是否都可以在问题的各个部分上独立工作?如果他们需要交换数据,那么线程间通信将占主导地位的线程数量将达到最大值,并且您将看不到进一步的加速(事实上,代码将变慢!)。如果它们不需要交换数据,那么等于处理器数量的线程可能接近最优

  • 在运行时根据底层体系结构动态调整线程池以提高速度不是一件容易的事情!您将需要大量额外的代码来对函数进行运行时评测。例如,请参见并行工作的方式。这当然是可能的,但是非常高级,如果您是并行编程新手,那么这将非常困难。相反,如果估计的内核数量足够,那么在运行时尝试从操作系统中确定这个数量并相应地生成线程将是一件容易得多的工作


  • 回答你们关于这项技术的问题:大多数大型并行代码运行在具有已知体系结构的超级计算机上,需要很长时间才能运行。处理器的最佳数量不仅是数量的函数,而且是通信拓扑(处理器之间的链接方式)的函数。因此,他们从测试阶段中受益,测试阶段通过测量小问题所花费的时间来确定处理器的最佳数量。这通常是手工完成的。如果可能的话,基于理论上的考虑,评测应该总是优先于猜测。

    Thanx Alex,但在这种情况下,估计的线程数将取决于机器,不是吗。我是