1

我正在开发一个进行大量数字运算的应用程序。它旨在在单台计算机上运行。最近,我们开始研究多线程以加快计算速度。一些算法可以毫不费力地并行运行,我使用一个固定的线程池来运行每个子任务。

我想知道的是:通常为这些算法指定的线程数(池的大小)如何?我怀疑这通常是通过使用配置文件或命令行参数来完成的,但我还没有看到任何这样的例子,所以我想知道是否有更好的方法。

与此相关:指定线程数是否相关?我在想将池大小设置为可分配内核的数量可能会运行得最快,但是在过度分配的情况下处理能力的线程争用甚至与性能相关吗?例如:在 4 核机器上设置 20 个最大线程会比设置 4 个最大线程更糟糕吗?

编辑:该应用程序打算出售,所以我不知道它将在什么计算机上运行。我正在寻找一般准则和最佳实践。

4

2 回答 2

2

一个经验法则是使用NUMBER_OF_CORES + 1线程(某些并行构建系统使用它) - 一个“备用”线程在另一个线程的 IO 期间工作。要查找核心数,请参阅此 SO question

于 2012-06-05T09:25:45.840 回答
0

线程的数量取决于几个因素,主要是你提到的硬件内核的数量,以及线程中正在解决/处理的问题。最好对不同的线程池大小进行一些试验和错误。

如果线程正在做的工作是像您提到的那样处理硬核数字,那么我不会期望通过使用比硬件内核更多的线程来提高性能。如果线程在必须等待外部实体(如网络)的地方工作,那么您可能会看到通过使用更多线程来提高性能。

于 2012-06-05T09:25:04.500 回答