我有一台拥有4个核心的计算机,我有一个程序可以创建一个N x M网格,其范围可以从1 x 1平方到大网格。程序然后用数字填充它并对每个数字进行计算,将它们一起平均,直到它们达到大致相同的数字。这样做的目的是创建大量繁忙的工作,因此使用并行线程进行计算是必要的。
如果我们有一个可选参数来选择使用的线程数,那么有多少线程可以最好地优化忙碌工作以使其尽快运行?
使用4个线程的速度是使用1个线程的4倍吗? 15线程怎么样? 50?在某些时候,我觉得我们将受到计算机硬件(核心数量)的限制,添加更多线程将停止帮助(甚至可能会阻碍?)
答案 0 :(得分:1)
我认为回答的最佳方式是首先概述系统如何管理线程。如今所有处理器实际上都是每核多核和多线程,但为了简单起见,我们首先想象一下单线程的单核处理器。这在当时只执行一项任务时受到限制,但我们仍然能够运行多任务程序。
那怎么可能呢?嗯它只是幻觉!
当时CPU仍在执行单个任务,但在一个和另一个之间切换会产生多任务处理的错觉。从一个任务更改为另一个任务的过程名为Context switching。
在上下文切换期间,将保存与正在运行的任务相关的所有数据,并加载与下一个任务相关的数据。根据CPU的体系结构,数据可以保存在寄存器,缓存,RAM等中。技术越发展,就会发现性能越高的解决方案。当任务恢复时,将获取整个数据并且任务继续其操作。
这个概念在管理任务时引入了许多问题,例如:
还有其他一些观点,但这只是一个快速列表,因为问题并没有集中于此。
回到你的问题:
如果我们有一个可选参数来选择使用的线程数,那么有多少线程可以最好地优化忙碌工作以使其尽快运行?
使用4个线程的速度是使用1个线程的4倍吗? 15线程怎么样? 50?在某些时候,我觉得我们将受到计算机硬件(核心数量)的限制,添加更多线程将停止帮助(甚至可能会阻碍?)
简短回答:这取决于!
如前所述,要在任务和另一个任务之间切换,需要一个Context开关。要执行此操作,需要一些存储和获取数据操作,但这些操作只是计算开销,并不直接为您提供任何优势。因此,执行太多任务需要大量的Context切换,这意味着浪费了大量的计算时间!因此,最终您的任务可能比较少的任务运行得慢。
此外,由于您使用pthreads标记了此问题,因此还需要检查代码是否已编译为在多个HW内核上运行。拥有多核CPU并不能保证您的多任务代码将在多个HW内核上运行!
在您的特定申请案例中:
我有一台拥有4个核心的计算机,我有一个程序可以创建一个N x M网格,其范围可以从1 x 1平方到大网格。程序然后用数字填充它并对每个数字进行计算,将它们一起平均,直到它们达到大致相同的数字。这样做的目的是创建大量繁忙的工作,因此使用并行线程进行计算是必要的。
是并发和数据独立计算的一个很好的例子。这类任务在GPU上运行良好,因为操作没有数据关联,并且在硬件中执行并发计算(现代GPU有数千个计算核心!)