gpt4 book ai didi

erlang - 哪些操作会导致并行代码运行缓慢?

转载 作者:行者123 更新时间:2023-12-01 08:18:27 24 4
gpt4 key购买 nike

阅读本文:The Hitchhiker's Guide to Concurrency ,更具体地说,关于 Amdahl's Law 的部分- 并行程序的运行速度与其最慢的部分一样快,并且程序越并行,在引入更多内核后速度越快,我发现自己想知道:我如何确保我从一开始就编写尽可能并行的代码?我如何确保我的代码能够获得添加多个内核的最大可能好处?还有,什么样的操作会导致代码不并行,或者并行代码变慢?代码示例当然会受到赞赏。

最佳答案

并非所有代码天生就能够并行运行。

并行执行意味着同时、同时。如果代码不依赖于与它一起运行的其他代码的最终结果,则它只能同时运行。如果你正在做这样的等式:
((((x+y)+z)+a)*b)
每个括号必须在下一阶段之前制定,因此操作不能顺序进行。为了使程序并行化,重要的是要确定何时可以将大型任务分解为可以同时完成的多个部分。

考虑一个总和,我需要将 100,000 个数字相加。

sum = 0;
for (i = 0; i < 100000; i++) {
sum += numbers[i];
}

加法是可交换和可传递的, a + b + c + d可以拆分为 (a + b + c) + d , a + (b + c) + d , (a + b) + (c + d)等。最后一种情况是作品的平均分配,一半在一个括号中,一半在另一个括号中。

所以假设我们做了这样的大任务:
sumA = 0;
for (i = 0; i < 100000 / 2; i++) {
sumA += numbers[i];
}

sumB = 0;
for (i = 100000 / 2; i < 100000; i++) {
sumB += numbers[i];
}

sum = sumA + sumB;

一分为二,两个循环可以同时运行,仍然得到相同的答案,我们只需要在最后重新组合。

在并行编程中,这是关键,将工作分解为每个 worker 的部分(cpu/节点/机器),然后收集结果并组装最终结果。我们称之为分散和聚集。

许多计算任务可以拆分,有些则不能。一个非常适合拆分的程序是并行的理想选择,不是的,不是。还要考虑到在分散和收集、拆分数据、重新组合(可能传输它)方面存在大量开销 - 并不总是值得划分任务。

所以,回答你的问题。与其说你能做什么让你的程序并行,不如说你的程序是否天生就能够并行。

关于erlang - 哪些操作会导致并行代码运行缓慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4390837/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com