use*_*396 9 java cpu multithreading gpu
我对某事感到困惑.我所知道的是,在现代计算机的普通CPU上可以并发运行的最大线程数范围为8到16个线程.另一方面,使用GPU可以同时运行数千个线程,而调度程序不会中断任何线程来安排另一个线程.在几个帖子中: Java虚拟机 - 最大线程数 https://community.oracle.com/message/10312772 人们说他们在普通CPU上同时运行数千个Java线程.这怎么可能?我怎么知道可以并发运行的最大线程数,以便我的代码根据底层架构自动动态调整它.
线程不受可用处理器/核心数量的限制或限制.操作系统调度程序可以在单个CPU上的任意数量的线程之间来回切换.这就是"抢先式多任务处理"的含义.
当然,如果你有超过内核更多的线程,并不是所有的线程将被执行同步.有些将被暂停,等待一个时间段.
实际上,您可以拥有的线程数受调度程序的限制 - 但该数字通常非常高(数千或更多).它将因操作系统和操作系统以及各个版本而异.
从性能的角度来看,有多少线程是有用的,正如您所说,它取决于可用处理器的数量以及任务是IO还是CPU绑定.尝试找到最佳数字,并尽可能使其可配置.
在任何给定时间,处理器运行的线程数等于所包含的核心数。这意味着在单处理器系统上,在任何给定时刻只有一个线程(或没有线程)正在运行。
然而,处理器不会一个接一个地运行每个线程,而是在多个线程之间快速切换以模拟并发执行。如果不是这种情况,更不用说创建多个线程了,您甚至无法启动多个应用程序。
java 线程(与处理器指令相比)是供 CPU 处理的一组指令的非常高级的抽象。当深入到处理器级别时,无法保证在任何给定时间哪些线程将在哪个内核上运行。但考虑到处理器在这些线程之间快速切换,理论上可以创建无限数量的线程,尽管是以性能为代价的。
如果您想一想,现代计算机有数千个线程同时运行(组合所有应用程序),而核心数量只有 1 ~ 16 个(典型情况)。如果没有这种任务切换,什么也完成不了。
如果您正在优化应用程序,则应该根据手头的工作而不是底层架构来考虑所需的线程数量。并行性带来的性能提升应与线程执行开销的增加进行权衡。由于每台机器都不同,每个运行时环境也不同,因此计算出一些黄金线程数是不切实际的(但是,可以通过基准测试和查看核心数量来进行大致估计)。
存在硬件和软件并发。8 到 16 个线程是指您拥有的硬件 - 即一个或多个带有硬件的 CPU,可以并行执行 8 到 16 个线程。数千个线程是指软件线程的数量,调度程序必须将它们换出,以便每个软件线程都有自己的时间片在硬件上运行。
要获取硬件线程数,您可以尝试Runtime.availableProcessors().
| 归档时间: |
|
| 查看次数: |
17537 次 |
| 最近记录: |