多线程与多处理

我是这种编程新手,需要你的观点

我必须构建一个应用程序,但我不能让它计算得足够快。我已经尝试过Intel TBB,它很容易使用,但我从未使用过其他库

在多处理器编程中,我正在阅读有关OpenMP和Boost的多线程技术,但我不知道它们的优缺点

在C++中,多线程编程何时与多处理器编程相比是有利的,反之亦然?哪种方法最适合于繁重的计算或启动许多任务?当我们构建用它们设计的应用程序时,它们的优缺点是什么?最后,哪一个库最适合使用

多线程就是指运行多个线程。这可以在单处理器系统或多处理器系统上完成

在单处理器系统上,当运行多个线程时,对计算机同时执行多个任务(即多任务)的实际观察是一种错觉,因为真正发生在引擎盖下的是有一个软件调度器在单CPU上执行时间切片。因此,在任何给定的时间只有一个任务发生,但调度程序在任务之间切换的速度足够快,因此您永远不会注意到有多个进程、线程等在争夺同一CPU资源

在多处理器系统上,减少了时间切片的需要。时间切片效应仍然存在,因为现代操作系统可能有数百个线程争夺两个或更多处理器,而且线程数量与可用处理内核数量之间通常不存在1对1的关系。因此,在某个时刻,一个线程必须停止,另一个线程在两个线程共享的CPU上启动。这同样由操作系统的调度程序处理。这就是说,与单处理器系统不同,多处理器系统可以同时发生两件事

最后,这两种范式在某种意义上确实是正交的,即当您想要异步运行两个或多个任务时,就需要多线程,但由于时间切片,您不一定需要多处理器系统来完成这一点。如果您正在尝试运行多个线程,并且正在执行高度并行的任务(即,尝试求解整数),那么是的,您可以在一个问题上抛出的内核越多越好。您不一定需要线程和处理内核之间的1对1关系,但同时,您也不希望剥离太多线程,最终导致大量空闲线程,因为它们必须等待在一个可用的CPU内核上进行调度。另一方面,如果并行任务需要某些顺序组件,即一个线程将等待另一个线程的结果,然后才能继续,那么您可以使用某种类型的屏障或同步方法运行更多线程,以便需要空闲的线程不会使用CPU时间旋转,而且只有需要运行的线程在争夺CPU资源

发表评论