使用超线程多核 CPU 时如何确定最佳 java 线程数
How to determine the optimal number of java threads when using a hyperthreaded multi core CPU
我的 CPU 是 8x2600 MHz(Intel Xeon CPU E5-2670 0 @ 2.60GHz)。
我有一个数据处理算法可以运行并行写成Java。此函数确定 运行 时间内的并发线程数
Runtime.getRuntime().availableProcessors()
其中 returns 8.
这个算法是 100% 非阻塞的。
CPU 支持每个核心 2 个线程的超线程。
现在我应该 运行 使用 8 个线程的算法,因为 Java 只看到 8 个内核,或者我应该使用 16 个 Java 线程,考虑到CPU?
理想的线程数取决于任务本身。由于计算中使用的数据被大量缓存,现代 CPU 中的上下文切换可能有些昂贵。
考虑没有 IO 相关活动并且 CPU 周期不需要浪费等待的情况。那么最大吞吐量将通过 n_threads = n_cores 来实现。即使超线程可用,上下文切换也可能很昂贵。但是如果有 IO 活动,将线程数增加到超过内核数可能会受益。
我的 CPU 是 8x2600 MHz(Intel Xeon CPU E5-2670 0 @ 2.60GHz)。
我有一个数据处理算法可以运行并行写成Java。此函数确定 运行 时间内的并发线程数
Runtime.getRuntime().availableProcessors()
其中 returns 8.
这个算法是 100% 非阻塞的。 CPU 支持每个核心 2 个线程的超线程。
现在我应该 运行 使用 8 个线程的算法,因为 Java 只看到 8 个内核,或者我应该使用 16 个 Java 线程,考虑到CPU?
理想的线程数取决于任务本身。由于计算中使用的数据被大量缓存,现代 CPU 中的上下文切换可能有些昂贵。 考虑没有 IO 相关活动并且 CPU 周期不需要浪费等待的情况。那么最大吞吐量将通过 n_threads = n_cores 来实现。即使超线程可用,上下文切换也可能很昂贵。但是如果有 IO 活动,将线程数增加到超过内核数可能会受益。