gpt4 book ai didi

java - 如何确定 CPU 绑定(bind)任务在运行时的最佳线程数?

转载 作者:行者123 更新时间:2023-12-03 12:46:35 24 4
gpt4 key购买 nike

我正在实现一个规范化大数据集(单个文件)的程序,它是数学密集型计算,因此受 CPU 限制。

查找一些最佳线程问题后,大多数会导致:

Runtime.getRuntime().availableProcessors()

但是采用超线程技术,单核可以同时处理两个线程。

之前的一些答案还指出最佳线程数 = 内核数,我不确定它是否适用于受 CPU 限制的任务。

知道每个操作系统执行并行编程的方式可能不同,我是否应该只使用 availableProcessors() 而不必考虑以下元素:

  • 每核心线程数
  • 每个插槽的内核数
  • CPU 插槽

例如,我是否应该使用 availableProcessors() * Thread(s) per core 来获得最佳线程?它会造成线程竞争吗?

我正在寻找实现此目的的推荐做法,而无需在程序移动到另一台机器时修改和重建程序。(该程序仅在本地机器上测试过)

提前致谢。

最佳答案

如果您正在尝试为非阻塞 CPU 绑定(bind)任务找到最佳线程数。

availableProcessors() 的 Javadoc:

public int availableProcessors()
Returns the number of processors available to the Java virtual machine.
This value may change during a particular invocation of the virtual machine. Applications that are sensitive to the number of available processors should therefore occasionally poll this property and adjust their resource usage appropriately.

Returns:
the maximum number of processors available to the virtual machine; never smaller than one
Since:
1.4

请注意这一行 - Returns the number of processors available to the Java virtual machine.

由于JVM运行在OS和Java程序之间,它不返回物理处理器的个数,而是返回JVM逻辑处理器的个数。(逻辑处理器和物理处理器的协调取决于JVM和OS JVM 正在运行。)

因此如果你有

  • 1 CPU 插槽
  • 每个插槽 4 个内核
  • 2 每个核心线程

availableProcessors() 应返回小于或等于 8 的整数,具体取决于运行时环境。另一个例子:

  • 2 个 CPU 插槽
  • 每个插槽 4 个内核
  • 2 每个核心线程

这将返回一个小于等于 16 的整数,具体取决于运行时环境。

因此最佳线程数应该等于availableProcessors()。但是,要获得实际的最佳线程数,最好还是对环境进行测试。由于您希望避免重建的复杂性,也许最好的做法是遵循 Javadoc 说明。

Javadoc 中也有说明:因此,对可用处理器数量敏感的应用程序应偶尔轮询此属性并适当调整其资源使用情况。

如果您希望减少线程争用开销,请查询此属性。

关于java - 如何确定 CPU 绑定(bind)任务在运行时的最佳线程数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56747988/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com