首页 > 解决方案 > C/Linux:如何找到要使用的完美线程数,以最大限度地减少执行时间?

问题描述

假设我有一个包含 N 个数字的向量。我必须对向量进行计算,因此我将为每个线程分配向量的一部分以进行计算。例如,我有 100 个元素,10 个线程,所以第一个线程将处理 0..9 个元素,第二个线程将处理 10..19 个元素,依此类推。如何找到完美的线程数以最小化执行时间。当然,我们会认为 N 是一个相当大的数字,因此我们可以观察差异。执行时间最少所需的线程数与我机器上的内核数之间有什么关系?

标签: clinuxmultithreading

解决方案


没有确切的公式或关系,但您可以根据您的用例来判断它。

通过使用多线程,您可以决定要优化哪个性能指标:

  1. 潜伏
  2. 吞吐量

您的用例有一个任务,需要在尽可能短的时间内执行。因此我们需要专注于优化延迟

N正如您在问题中提到的那样,为了改善延迟,每个任务都可以分为假设子任务。

多线程并不总是可以帮助您最小化运行时间,例如:如果输入大小很小(比如说,100),那么您的多线程程序可能最终会比单线程程序花费更多的时间,因为线程管理的成本是涉及。对于大输入,这可能不是真的。

因此,对于任何用例,最好的方法是依赖一些实时指标,讨论如下:

对于大小为 N 的数组,您可以绘制一个LatencyvsNumber Of Threads图并检查最适合您的用例的内容。

例如,看看下面的情节:

在此处输入图像描述

从上图中,我们可以得出结论,对于一个恒定大小 N 的数组和一个具有 4 个内核的处理器,

Optimal number of threads = 6。_

一般来说,我们更喜欢Number of threads= Number of cores of the processor

从上图中可以看出,这个等式并不总是正确的。该处理器有 4 个内核,但通过使用 6 个线程实现了最佳延迟。

现在,对于每个 N,您都可以测试有助于优化用例的最佳参数。

PS:你可以研究一下虚拟核心的概念,在我们将线程数从6个增加到8个之后,找出延迟开始增加的原因。

PS:图片的全部功劳归于 Michael Pogrebinsky和他关于 Udemy - Java 多线程、并发和性能优化的精彩课程。


推荐阅读