Programming languages 多核处理器的编程

Programming languages 多核处理器的编程,programming-languages,hardware,parallel-processing,multicore,processor,Programming Languages,Hardware,Parallel Processing,Multicore,Processor,据我所知,处理器中的多核架构不会影响程序。实际的指令执行在较低的层中处理 我的问题是, 鉴于您有一个多核环境,我可以使用任何编程实践来更有效地利用可用资源吗?我应该如何更改代码以在多核环境中获得更高的性能?是的,只需向系统添加更多内核而不更改软件将不会产生任何结果(操作系统除外,它可以在单独的内核上调度多个并发进程) 要让您的操作系统使用多核,您需要做两件事之一:增加每个进程的线程数,或者增加同时运行的进程数(或者两者都增加!) 然而,有效利用核心是另一回事。如果您花费太多时间同步线程/进程之间

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

我的问题是,


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

是的,只需向系统添加更多内核而不更改软件将不会产生任何结果(操作系统除外,它可以在单独的内核上调度多个并发进程)

要让您的操作系统使用多核,您需要做两件事之一:增加每个进程的线程数,或者增加同时运行的进程数(或者两者都增加!)

然而,有效利用核心是另一回事。如果您花费太多时间同步线程/进程之间的共享数据访问,那么当线程彼此等待时,您的并发级别将受到影响。这还假设您有一个相对容易并行化的问题/计算,因为算法的并行版本通常比顺序版本复杂得多

这就是说,特别是对于工作单元相互独立的CPU限制计算,当您在问题上抛出更多线程时,很可能会看到线性加速。当您添加串行段和同步块时,这种加速将趋于降低


在多线程环境中,I/O繁重的计算通常最糟糕,因为对物理存储的访问(尤其是在同一控制器或同一介质上的物理存储)也是串行的,在这种情况下,线程变得更加有用,因为它释放了您的其他线程来继续用户交互或基于CPU的操作。

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

使程序高效并发不是一项简单的任务。如果做得不好,使程序并发实际上会使它变慢!例如,如果您花费大量时间生成线程(线程构造非常慢),并且在非常小的块大小上工作(因此线程构造的开销支配实际工作),或者如果您经常同步数据(这不仅迫使操作串行运行,而且还有非常高的开销),或者,如果您经常在多个线程之间写入同一缓存线中的数据(这可能导致整个缓存线在其中一个核心上失效),那么并发编程可能会严重损害性能

同样重要的是要注意,如果你有N个核,这并不意味着你会得到N的加速比。这是加速比的理论极限。事实上,两个核的速度可能是两倍,但四个核的速度可能是三倍,八个核的速度大约是三倍半,等等。你的程序实际能够利用这些核的能力称为并行可伸缩性。通常,通信和同步开销会阻止线性加速,不过,在理想情况下,如果您能够尽可能避免通信和同步,则有望接近线性加速


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

我不知道这是否是最好的开始,但我订阅了一段时间前的文章提要,在那里发现了很多有趣的东西,以非常简单的方式呈现。你可以找到一些关于并行计算基本概念的基本文章,比如。您可以快速了解openMP,这是一种可能的方法,可以开始并行化应用程序最慢的部分,而无需更改其余部分。(当然,如果这些部件存在平行性)也要检查。或者只是去浏览一下,文章并不多,所以你可以很快找到最适合你的。他们也有一个论坛和一个叫做并行编程对话的星期。

< P>你可以考虑使用为并发编程设计的编程语言。想到二郎和去吧

一个多核CPU,看看吧