据我所知,处理器中的多核体系结构不会影响程序。实际的指令执行在较低的层中进行。
我的问题是
鉴于您具有多核环境,我可以使用任何编程实践来更有效地利用可用资源吗?我应该如何更改代码以在多核环境中获得更高的性能?
最佳答案
那是正确的。除非您采用并发性,否则您的程序将无法以更快的速度运行(除了内核正在处理更少的其他进程这一事实之外,因为某些进程正在另一内核上运行)。但是,如果您确实使用并发,则更多的内核会改善实际的并行性(内核越少,则并发是交错的,而内核越多,您可以在线程之间获得真正的并行性)。
使程序高效并发绝非易事。如果做得不好,使程序并发实际上会使它变慢!例如,如果您花费大量时间来生成线程(线程构建的速度确实很慢),并且只在很小的块上进行工作(这样线程构建的开销就占据了实际的工作),或者您经常同步数据(这不仅会迫使操作顺序运行,而且还会增加很高的开销),或者如果您频繁地在多个线程之间的同一缓存行中写入数据(这可能导致整个缓存行在一个线程上失效)内核),那么您可能会严重并发编程而损害性能。
同样重要的是要注意,如果您有N个内核,那并不意味着您将获得N的加速。这是加速的理论极限。实际上,也许有两个内核的速度是它的两倍,但是有四个内核的速度可能是它的三倍,然后有八个内核的速度是它的三倍半,等等。能够利用这些内核的能力称为并行可伸缩性。通常,通信和同步开销会阻止线性加速,但是,在理想情况下,如果可以尽可能避免通信和同步,则希望可以接近线性。
对于如何在StackOverflow上编写高效的并行程序,不可能给出完整的答案。这确实是至少一门(可能是几门)计算机科学课程的主题。我建议您报名参加此类课程或购买一本书。如果知道一本不错的书,我会推荐给您一本书,但是我参加的并行计算算法课程没有该课程的教科书。您可能还对使用串行实现,具有多线程的并行实现(常规线程,线程池等)以及具有消息传递的并行实现(例如Hadoop,Apache Spark,Cloud Dataflow)编写少数程序感兴趣。 ,异步RPC等),然后测量其性能,并在并行实现的情况下更改内核数。这是我的并行算法课程的大部分课程工作,并且很有见地。您可以尝试并行化的某些计算包括使用Monte Carlo方法计算Pi(这是微不足道的可并行化,假设您可以创建一个随机数生成器,其中在不同线程中生成的随机数是独立的),执行矩阵乘法,计算的行梯形形式一个矩阵,将一些非常大的N相加到1 ... N的平方,我确定您会想到其他的。