programming-languages - 多核处理器编程

标签 programming-languages hardware parallel-processing multicore processor

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

我的问题是,

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

最佳答案

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

让程序高效地并发并不是一件简单的事情。如果做得不好,让你的程序并发实际上会使它变慢!例如,如果您花费大量时间生成线程(线程构建非常慢),并且在非常小的 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/

相关文章:

c# - 为什么算术表达式没有针对 C# 中的 0 乘法进行优化

c - 被告知我的 C 程序是 "hard coded",我不明白为什么

opengl - 多头显示系统

language-agnostic - 类型安全与静态类型?

programming-languages - 语言采用是否受其可用 IDE 的生产力驱动?

python - 如何使用 Python 提取硬件 ID?

performance - Kotlin:coroutineScope 比 GlobalScope 慢

c - OpenMP 中数组内容的并行更新 - 并发添加元素

bash - 如何在 Bash 中并行运行给定函数?