使用大规模CPU的多线程与多处理

时间:2018-11-07 21:46:34

标签: c windows multithreading multiprocessing cpu-usage

我有想要在Windows上尽可能快地运行的C代码

此代码在数字范围内运行,并对每个数字执行大量的cpu工作。

每个数字独立于其他数字。

因为我想要最快的速度,所以我希望在我所有的CPU内核上运行它。

我现在要做的是,例如,我需要在0-1000的范围内运行,并且我有10个内核,我创建了10个c代码进程,并将它们之间的工作分开。

Process1在0-100范围内运行,process2在100-200范围内运行,依此类推。

我们知道将每个进程分开使用不同的内核(因为每个进程使用大量的cpu),所以当我查看任务管理器时,我所有的内核都是100%的使用率。

通过这种方式,每个流程的运行时间约为5小时(因此分配时间可以忽略不计)

如果我将为每个核心创建线程(而不是为每个核心创建进程),我知道操作系统会知道将线程与核心分开,这样会更快吗?

也许进程具有不同的调度程序或其他功能,所以线程将运行得更快。

也许很多进程会降低操作系统与1个进程中的线程的速度

2 个答案:

答案 0 :(得分:0)

  

如果我将为每个核心创建线程(而不是为每个核心创建进程),   知道操作系统会知道将线程与内核分开,这是   更快?

OS知道如何高效地向内核分配线程-但是,OS也知道如何以高效的方式向内核分配进程,因此,仅通过切换到将多进程模块转换为多线程模型。也就是说,您已经获得了希望获得的好处。

对于这样的问题,您最好寻找优化处理循环的方法(例如,也许可以使用SSE指令或找到更有效的算法?)

答案 1 :(得分:-1)

  

简单的解释:https://www.techopedia.com/definition/24297/multithreading-computer-architecture

     

多线程是一种执行模型,它允许多个线程存在于进程的上下文中,以便它们独立执行但共享进程资源。线程在其宿主进程的地址空间中维护与其执行相关的信息列表,包括优先级调度,异常处理程序,一组CPU寄存器以及堆栈状态。

     

通过允许主执行线程响应用户输入,线程可以在单处理器系统中使用,而其他工作线程可以执行不需要用户在后台干预的长时间运行的任务。多处理器系统中的线程可在多个处理器之间真正并发执行线程,因此速度更快。但是,它需要更仔细的编程,以避免出现非直觉的行为,例如赛车条件,死锁等。

     

操作系统通过两种方式使用线程处理:

     

抢先式多线程,其中上下文切换由操作系统控制。上下文切换可能在不适当的时间执行,因此,高优先级线程可能被低优先级线程间接抢占。

     

协作多线程,其中上下文切换由线程控制。如果线程在等待资源释放时被阻塞,则可能导致死锁之类的问题。

     

Windows的32位和64位版本使用抢占式多线程,其中共享可用处理器时间,以便所有线程获得相等的时间片并在队列中进行服务-基于模式。在线程切换期间,已抢占线程的上下文被存储并重新加载到队列中的下一个线程中。时间片是如此之短,以至于正在运行的线程似乎是并行执行的。

我认为您的问题很快进入了并行编程领域,在较小程度上,给定的操作系统如何行为和处理进程或线程。

刺中答案,并尽可能快地运行

  • 您不希望启动一个可执行文件的多个实例,当然也不希望在Windows中启动
  • 我在Windows中一无所知,但是在Linux中,有一种称为 CPU亲和力的功能,它将在线程的生命周期内将给定线程锁定到特定的内核,否则linux在运行系统可以将其反弹到不同的内核……linux认为它可以尽可能高效地管理所有正在进行的工作;如果目标是尽可能快地运行代码,则不是这种情况,因为将线程转移到不同的CPU内核会产生开销。
  • 您想使用 OpenMP PTH (称为pthreads)对C代码进行重新编程。 Openmp是使用C中的指令并由C编译器处理的高级语言,使并行编程相对容易。 PTH是更细粒度的编程,可能很难为其学习和编写代码,但是使用PTH 可以允许您编写运行速度最快的代码。 PTH中的并行编程是否比OpenMP更快,我一直在争论,在我看来,这很大程度上取决于您要实现的算法。
  • 并且根据您的算法,最快的方法可能是使用CUDA的GPU内核,前提是您拥有NVidia显卡。 我相信ATI / AMD卡现在也可以做类似的事情,但是我不知道它们的术语。
  • 多进程基本上是针对应用程序或同时执行完全独立的程序的;多线程是同一程序或进程的较小的多任务,并且开销较小,并且可以更快地满足您的需求;查找多进程和多线程之间的差异。进程间的通信占用大量资源,在这种情况下应避免使用,不要创建多个进程。