多核处理器编程

Cha*_*ara 16 hardware parallel-processing programming-languages multicore processor

据我所知,处理器中的多核架构不会影响程序.实际的指令执行在较低层处理.

我的问题是,

鉴于您拥有多核环境,我是否可以使用任何编程实践来更有效地利用可用资源?我应该如何更改代码以在多核环境中获得更高的性能?

Mic*_*yan 15

那是正确的.除非你使用并发,否则你的程序运行速度不会更快(除了核心处理更少的其他进程,因为某些进程正在另一个核上运行).但是,如果使用并发性,则更多内核可以改善实际的并行性(内核更少,并发性是交错的,而使用更多内核,可以在线程之间获得真正的并行性).

使程序高效并发并非易事.如果做得不好,让你的程序并发实际上可以让它变慢!例如,如果您花费大量时间生成线程(线程构造非常慢),并且在非常小的块大小上工作(因此线程构造的开销主导实际工作),或者您经常同步数据(这不仅强制操作串行运行,而且还有很高的开销),或者如果你经常在多个线程之间的同一缓存行中写入数据(这可能导致整个缓存行在一个线程上失效) (核心),那么你可以通过并发编程严重损害性能.

同样重要的是要注意,如果你有N个核心,那并不意味着你将获得N的加速.这是加速的理论极限.实际上,可能有两个内核,它的速度是原来的两倍,但有四个内核可能快三倍,然后有八个内核,速度快三倍半,等等.你的程序实际上有多好能够利用这些核心称为并行可扩展性.通常,通信和同步开销会阻止线性加速,但在理想情况下,如果可以尽可能避免通信和同步,则可以接近线性.

如何在StackOverflow上编写高效的并行程序是不可能给出完整答案的.这实际上是至少一门(可能是几门)计算机科学课程的主题.我建议你报名参加这样的课程或买书.如果我知道一本好书,我会向你推荐一本书,但是我参加的并列算法课程没有课程的教科书.您可能还有兴趣使用串行实现编写一些程序,使用多线程(常规线程,线程池等)的并行实现,以及使用消息传递的并行实现(例如使用Hadoop,Apache Spark,Cloud Dataflows) ,异步RPC等),然后测量它们的性能,在并行实现的情况下改变核的数量.这是我的并行算法课程的大部分课程工作,可以非常有见地.您可能尝试并行化的一些计算包括使用蒙特卡罗方法计算Pi(这可以简单地并行化,假设您可以创建随机数生成器,其中在不同线程中生成的随机数是独立的),执行矩阵乘法,计算行的梯形式一个矩阵,将数字1 ... N的平方相加为一些非常大的N,我相信你可以想到其他人.