据我所知,处理器中的多核架构不会影响程序。实际的指令执行在较低层处理。
我的问题是,
鉴于您有一个多核环境,我可以使用任何编程实践来更有效地利用可用资源吗?我应该如何更改我的代码以在多核环境中获得更高的性能?
最佳答案
那是对的。除非您使用并发,否则您的程序将不会运行得更快(除了核心处理较少的其他进程,因为某些进程正在另一个核心上运行)。但是,如果您确实使用并发,则更多的内核会提高实际的并行性(使用更少的内核,并发是交错的,而使用更多的内核,您可以获得线程之间的真正并行性)。
让程序高效地并发并不是一件简单的事情。如果做得不好,让你的程序并发实际上会使它变慢!例如,如果您花费大量时间生成线程(线程构建非常慢),并且在非常小的 block 大小上工作(因此线程构建的开销支配了实际工作),或者如果您经常同步数据(这不仅会强制操作串行运行,而且在其之上还有非常高的开销),或者如果您经常在多个线程之间的同一缓存行中写入数据(这可能导致整个缓存行在一个线程上无效)核心),那么您可能会严重损害并发编程的性能。
同样重要的是要注意,如果您有 N 个内核,这并不意味着您将获得 N 的加速。这是加速的理论限制。事实上,也许两个核心的速度是原来的两倍,但四个核心的速度可能是原来的三倍左右,然后是八个核心的速度大约是原来的三倍半,等等。你的程序实际上有多好能够利用这些核心称为并行可扩展性。通常,通信和同步开销会阻止线性加速,但在理想情况下,如果您可以尽可能避免通信和同步,则有望接近线性加速。
关于如何在 StackOverflow 上编写高效的并行程序,不可能给出完整的答案。这实际上是至少一门(可能是几门)计算机科学类(class)的主题。我建议你报名参加这样的类(class)或买一本书。如果我知道一本好书,我会向您推荐一本书,但是我参加的并行算法类(class)没有该类(class)的教科书。您可能还对使用串行实现、多线程并行实现(常规线程、线程池等)和消息传递并行实现(例如 Hadoop、Apache Spark、Cloud Dataflows)编写少量程序感兴趣、异步 RPC 等),然后测量它们的性能,在并行实现的情况下改变内核数量。这是我的并行算法类(class)的大部分类(class)工作,并且非常有见地。您可能会尝试并行化的一些计算包括使用 Monte Carlo 方法计算 Pi(这很容易并行化,假设您可以创建一个随机数生成器,其中在不同线程中生成的随机数是独立的),执行矩阵乘法,计算行梯形形式一个矩阵,将数字 1...N 的平方求和,得到一些非常大的 N,我相信你能想到其他的。
关于programming-languages - 多核处理器编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2467859/