如何在运行时为绑定CPU的任务确定最佳线程数?

时间:2019-06-25 06:25:48

标签: java multithreading

我正在实现一个标准化大数据集(单个文件)的程序,它的运算量很大,因此受CPU限制。

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

Runtime.getRuntime().availableProcessors()

但是使用HT技术,单个内核可以同时处理两个线程。

先前的一些答案还指出,最佳线程=内核数,我不确定对于CPU密集型任务是否正确。

知道每个操作系统可能会以不同的方式执行并行编程,如果我仅使用availableProcessors()而不必考虑诸如以下的元素:

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

例如,我应该使用availableProcessors() * 每个核心的线程来获得最佳线程吗?它会引起线程竞争吗?

我正在寻找一种推荐的方法来实现这一目标,而不必在程序移至另一台计算机时修改和重建程序。(该程序仅在本地计算机上进行了测试)

谢谢。

1 个答案:

答案 0 :(得分:2)

如果您要为不受阻塞的CPU绑定任务寻找最佳线程号。

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中也有说明: Applications that are sensitive to the number of available processors should therefore occasionally poll this property and adjust their resource usage appropriately.

如果希望减少线程竞赛的开销,请查询此属性。