比方说,我有一个4个CPU的主板。根据英特尔,每个CPU都有8个内核/ 16个线程。Ruby 2:叉/线程,如何计算特定机器的效率?
现在,假设我有一些疯狂的字符串操作任务需要几天时间才能完成。 有没有一种方法可以计算出多少分叉和线程可以产生最佳性能? 我不知道我应该启动多少分支和线程。另外,我不确定是否启动线程甚至会使我受益?
我特别感兴趣的是Ruby,因为我不确定Ruby 2 Threads如何与例如C++线程。
比方说,我有一个4个CPU的主板。根据英特尔,每个CPU都有8个内核/ 16个线程。Ruby 2:叉/线程,如何计算特定机器的效率?
现在,假设我有一些疯狂的字符串操作任务需要几天时间才能完成。 有没有一种方法可以计算出多少分叉和线程可以产生最佳性能? 我不知道我应该启动多少分支和线程。另外,我不确定是否启动线程甚至会使我受益?
我特别感兴趣的是Ruby,因为我不确定Ruby 2 Threads如何与例如C++线程。
经验法则:1个进程或每个CPU线程的操作系统线程。
对于Ruby,至少MRI Ruby,这会转换为每个CPU线程1个分支,因为MRI Ruby线程不能真正并行执行。
这取决于您使用的算法的具体情况。实际上没有任何一般规则。
考虑一个任务类似如下:
现在,假设此任务每小时移动1,000个小部件。如果添加第二辆卡车,您每小时会移动多少个小部件?那么,你当然可以推断它每小时不会超过2,000个小部件。
为什么它会少一点?那么,如果驾驶只需要很少的时间,卡车会花费大量时间等待装载机或卸载机完成其他卡车?如果道路狭窄而卡车不能轻易绕过彼此呢?
所以为了解,您必须了解算法使用的资源以及它如何使用它们。一般来说,预测唯一现实的选择是衡量是很困难的。您可能会发现将算法更改为并行性更好的算法是可能的。
在MRI Ruby中,由于全局解释器锁(GIL),在多线程中运行CPU绑定进程几乎没有好处,这基本上意味着在任何时候只有一个用户级线程处于活动状态,每个Ruby进程。 JRuby没有这个限制。
在MRI Ruby中,您可以使用单独的进程(通过Process.fork
)完成并行工作。进程之间的通信比线程之间有更多的开销,但是如果一个问题是非常简单的并行处理,那么这不是什么大问题。
这可能是(MRI)Ruby和C++之间的主要区别。然而,如果你有一个密集的过程来编写代码,那么Ruby并不是一种前往的语言 - 至少不是你想解决的核心问题。用C,C++或Java编写大部分处理代码可能更可取,使用Ruby可能用于编组输入和输出。这与线程模型无关,但是一个编写良好的C库比用纯Ruby编写的相同的东西要快100倍,如果你正在谈论一个需要花费一周时间在Ruby上运行多个核心的过程,那么投资在不同的语言将会很好的支付(它可能只需要几个小时,或者你可以在同一时间或更少的时间在同一时间内完成而不需要使用线程)
没有通用公式用于确定有多少线程或进程最适合问题。在最大限度地利用可用CPU之前,您可能会遇到管理开销,使用的内存总量等方面的限制。你应该基准表现。显然,可用内核的数量是一个重要因素,可能是一个很好的猜测,即从每个内核1个线程(或进程)开始。
这个问题非常依赖于解释器。我不认为Ruby规范对线程性能有任何要求。 – Max