并行线程执行以实现性能
Parallel Thread Execution to achieve performance
我对多线程有点困惑。实际上,我们创建多个线程是为了将主进程分解为子进程,以实现响应并消除等待时间。
但是这里我遇到了一个情况,我必须使用多个并行线程执行相同的任务。
我的处理器可以并行执行4个线程,所以如果我创建更多的线程(10个或更多),它会提高性能吗?当我把这个问题告诉我的同事时,他告诉我什么也不会发生,我们已经在许多其他应用程序中执行了许多线程,比如浏览器线程,内核线程等,所以他告诉我要为同一个任务创建多个线程。
但是如果我创建超过4个并行执行的线程,将不会产生更多的上下文切换和降低性能。
或者即使我们创建多个线程并行执行,也会一个接一个地执行,因此性能将是相同的。
那么在上述情况下该怎么做,这些正确吗?
编辑
- 1线程工作。处理时间120秒。
- 2线程工作。处理时间约60秒。
- 3线程创建。处理时间约为60秒。(不更改为2个线程的时间)
是因为,我的硬件只能创建2个线程(为双)?
软件线程=一段代码
硬件线程=core(处理器),用于运行软件线程。
所以我的CPU只支持2个并发线程,所以如果我购买一个8核或12核的AMD CPU,我能实现更高的性能吗?
多任务处理非常复杂,性能的提高通常很大程度上取决于问题本身:
- 只有一部分应用程序可以并行工作(总是有第一部分将工作分成多个任务)。所以第一个问题是:有多少工作可以并行完成,有多少工作需要同步(在某些情况下,你可以停在这里,因为并行完成的工作太少了,整个工作都不值得)。
- 多个任务可能相互依赖(一个任务可能需要另一个任务的结果)。这些任务不能并行执行。
- 多个任务可能在相同的数据/资源上工作(读/写情况)。这里我们需要同步对这些数据/资源的访问。如果在整个进程中所有任务都需要对同一个对象进行写访问,那么我们就不能并行工作。
基本上,这意味着如果没有问题的确切定义(任务之间的依赖关系,对数据的依赖关系,并行任务的数量,…),就很难判断使用多线程会获得多少性能(以及它是否真的值得)。
http://en.wikipedia.org/wiki/Amdahl%27s_law
Amdahl概括地说,你从并行执行中获得的性能提升受到你必须顺序运行的代码的限制。
在不了解问题空间的情况下,您应该查看以下一些一般内容:
- 重构以消除互斥锁/锁。根据定义,它们强制代码顺序运行。
- 通过将线程固定到物理内核来减少上下文切换开销。当线程必须等待工作(即阻塞IO)时,这变得更加复杂,但通常你想让你的核心尽可能忙碌地运行你的程序,而不是切换线程。
- 除非你绝对需要使用线程和同步原语,否则尝试使用任务调度器或并行算法库来并行化你的工作。例如英特尔的TBB, Thrust或苹果的libDispatch。
相关文章:
- 了解算法的性能差异(如果以不同的编程语言实现)
- C++分离功能,实现性能优化
- 为什么 C++ 代码实现的性能不比 python 实现更好?
- 为什么用于阈值矩阵元素的 Matlab 逻辑索引操作在性能上优于 mex 实现?
- 将函数及其实现移动到与主文件不同的文件(.hpp 和 .cpp)时,性能会受到很大影响
- 为什么这个普通的数组实现比STD ::向量实现性能慢
- 具有良好性能的c++映射实现
- Google Protobuf基于C++的python实现的性能
- 考虑 CPU 提升模式的多线程超线性性能实现
- 什么是通过调用_mm_stream_si64x()实现性能提升的示例程序
- 在 C++98 中实现移动构造函数和移动赋值运算符以获得更好的性能
- 性能不佳基于OpenCL的OpenCV平方实现
- 快速容器,实现一致的性能
- 并提高.进程间牺牲性能来实现可移植性
- 在c++中实现长方程时,如何通过高级方法提高性能?< / h1 >
- c++性能技术报告TR 18015中使用了哪些实现
- 并行线程执行以实现性能
- R stats::sd()与arma::stddev()与Rcpp实现的性能
- Dijkstra算法实现的性能
- c++仅用一行代码就实现了巨大的性能差异