c - C/Linux:如何找到要使用的完美线程数,以最大限度地减少执行时间?
问题描述
假设我有一个包含 N 个数字的向量。我必须对向量进行计算,因此我将为每个线程分配向量的一部分以进行计算。例如,我有 100 个元素,10 个线程,所以第一个线程将处理 0..9 个元素,第二个线程将处理 10..19 个元素,依此类推。如何找到完美的线程数以最小化执行时间。当然,我们会认为 N 是一个相当大的数字,因此我们可以观察差异。执行时间最少所需的线程数与我机器上的内核数之间有什么关系?
解决方案
没有确切的公式或关系,但您可以根据您的用例来判断它。
通过使用多线程,您可以决定要优化哪个性能指标:
- 潜伏
- 吞吐量
您的用例有一个任务,需要在尽可能短的时间内执行。因此我们需要专注于优化延迟。
N
正如您在问题中提到的那样,为了改善延迟,每个任务都可以分为假设子任务。
多线程并不总是可以帮助您最小化运行时间,例如:如果输入大小很小(比如说,100),那么您的多线程程序可能最终会比单线程程序花费更多的时间,因为线程管理的成本是涉及。对于大输入,这可能不是真的。
因此,对于任何用例,最好的方法是依赖一些实时指标,讨论如下:
对于大小为 N 的数组,您可以绘制一个Latency
vsNumber 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 多线程、并发和性能优化的精彩课程。
推荐阅读
- bash - Unix中的日志文件被覆盖
- javascript - 在 routes.js 文件中导入存储导致开玩笑错误(vuejs)
- spring - Kotlin Spring MongoDB 从文档中删除 _class
- api - Google 数据流 api 返回空结果
- r - 我如何计算 Rstudio 每周不同的破产情况?
- python - 删除在 Pandas 中作为另一行的子字符串找到值的行
- javascript - 建议需要使用javascript代码处理这类问题
- java - 杰克逊 ObjectMapper 在 Spring 的生命周期
- python - 如何在 KivyMD 中编写可重复使用的按钮?
- python - 熊猫更新未反映在 jupyter 笔记本中