并行线程执行以实现性能

时间:2014-07-01 07:11:01

标签: c++ multithreading parallel-processing threadpool

我对多线程有点困惑。实际上,我们创建了多个线程,用于将主进程分解为子进程,以实现响应性并消除等待时间。

  

但是在这种情况下,我必须使用多个线程并行执行相同的任务。

我的处理器可以并行执行4个线程,因此如果我创建更多4个线程(10个或更多),它会改善性能吗?当我把这个问题提交给我的同事时,他告诉我们什么都不会发生,我们已经在许多其他应用程序中执行许多线程,比如浏览器线程,内核线程等等,所以他告诉我为同一个任务创建多个线程。

  

但是,如果我创建超过4个将执行并行的线程,则不会创建更多的上下文切换并降低性能。

     

或者即使我们创建了多个并行执行的线程,它们将一个接一个地执行,因此性能将是相同的。

那么在上述情况下该怎么做才是正确的?

修改

  1. 1 线程工作。处理120秒的时间。
  2. 2 线程有效。处理时间约为60秒。
  3. 3 创建了线程。处理时间大约是60秒。(不要改为2个线程的时间。)
  4. 是不是因为,我的硬件只能创建2个线程(双重)?

    软件线程=一段代码
    硬件线程=运行软件线程的核心(处理器)。

    所以我的CPU只支持2个并发线程,所以如果我购买的是具有8个内核或12个内核的AMD CPU,我可以获得更高的性能吗?

2 个答案:

答案 0 :(得分:1)

多任务处理非常复杂,性能提升通常很大程度上取决于问题本身:

  1. 只有部分应用程序可以并行工作(总是有第一部分将工作分成多个任务)。所以第一个问题是:可以并行完成多少工作以及需要同步多少工作(在某些情况下,你可以在这里停下来,因为并行完成的工作很少,因此整个工作都没有。值得的。)
  2. 多个任务可能相互依赖(一个任务可能需要另一个任务的结果)。这些任务无法并行执行。
  3. 多个任务可能对相同的数据/资源(读/写情况)起作用。在这里,我们需要同步对这些数据/资源的访问。如果在整个过程中所有任务都需要对同一对象的写访问权限,那么我们就无法并行工作。
  4. 基本上这意味着如果没有问题的确切定义(任务之间的依赖关系,数据的依赖关系,并行任务的数量......),很难说出你将获得多少性能通过使用多个线程(如果它真的值得)。

答案 1 :(得分:0)

http://en.wikipedia.org/wiki/Amdahl%27s_law

Amdahl简而言之,您从并行执行中获得的性能提升受到必须按顺序运行的代码的限制。

在不知道您的问题空间的情况下,您应该看一些常见的事情:

  • 重构以消除互斥锁/锁。根据定义,它们会强制代码按顺序运行。
  • 通过将线程固定到物理内核来减少上下文切换开销。当线程必须等待工作(即阻塞IO)时,这会变得更加复杂,但一般情况下,您希望尽可能保持核心运行程序而不是切换线程。
  • 除非您绝对需要使用线程和同步原语,否则请尝试使用任务调度程序或并行算法库来并行化您的工作。例如英特尔TBB,Thrust或Apple的libDispatch。