2009-09-18 22 views
1

我编写了一个C程序,它从文件中读取数据集,然后应用数据挖掘算法来查找数据中的集群和类。目前我正试图用PThreads重写这个顺序程序多线程,并且我是新手并行编程,并且我对工作线程的数量感到困惑:如何确定工作线程的最佳数量

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

回答

2

这里有几个问题。

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

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

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

+0

我不打算在HPC或Grid上运行我的代码。所以在我的情况下,我只打算使用OpenMP和PThreads。所以我的考虑只是SMP。我发现这不是一件容易的事,而我目前采用的方法是通过估算并使用户能够根据需要将其从配置文件中更改。但是这并没有令我满意,所以我想知道现在是否有更好的技术。 – systemsfault 2009-09-18 08:41:26

2

基本上,您希望拥有尽可能多的随时可用的线程,因为您有可用的内核,或者至多还有1或2个线程,以确保没有可用的内核将空闲。诀窍在于估计有多少线程通常会被阻塞等待其他事情(主要是I/O),因为这完全依赖于您的应用程序,甚至是您的控制之外的外部实体(数据库,其他分布式服务等) 。最后,一旦确定了多少个线程应该是最优的,那么按照您的估计值运行基于线程池大小的基准测试是非常好的做法(至少它可以让您重复检查你的假设),特别是如果看起来你确实需要从系统中获得最后一滴性能!

+0

Thanx亚历克斯,但估计的线程数将取决于机器在这种情况下是不是。我试图找到一种便携式的方式。但实际上我试图找到的是某种形式(如果存在)。在阅读您的评论之后,我发现了以下论文,但还没有阅读: http://portal.acm.org/ citation.cfm?ID = 346152。346320 – systemsfault 2009-09-18 06:46:57

+0

线程的最佳数量如何能够在具有2个可用内核的计算机上相同,并且一个具有8个? _当然,这取决于机器;任何使得事情出现的“表述”只会是错误的**! - )。您引用的文章考虑到了系统性能特征,并基于分析服务器日志(仅针对Web或其他基于网络的服务的任何用途,但后来这就是本文所讨论的内容)来估计工作负载。 – 2009-09-18 14:51:26

相关问题