并行线程执行以实现性能

Parallel Thread Execution to achieve performance

本文关键字:实现 性能 执行 线程 并行      更新时间:2023-10-16

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

但是这里我遇到了一个情况,我必须使用多个并行线程执行相同的任务。

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

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

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

那么在上述情况下该怎么做,这些正确吗?

编辑

  1. 1线程工作。处理时间120秒。
  2. 2线程工作。处理时间约60秒。
  3. 3线程创建。处理时间约为60秒。(不更改为2个线程的时间)

是因为,我的硬件只能创建2个线程(为双)?

软件线程=一段代码
硬件线程=core(处理器),用于运行软件线程。

所以我的CPU只支持2个并发线程,所以如果我购买一个8核或12核的AMD CPU,我能实现更高的性能吗?

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

  1. 只有一部分应用程序可以并行工作(总是有第一部分将工作分成多个任务)。所以第一个问题是:有多少工作可以并行完成,有多少工作需要同步(在某些情况下,你可以停在这里,因为并行完成的工作太少了,整个工作都不值得)。
  2. 多个任务可能相互依赖(一个任务可能需要另一个任务的结果)。这些任务不能并行执行。
  3. 多个任务可能在相同的数据/资源上工作(读/写情况)。这里我们需要同步对这些数据/资源的访问。如果在整个进程中所有任务都需要对同一个对象进行写访问,那么我们就不能并行工作。

基本上,这意味着如果没有问题的确切定义(任务之间的依赖关系,对数据的依赖关系,并行任务的数量,…),就很难判断使用多线程会获得多少性能(以及它是否真的值得)。

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

Amdahl概括地说,你从并行执行中获得的性能提升受到你必须顺序运行的代码的限制。

在不了解问题空间的情况下,您应该查看以下一些一般内容:

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