Logo

site iconJustYY | 小赖子

小赖子的英国生活和资讯,以及投资和个人生活。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

JustYY | 小赖子 RSS 预览

为什么并行不是无限的: 简单解释 Amdahl vs Gustafson

2025-11-19 21:36:02


Amdahl 定律 vs Gustafson 定律 — 完整教程、推导、应用场景及 Python 绘图

Amdahl 定律 vs Gustafson 定律:完整教程、推导、应用场景及 Python 绘图
理解并行加速:通过代码讲解 Amdahl 定律和 Gustafson 定律
并行计算基础:Amdahl 定律、Gustafson 定律及加速建模
并行加速原理:Amdahl 和 Gustafson 定律完整指南
并行扩展解析:推导并比较 Amdahl 和 Gustafson 定律
Amdahl vs Gustafson:并行加速完整指南(含 Python 代码)
并行性能建模:Amdahl 定律、Gustafson 定律及实际应用
学习并行加速:数学、直觉、应用场景及 Python 可视化
并行计算:必须掌握的两条定律(Amdahl & Gustafson)
工程师的并行加速:Amdahl 定律、Gustafson 定律及 Python 实现
从理论到代码:用 Amdahl 和 Gustafson 建模并行加速
实用并行加速指南:Amdahl 定律、Gustafson 定律及可视化
为什么并行不是无限的:简单解释 Amdahl vs Gustafson
并行加速真相:Amdahl 限制 vs Gustafson 扩展
并行计算神话与现实:Amdahl 和 Gustafson 的教训

引言

并行计算在现代计算中至关重要:多核 CPU、GPU、分布式集群、云工作负载、LLM 训练以及 HPC 模拟。

为了分析程序在更多处理器下能加速多少,主要有两种数学模型:

  • Amdahl 定律 — 固定规模工作负载的性能
  • Gustafson 定律 — 可扩展规模工作负载的性能

这两条定律并不矛盾,它们回答的是 不同的问题
本教程涵盖推导、直觉、比较、实际应用场景,以及展示两条定律的 Python 绘图脚本。

1. 什么是加速比?

加速比衡量程序在 N 个处理器上运行速度提升多少:

tex_874e8d72fc08f2af61e0df97c456b5c2 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机

如果程序在一个处理器上运行 10 秒,两处理器运行 5 秒,则加速比为:

tex_fea9c4fbe000a3e47d431a26d0bf7ab2 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机

完美线性加速为:

tex_e9f6efb7e9d50d657c0883dc59792232 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机

但实际系统存在串行瓶颈,这正是 Amdahl 定律和 Gustafson 定律描述的内容。

2. Amdahl 定律(固定工作量)

2.1 直觉

Amdahl 假设:

  • 总工作量保持 不变
  • 部分工作是串行的,无法并行化

设:

  • f = 串行比例
  • 1 - f = 可并行比例

2.2 推导

一个处理器的运行时间:

tex_cd65cc0f8fa444a1c942c1dd435729e9 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机

定义:

tex_47e86b1941e5d34562897f2bc9e72129 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机

因此:

tex_b339bd84646feb5fa705f2337c45e91d 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机
tex_98f8bc0d6bf46e12033e27be130a4a7d 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机

N 个处理器的运行时间:

tex_b66634c6e27fc1de8ea84ac81724010c 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机

加速比:

tex_9a86b3b2234c3e7746efd503e5107b9c 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机

其中 f 是串行工作比例,tex_3f4589d9b675507468afd74744fcafef 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机 是可并行工作。Amdahl 公式也可以写成:

tex_4cec42f3f3a919b7d7984827a2605bdd 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机

其中 tex_73e66f4b3b996f161705ee100bb45369 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机 tex_497d56a00b5e083d6488ec3072a6ca06 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机

2.3 当 N → ∞ 时的极限

tex_4f525a4ae4832e1d6d4d29923205acf8 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机

如果串行比例为 10%(f = 0.1):

tex_c06286eea86d0b1a0ea19ff2498067ed 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机

即使处理器无限,也无法超过该值。

2.4 Amdahl 定律的实际应用场景

Amdahl 适合优化固定任务的 延迟

  • GPU 内核优化固定张量大小
  • 单次请求推理延迟降低
  • 视频编码、压缩、排序
  • 加速固定批量作业
  • 数据库查询加速

3. Gustafson 定律(可扩展工作量)

3.1 直觉

Gustafson 反过来问:

“增加处理器,我能在相同时间内解决多大的问题?”

这反映了真实 HPC 工作负载:更多 CPU → 更高分辨率 → 更大模拟。

3.2 推导

假设程序在 N 个处理器上运行 1 个时间单位。

设:

  • f = 串行比例(按规模测量)

可并行部分随处理器数量扩展,因此其运行时间保持与 N 成比例。

一个处理器的时间:

tex_e3f2599da2e43b1173c1aaf4eda87614 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机

加速比:

tex_7d6285b7fe4fe4215fffc041747b6b38 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机

Gustafson 公式的 “N 减” 形式:

tex_1b159a1d1361b799fb425aa75b47ca79 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机

或者,如果定义并行比例 tex_e54ad141cf10b747683362c54b759563 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机 ,公式也可写为:

tex_b17b90807c408febafb1a4cb79950309 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机

“N 减” 形式用 p 表示:

tex_e644c8961d33e3b3b915a21e385056e7 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机

3.3 解释

随着 N 增加,加速比趋近于:

tex_7f1c2335a53dcee7685791c4b80f9c20 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机

对于小串行比例,几乎呈线性增长。

3.4 Gustafson 定律的实际应用场景

Gustafson 适用于 吞吐量扩展 或可增加问题规模的工作负载:

  • 天气和气候模拟
  • 粒子模拟、CFD、有限元分析
  • LLM 训练:更多 GPU → 更长序列或更大模型
  • 大数据分析(Spark, Dask, Flink)
  • 蒙特卡洛模拟

4. Amdahl 定律 vs Gustafson 定律(比较表)

项目 Amdahl Gustafson
工作负载 固定 随 N 扩展
目标 降低延迟 增加吞吐量
加速比上限 有界: tex_caa92bab626afd401dbbe35770e10c44 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机 近似线性: tex_6993fa207348cf6876f3ae7d7f16783b 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机
悲观/乐观 悲观 乐观
应用场景 优化现有任务 扩展大规模工作量

5. 实际应用场景(综合视角)

Amdahl(延迟优化)

  • 减少单次 LLM 查询推理时间
  • 加速数据库 join 操作
  • 固定张量 GPU 内核优化
  • 视频编码(相同视频)

Gustafson(吞吐量 / 扩展)

  • LLM 训练(扩展至更多 GPU)
  • 高分辨率天气模型模拟
  • 大数据 ETL 扩展
  • 科学 HPC 工作负载

6. Python 绘图脚本(显示两条定律)

下面代码生成 Amdahl 与 Gustafson 加速比曲线图。

可以调整 f(串行比例)和处理器数量 N

脚本绘制两条曲线在同一张图上。

包括部分 tex_f9f843126d657a7415623d3414da113e 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机 的值,例如串行部分:


import numpy as np
import matplotlib.pyplot as plt

def amdahl_speedup(N, s):
return 1.0 / (s + (1 - s) / N)

def gustafson_speedup(N, s):
return s + (1 - s) * N

# Number of processors
N = np.arange(1, 65)

# Serial fractions to consider
Serial = [0.05, 0.1, 0.2, 0.3, 0.5, 0.8, 0.9, 1.0]

plt.figure(figsize=(10, 6))

for f in Serial:
plt.plot(N, amdahl_speedup(N, f), linestyle='-', label=f"Amdahl Serial={f}")
plt.plot(N, gustafson_speedup(N, f), linestyle='--', label=f"Gustafson Serial={f}")

plt.title("Amdahl's Law")
plt.xlabel("Number of Processors (N)")
plt.ylabel("Speedup")
plt.legend()
plt.grid(True)
plt.tight_layout()

plt.savefig("parallel-speedup-amdahl-vs-gustafson.png")
## plt.show()

下面是 Amdahl 与 Gustafson 曲线图示。

parallel-speedup-amdahl 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机

Amdahl 定律加速曲线

parallel-speedup-amdahl-vs-gustafson 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机

Amdahl vs Gustafson 加速曲线

parallel-speedup-gustafson 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机

Gustafson 定律加速曲线

图示解读

  • Amdahl 曲线迅速趋于平缓——受串行部分限制。
  • Gustafson 曲线几乎线性上升——适用于可扩展工作负载。
  • 串行比例 f 越高,两种模型差距越大。

结论

Amdahl 定律展示了固定工作负载下的并行 上限,适合延迟优化。Gustafson 定律展示了随工作负载扩展的并行 潜力

  • Amdahl 定律 → 固定规模工作负载 → 收益递减
  • Gustafson 定律 → 可扩展工作负载 → 近似线性加速
  • 结合使用理解硬件极限与算法特性
  • Python 工具使可视化直观易懂

它们共同构成现代并行系统性能分析基础,从 HPC 到 LLM 训练,再到 GPU 计算。

英文:The Truth About Parallel Speedup: Amdahl’s Limits vs Gustafson’s Scaling

本文一共 1384 个汉字, 你数一下对不对.
为什么并行不是无限的: 简单解释 Amdahl vs Gustafson. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson Python Python 学习笔记 并行计算/Parallel Computing 计算机
The post 为什么并行不是无限的: 简单解释 Amdahl vs Gustafson first appeared on 小赖子的英国生活和资讯.

CloudFlare宕机, 半个互联网崩了

2025-11-19 05:20:08


今天的 Cloudflare 宕机:一次震撼全球的“单点故障”

今天早上,我突然收到了一大堆报警,我手下的15个网站都报警了,收到了很多邮件,这很不正常,有的时候是报警的程序自己的问题,因为其中的一个邮件报警是我自己写的。 但是我核实了一下,确实打不开,显示是500服务器内部错误,这个错误一般就是服务器配置错误崩溃造成的。但我细眼一看,是CloudFlare的服务器的问题。这可是我第一次见。

Cloudflare 已经是互联网基础设施级服务,一旦宕机影响面巨大。这次事故暴露了去中心化互联网在实际运行中高度中心化的问题。

CloudFlare按现在最新数据,有750万个网站,排名/流量最高的1万个中有33%是用CloudFlare,所以这次宕机的影响之深,还好,这次友宕机也就三个小时左右,这次宕机影响到了很多服务,其中X和ChatGPT都打不开了,中间还陆陆续续间断的恢复过几分钟时间。

18 日,全球知名的网络基础设施服务商 Cloudflare 发布公告称,其全球网络出现大范围异常,导致大量网站和应用出现访问中断。受影响的平台包括 X(前 Twitter)、ChatGPT 等多家核心互联网服务,有媒体报道称 Spotify、亚马逊部分服务也出现了故障。

受此次事故影响,Cloudflare 股价在盘前一度下跌超过 5%。

按照官网介绍,Cloudflare 是一家全球性的云网络平台,为各类规模的企业提供安全加速、内容分发、DNS、零信任等服务。其数据传输网络覆盖全球 125 个国家、330 座城市,是互联网“入口层”的关键基础设施之一。Cloudflare 于 2019 年 9 月 13 日在纽约证券交易所上市。

北京时间 19:17(伦敦时间 11:17),Cloudflare 状态页显示,其支持门户出现故障,客户在查看或回复支持工单时可能遇到错误。大约半小时后,Cloudflare 再次更新称公司正在经历“内部服务故障”,部分服务可能会出现间歇性异常。

又过了约 20 分钟,Cloudflare 表示整体中断情况已开始缓解,但仍在调查问题根源。至北京时间 21:13,官方最新状态指出,部分服务的错误率“已恢复到事件发生前的水平”,同时团队正在继续恢复其余受影响的服务。

X、ChatGPT 等多个互联网平台仍受到此次故障影响。X 上用户的帖子会显示“无法载入”等提示,访问仍不稳定。

Cloudflare 历史关键时间线

  • 2009:Cloudflare 成立(创始人:Matthew Prince、Lee Holloway、Michelle Zatlyn)。
  • 2010–2015:从 CDN 起家,加入 DDoS、防火墙、DNS、边缘计算等产品。
  • 2019-09-13Cloudflare 在 NYSE 上市,代码 NET
  • 2020–2024:推出 1.1.1.1、Zero Trust、Workers、R2 等,逐步成为互联网“前门”。
  • 市场占有率:全球流量最高前 10,000 个网站中约三成使用 Cloudflare(各统计口径有差异,约在 30% 左右)。

技术分析:为什么会看到 Cloudflare 返回 500

1. Cloudflare 的基本工作方式

  • 用户访问域名 → DNS 指向 Cloudflare Anycast 边缘/Edge节点。
  • Cloudflare 作为反向代理:处理缓存、加速、TLS、WAF、Workers。
  • 然后 Cloudflare 再把请求转发给源站(origin)。

2. 边缘节点返回 500 的常见原因

  • 源站真实返回 500:Cloudflare 将错误透传。
  • Cloudflare 内部组件异常:代理池、缓存层、Workers、WAF 崩溃导致边缘自身返回 5xx。
  • 边缘与源站连接失败:握手超时或连接异常,本应返回 502/524,但部分情况可能回落为 500。
  • SSL/TLS 配置冲突:证书或协议版本不匹配导致处理失败。
  • Workers 运行异常:未捕获异常直接导致 500。

3. Cloudflare 常见错误码对照

编码 说明
500 通用错误,source 或 Cloudflare 本身都可能产生。
502 Bad Gateway,Cloudflare→源站连接问题。
520 源站返回空或格式不正确的响应。
521 源站拒绝连接。
522 Cloudflare→源站连接超时。
524 源站处理超时。

4. 工程上如何确认是 Cloudflare 问题

  1. 绕过 Cloudflare 测试源站:
    curl -I -H "Host: yourdomain.com" http://YOUR_ORIGIN_IP
  2. 看响应头是否含 server: cloudflarecf-ray
  3. 查看 Cloudflare 状态页:https://www.cloudflarestatus.com/
  4. 如使用 Workers,检查日志与堆栈信息。
  5. 必要时暂停 Cloudflare(“Pause Cloudflare on Site”)并确认源站可用性。

5. 为什么故障影响面巨大

  • 大量网站的 DNS + 代理都托管在 Cloudflare。
  • Cloudflare 是“入口层”,入口挂了源站再健康也没办法。
  • 对许多服务来说,Cloudflare 就是互联网对外公开的“唯一入口”。

工程建议(可实践)

  • 多 DNS、多 CDN 架构:降低对单一供应商的依赖。
  • 开启缓存 fallback:为内容站点提供 Always Online 类体验。
  • 健康检查 + 自动切换:重要 API 建议多云部署。
  • 边缘脚本不要走关键路径:Workers 出错会影响所有请求。
  • 制定应急回滚流程:包括 DNS 回滚、IP 直连、信息通告模板等。

快速诊断手册(给工程师)

  1. 绕过 Cloudflare 访问源站:确认是否是源站本身故障。
  2. 查看响应头是否含 Cloudflare 标识。
  3. 查看 status 页面是否有大规模宕机。
  4. 用不同地区的 curl/Pingdom/UptimeRobot 对比确认是否是区域性还是全球性问题。

再强的基础设施也会宕机。互联网架构虽然理论去中心化,但现实中高度依赖少数大型服务商。

前几周的AWS因为dynamodb的DNSRace Condition的BUG,也是影响了互联网大半个江山,因为都是互联网基础服务,不过CloudFlare更是,因为从用户在浏览器打域名后,CloudFlare就接管了,只是到最后面的服务器不是在CloudFlare,前面的流量都被CF牢牢控制。从另一个角度也说明了CF的重要性,掌握了入口和流量。

这次 Cloudflare 宕机是一次非常典型的 “单点故障课” – Single Point of Failure

alarm-emails-after-cloudflare-incident CloudFlare宕机, 半个互联网崩了 CloudFlare I.T. 资讯

早上11点多的时候收到大量的服务报警邮件

cloudflare-500-error CloudFlare宕机, 半个互联网崩了 CloudFlare I.T. 资讯

想到X上发个推,发现X也是不能用。

cloudflare-500-meme-scaled CloudFlare宕机, 半个互联网崩了 CloudFlare I.T. 资讯

CloudFlare这次影响之广,好多网梗。

cloudflare-status-page CloudFlare宕机, 半个互联网崩了 CloudFlare I.T. 资讯

cloudflarestatus上实时更新

cloudflare-stock-price-dropped-after-incident-on-the-day CloudFlare宕机, 半个互联网崩了 CloudFlare I.T. 资讯

CloudFlare股价下跌,感觉是受这次事故影响。

internet-cloudflare CloudFlare宕机, 半个互联网崩了 CloudFlare I.T. 资讯

整个互联网好脆弱

没法摸鱼,因为微软网站都可以用,还得继续搬砖写代码。不过ChatGPT用不了,感觉效率大大降低(但是可以试试其它服务,比如Copilot)

新闻/实事/经济

本文一共 1670 个汉字, 你数一下对不对.
CloudFlare宕机, 半个互联网崩了. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c CloudFlare宕机, 半个互联网崩了 CloudFlare I.T. 资讯
The post CloudFlare宕机, 半个互联网崩了 first appeared on 小赖子的英国生活和资讯.

组合数学: 简介一(帕斯卡三角/二项式系数)

2025-11-16 04:44:45


组合简介(组合数学入门)

视频:油管/Youtube | B站/小破站 | 微博视频 | 西瓜视频 | 微信视频号 | X/推特 | 小红书 | Facebook

组合计数是在顺序不重要时选择项目的方式。我们从一个简单的格子行走示例出发建立直觉,介绍二项式记号,推导公式,解释递推关系 tex_20b70635d529dd6550c4cf1b7166fce1 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学 ,并把所有内容联系到帕斯卡三角。

格子行走示例 — 从左下到右上路径

想象你只能向右(R)或向上(U)移动。要从左下走到需要三次向右和两次向上的点,每一条最短路径都是由五步组成的序列,其中包含三个 R 和两个 U。

combination-grid-walking 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学

走格子: 排列组合

每条有效路径只是从五个位置中选择两个放 U(其余为 R)。所以这样的路径数就是“从 5 中选 2”,记作 tex_eb50cc17a30bc80a7e9bb243a4000477 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学 (等于 tex_e605ee6dcffe94bc93aee83996a214f3 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学 )。

示例序列:

R R U R U U R R R U R U R R U R R R U U U U R R R 

二项式系数(组合)表示法

tex_d26877ae239c15d2776d571f6114453d 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学 个项目中选出 tex_956cb2a0c12d1c12ff07ffca2950a926 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学 个(顺序不重要)的方式数记为

tex_5b51b2b5348c2fe3dbc400879cb17752 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学

tex_69a402c8e0c6fbb9afd1220af2f4a42e 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学

两者都表示“从 n 中选 m”。

组合公式 — 基于阶乘的推导

先计算有序选择(排列):从 n 个不同项目中取出长度为 tex_956cb2a0c12d1c12ff07ffca2950a926 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学 的有序列表的数量为

tex_69cfb2451e2eee3b537ff73d0bfcb949 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学

每一个无序的 tex_52c11c8fd6bfb9574b188e037ac8fcbc 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学 项集合对应 tex_33d8268e68aa54dc96647b2775f9cea0 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学 个有序列表(即这 m 项的排列)。除以 tex_33d8268e68aa54dc96647b2775f9cea0 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学 得到组合数:

tex_462380df173532e5cf5948d21409c0b6 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学

把公式应用到格子示例

对于总步数 tex_45034f3317e39be77b191a09f521dbc8 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学 和向上步数 tex_bde611fe1120c147cc3116da68c65746 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学

tex_efdda93517094cde5926631915740e2c 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学

因此共有 10 条不同的最短路径。

为什么这个公式直观上合理

  • 视角一 — 选择位置:从 tex_d26877ae239c15d2776d571f6114453d 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学 个位置中选择放置 U 的 tex_956cb2a0c12d1c12ff07ffca2950a926 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学 个位置;这就是 tex_5b51b2b5348c2fe3dbc400879cb17752 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学
  • 视角二 — 用排列除以顺序:先计算 n 步的所有排列,然后除去相同步序的重排(比如相同类型步的交换)。

帕斯卡三角与递推关系

tex_ba05f2b93f4c2d3a54882c4b098a9fc8 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学 写成行可以形成帕斯卡三角:

 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 
pascal-triangle 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学

Pascal/帕斯卡三角形

这些项满足递推关系

tex_a9c4b9f00a6176c3864dff7e2cca9bde 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学

然后,我们可以很容易的写出至顶向下的动态规划算法实现(用@cache实现记忆化式的递归搜索):

from functools import cache

@cache
def C(n, m):
    if m == 0:
        return 1  # C(n, 0) = 1
    if m == n:
        return 1  # C(n, n) = 1
    return C(n-1, m-1) + C(n-1, m)

当然,也可以用自底向上的方式实现:

def C_bottom_up(n, m):
    dp = [[0]*(m+1) for _ in range(n+1)]
    for i in range(n+1):
        dp[i][0] = 1  # C(i, 0) = 1
        for j in range(1, min(i, m)+1):
            if j == i:
                dp[i][j] = 1  # C(i, i) = 1
            else:
                dp[i][j] = dp[i-1][j-1] + dp[i-1][j]
    return dp[n][m]

这个自底向上的实现直接从小问题累加到大问题,避免了递归开销,同时也很容易扩展到计算整个帕斯卡三角。

组合数的自底向上 DP 可以用 一维数组优化,利用 滚动数组 原理,因为每一行的计算只依赖上一行。重点是从 右往左更新,这样不会覆盖还没用到的数据。

下面是实现示例:

def C_one_dim(n, m):
    dp = [0] * (m+1)
    dp[0] = 1  # C(i, 0) = 1

    for i in range(1, n+1):
        # 从右往左更新,避免覆盖上一行数据
        for j in range(min(i, m), 0, -1):
            dp[j] = dp[j] + dp[j-1]
    
    return dp[m]

示例:

print(C_one_dim(5, 2))  # 输出 10

✅ 优点:

  • 空间复杂度 O(m)
  • 时间复杂度 O(n*m)
  • 可以方便扩展计算整行或整列组合数

组合证明 — 采苹果

想要从 tex_d26877ae239c15d2776d571f6114453d 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学 个苹果中选 tex_956cb2a0c12d1c12ff07ffca2950a926 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学 个。考虑最后一个苹果(编号为 n):

如果你选了它,那就必须从前面的 tex_8eaa2e3b994da3c2dd1861cb7c8b99d7 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学 个中选剩下的 tex_bbb6aed6f41e2c469b0952dd1428ed9c 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学 个:有 tex_4d0c123c83b77f26eedc67eaa3d43b31 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学 种方法。

如果你不选它,那就必须从前面的 tex_8eaa2e3b994da3c2dd1861cb7c8b99d7 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学 个中选出全部 tex_956cb2a0c12d1c12ff07ffca2950a926 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学 个:有 tex_23e36b49b17b39d8b3bd9b084db77675 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学 种方法。

这两个互不相交的情况覆盖了所有可能,因此

tex_a9c4b9f00a6176c3864dff7e2cca9bde 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学

(该恒等式正是构造帕斯卡三角的规则。)

递推关系的格子解释

在格子上,观察到达某点的任意路径的最后一步:要么是 R,要么是 U。以 R 结尾的路径来自某个前一点,以 U 结尾的路径来自另一个前一点。把这两组路径分别计数并相加就得到相同的加法规则。

常见的小值与说明

tex_c560618184dddba94cf9e2345f141963 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学 (选择零个)。
tex_d5b33bb299ff86b325995afb4c8f0018 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学 (选择一个)。
tex_9028c423afcf1c38b7c70d5b1b2f6617 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学 (选择全部)。

tex_45034f3317e39be77b191a09f521dbc8 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学 时的小表:

 C(5,0)=1 C(5,1)=5 C(5,2)=10 C(5,3)=10 C(5,4)=5 C(5,5)=1 

结语

组合出现在路径计数、二项式展开(系数)、概率与选择问题中。阶乘公式提供直接计算方法,而帕斯卡三角与递推关系则提供归纳直觉和高效构造数值的方式。格子行走示例是将“选择位置”等同于“选择步序”这一组合核心思想可视化的具体方法。

英文:Teaching Kids Programming – Introduction to Combinatorial Mathematics 1

本文一共 1176 个汉字, 你数一下对不对.
组合数学: 简介一(帕斯卡三角/二项式系数). (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 组合数学: 简介一(帕斯卡三角/二项式系数) 学习笔记 教程 数学 数学
The post 组合数学: 简介一(帕斯卡三角/二项式系数) first appeared on 小赖子的英国生活和资讯.

性能的隐藏引擎: 一切都取决于数据存储的位置(缓存为王)

2025-11-16 03:30:46


性能隐藏的引擎:数据存放在哪里决定一切

1. 性能的真正秘密:数据放在哪里决定一切
2. 决定系统快慢的不是 CPU,而是数据的距离
3. 缓存才是现代计算性能的核心
4. 忽视数据局部性,一切性能优化都是徒劳
5. 性能瓶颈不在算力,而在内存层级
6. 数据局部性:被低估的性能决定因素
7. CPU 在等你的内存:缓存层级的真实代价
8. 系统速度快的真正原因:一切都与缓存有关
9. 别再关注 CPU 速度了——数据局部性才是制胜关键
10. 为什么缓存是所有高性能系统的幕后引擎
11. 性能的关键不在于 GHz,而在于距离
12. 你的 CPU 正在等待内存:缓存不为人知的故事
13. 数据局部性:计算机领域最重要却鲜为人知的因素
14. 数据存储位置决定一切
15. 缓存主宰一切:性能指南
16. 内存层次结构:性能的隐形杀手(或救星)
17. 为什么现代性能之战是与延迟的较量,而非与计算能力的较量

我们喜欢讨论 CPU 频率,但在实际系统中,关键问题是:你的数据存放在哪里?

现代 CPU 依赖一个分层的内存体系(寄存器 → L1 → L2 → L3 → DRAM)。L1 访问可能只需约 4 个周期;而 DRAM 访问可能需要 200+ 个周期——那是 50× 更慢。如果你的工作集能放进缓存,一切飞快;如果不能,CPU 就会阻塞等待。

为什么缓存主导一切

分组处理是一个典型例子。每个数据包都会触发表查找。如果这些表能保持在缓存中,你可以每秒处理数百万个包;一旦溢出到 DRAM,吞吐量会崩塌。

真正的设计问题: 它能放进缓存吗?

cpu-cache-register 性能的隐藏引擎: 一切都取决于数据存储的位置(缓存为王) 学习笔记 硬件 计算机 计算机

CPU寄存器/缓存/架构

缓存不仅仅关乎数据。指令缓存未命中也会毁掉尾延迟。有些高频交易系统会让热路径持续执行,只在需要发包时才打开网卡,从而保持 指令缓存持续命中。在交易环路中,一个 I-cache 停顿就可能占据全部延迟预算。

抽象失灵的地方

“全都上云”这类高层策略常忽略底层现实。虚拟化网络功能依赖于诸如:

  • 独占核亲和(core pinning) —— 保持线程在同一 CPU 上以维持缓存热度
  • 中断合并(interrupt coalescing) —— 降低中断率但以延迟为代价
  • NUMA 局部性 —— 跨插槽访问会严重削弱性能
  • 物理网卡与虚拟网卡 行为不同

销售演示会说“可以工作”,但细则通常是:需要 3 倍硬件、3 倍许可证,性能仍然无法与裸机匹配。 一旦你依赖缓存行为、核亲和和 NUMA 局部性,平台就不再可互换。

AI 也碰到同样的问题

即便在 AI 领域,物理规律也没变。模型越来越大,但数据移动依旧主导计算。局部性仍然是王道

  • 数组优于指针密集的结构,因为内存是连续的
  • 硬件预取器只有在访问可预测时才有用
  • 当内存布局合理时,缓存行被更高效地利用

在机器人控制中也能看到

在多轴运动控制中,第一个轴会“预热”缓存并承担缺失惩罚;后续轴的计算因为数据已经热化而耗时减半。相同的原理:局部性 = 速度。

IBM Telum:不同量级的缓存

IBM 的 Telum 处理器把这个想法推到了极端:

  • 十个 36 MB 的 L2 缓存
  • 360 MB 的虚拟 L3
  • 2.8 GB 的虚拟 L4
ibm-telum-processor 性能的隐藏引擎: 一切都取决于数据存储的位置(缓存为王) 学习笔记 硬件 计算机 计算机

IBM Telum 处理器

该架构可以按需将 L2 转作 L3 使用。IBM 尚未公开这些缓存层的具体访问延迟,但在如此大规模的缓存下,大小、互连距离与命中延迟之间的折衷会非常有趣。

结论

性能归根结底由数据和指令能离核心多近来决定。

为局部性而设计,你的系统会表现出色。忽视它,再多的 GHz 或再多的云抽象也救不了你。

我们经常谈论 CPU 速度,却很少关注数据存储的位置。

性能主要取决于数据存储的便利程度。寄存器、L1 缓存、L2 缓存、L3 缓存、主内存——每一步都会增加延迟并降低吞吐量。访问主内存可能需要 200 个时钟周期,比 L1 缓存慢 50 倍。

当工作集能够放入缓存时,代码运行速度极快。否则,CPU 只能等待。

在数据包处理中,这种差异决定了一切。每个数据包都会触发表查找。如果这些表保存在 缓存 中,您可以每秒处理数百万个数据包。否则,吞吐量将急剧下降。

所以,下次设计数据结构时,请问问自己:

它能放进缓存吗?

因为在对性能要求极高的系统中,缓存不仅仅是一种优化手段,它定义了整个系统。

而且不仅是数据,指令也一样!我见过高频交易工程师讨论他们的策略,他们将热路径编程为始终处于激活状态,并且只在数据包需要离开系统时才启用网卡。这样也能保持指令缓存处于热状态。

保持指令缓存处于热状态与保持数据缓存处于热状态同样重要,尤其是在对可预测性要求很高的工作负载中。优化热路径,使 CPU 始终保持在指令缓存中至关重要,因为即使是很小的停顿也可能导致尾延迟显著增加。这很好地提醒我们,架构设计的真正目的是尽可能地将指令和数据都放在靠近核心的位置。

很多技术决策者都固守一刀切的策略:例如……万物皆可云——他们认为任何虚拟化工作负载都可以在任何虚拟化环境中运行,底层硬件和虚拟化技术都只是商品而已。但这并不适用于虚拟化网络功能,因为厂商们早就知道,独占线程核心绑定可以让执行线程独占使用 CPU 缓存。厂商们也知道,在虚拟化环境中,中断合并可以降低“CPU 使用率”,但会增加延迟。他们了解 NUMA 局部性,甚至把这些都写进了文档里。当然,销售人员来了之后,他们希望与高层战略保持一致,使用最佳优化基准测试,然后就云或虚拟机管理程序支持的问题展开另一场不加任何细节的讨论。没错,这行得通*但附注:你需要三倍的许可证/硬件,而且仍然无法获得最佳性能。人们对底层性能如此缺乏兴趣,技能差距如此之大,以至于似乎只能通过增加抽象层和厂商来掩盖责任。如果珠穆朗玛峰是检验技术领导力还是厂商责任的试金石,那么我们很想知道,究竟是哪一方会坚持到底,还是会在山脚下卖羽绒服。完全正确。一旦你依赖缓存行为、核心绑定和NUMA局部性,平台就不再具有可互换性了。底层细节远比大多数高层策略重要得多。

大多数繁重的AI工作负载仍然会遇到相同的内存层次结构限制。模型规模不断扩大,但芯片内部数据传输的物理机制并没有发生太大变化。理解局部性仍然是获得良好性能的关键。

数组能够为CPU提供它真正需要的东西:连续的内存和可预测的访问模式。这意味着预取器可以真正发挥作用,缓存行可以得到高效利用,并且避免了分散结构带来的指针追踪惩罚。这是保持缓存友好性的最简单方法之一。

机器人多轴运动控制也是如此。第一个轴预热缓存并承受缓存未命中的影响,下一个轴的计算时间缩短了一半。

IBM Telum处理器可以验证这一点,它能够按需将L2缓存转换为L3缓存,并且L4缓存可以被任何其他CPU访问。此外,该芯片的时钟频率始终保持在 5.5 GHz。它包含十个 36 MB 的二级缓存¹,以及扩展的虚拟三级缓存(360 MB)和四级缓存(2.8 GB)。

这是一款令人着迷的芯片。与大多数架构相比,其缓存容量巨大,这让我不禁好奇这会对各级缓存的访问延迟产生怎样的影响。可惜的是,我找不到任何关于 Telum 缓存的公开延迟数据,否则我很想了解 IBM 在实际应用中是如何平衡缓存容量、交换空间距离和命中延迟的。

英文:The Hidden Engine of Performance: It’s All About Where the Data Lives (Cache is the King)

本文一共 2349 个汉字, 你数一下对不对.
性能的隐藏引擎: 一切都取决于数据存储的位置(缓存为王). (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 性能的隐藏引擎: 一切都取决于数据存储的位置(缓存为王) 学习笔记 硬件 计算机 计算机
The post 性能的隐藏引擎: 一切都取决于数据存储的位置(缓存为王) first appeared on 小赖子的英国生活和资讯.

用 Python 学强化学习: Q-Learning 迷宫示例

2025-11-12 19:42:49


q-learning 用 Python 学强化学习: Q-Learning 迷宫示例 Python 人工智能 (AI) 学习笔记 计算机

Q Learning强化学习算法(机器学习/人工智能)

强化学习(Reinforcement Learning, RL)是一种让智能体/Agent通过与环境交互、试错学习来获得最优行为策略的机器学习方法。本文用一个简单的 Q-learning 迷宫示例,帮助你快速理解强化学习的基本原理。

强化学习入门:从试错中学习的艺术
Reinforcement Learning 101: The Art of Learning by Trial and Error

深度解析强化学习:Q-Learning算法详解
Deep Dive into Reinforcement Learning: Understanding the Q-Learning Algorithm

机器如何学会自己做决定?强化学习告诉你答案
How Do Machines Learn to Make Their Own Decisions? Reinforcement Learning Explained

从奖励中学习:人工智能的“试错智慧”
Learning from Rewards: The Trial-and-Error Intelligence Behind AI

一、什么是强化学习?

强化学习的世界中包含五个关键要素:

  • Agent(智能体):做决策、执行动作的主体
  • Environment(环境):智能体所处的世界
  • State(状态):当前环境的描述
  • Action(动作):智能体可采取的操作
  • Reward(奖励):环境反馈,用来衡量动作的好坏

智能体的目标是学习一个策略 π(a|s),让它在每个状态下选择最优动作,从而获得最大的累积奖励。

tex_0bb31879c02d90e2cfcde8f7b90d3197 用 Python 学强化学习: Q-Learning 迷宫示例 Python 人工智能 (AI) 学习笔记 计算机

其中 tex_ed4a6eb2a14bd14312d35c48fc1e62ac 用 Python 学强化学习: Q-Learning 迷宫示例 Python 人工智能 (AI) 学习笔记 计算机 (0 ≤ tex_ed4a6eb2a14bd14312d35c48fc1e62ac 用 Python 学强化学习: Q-Learning 迷宫示例 Python 人工智能 (AI) 学习笔记 计算机 ≤ 1)是折扣因子,用于衡量未来奖励相对于即时奖励的重要程度。

二、Q-Learning 原理

Q-learning 是最经典的强化学习算法之一。它通过学习一个 Q 表(Q-table)来记录每个“状态-动作”对的价值。

更新公式如下:


tex_0036f58d67bb46f4f55f3c3bdfa52fbb 用 Python 学强化学习: Q-Learning 迷宫示例 Python 人工智能 (AI) 学习笔记 计算机

其中:

  • tex_4a1eac2e51197f9d39959a2cb9f8a459 用 Python 学强化学习: Q-Learning 迷宫示例 Python 人工智能 (AI) 学习笔记 计算机 :学习率(Learning Rate)
  • tex_01c3c58d2b5c697d78379167040a33ca 用 Python 学强化学习: Q-Learning 迷宫示例 Python 人工智能 (AI) 学习笔记 计算机 :折扣因子(Discount Factor)
  • tex_02f4c130a05a4c170e643aa09a7dba7d 用 Python 学强化学习: Q-Learning 迷宫示例 Python 人工智能 (AI) 学习笔记 计算机 :奖励(Reward)
  • tex_17e85b0ccc7a1cee48348421922941fb 用 Python 学强化学习: Q-Learning 迷宫示例 Python 人工智能 (AI) 学习笔记 计算机 :下一状态(Next State)

三、迷宫环境设计

定义一个 3×5 的迷宫

  • 0:空地
  • -1:墙
  • 1:出口(目标)

四、完整 Python 实现代码


import numpy as np
import random

# 1️⃣ 定义迷宫
maze = np.array([
    [0,  0,  0, -1,  1],
    [0, -1,  0, -1,  0],
    [0,  0,  0,  0,  0]
])

n_rows, n_cols = maze.shape
actions = ['up', 'down', 'left', 'right']
Q = np.zeros((n_rows, n_cols, len(actions)))

# 2️⃣ 超参数
alpha = 0.1
gamma = 0.9
epsilon = 0.1
episodes = 500

# 3️⃣ 辅助函数
def is_valid(state):
    r, c = state
    return 0 <= r < n_rows and 0 <= c < n_cols and maze[r, c] != -1

def next_state(state, action):
    r, c = state
    if action == 'up': r -= 1
    elif action == 'down': r += 1
    elif action == 'left': c -= 1
    elif action == 'right': c += 1
    return (r, c)

def get_reward(state):
    r, c = state
    if maze[r, c] == 1: return 10
    elif maze[r, c] == -1: return -1
    return -0.1

# 4️⃣ 训练循环
for episode in range(episodes):
    state = (2, 0)
    done = False

    while not done:
        if random.uniform(0, 1) < epsilon:
            action_idx = random.randint(0, len(actions)-1)
        else:
            action_idx = np.argmax(Q[state[0], state[1]])

        action = actions[action_idx]
        next_s = next_state(state, action)

        if not is_valid(next_s):
            reward = -1
            next_s = state
        else:
            reward = get_reward(next_s)

        Q[state[0], state[1], action_idx] += alpha * (
            reward + gamma * np.max(Q[next_s[0], next_s[1]]) - Q[state[0], state[1], action_idx]
        )

        state = next_s
        if maze[state[0], state[1]] == 1:
            done = True

print("✅ 训练完成!")

# 5️⃣ 查看学到的路径
state = (2, 0)
path = [state]

while maze[state[0], state[1]] != 1:
    action_idx = np.argmax(Q[state[0], state[1]])
    next_s = next_state(state, actions[action_idx])
    if not is_valid(next_s) or next_s in path:
        break
    state = next_s
    path.append(state)

print("🗺️ 学到的路径:", path)

五、运行结果

运行上面的代码后,你会看到类似输出:


✅ 训练完成!
🗺️ 学到的路径: [(2, 0), (2, 1), (2, 2), (1, 2), (0, 2), (0, 3), (0, 4)]

这说明智能体成功学会了走出迷宫 🎯

六、总结

强化学习使机器能够通过反馈学习最优策略,这类似于人类通过经验学习的方式。
Q-Learning 是许多现代强化学习算法的基础,包括深度 Q 网络(Deep Q-Networks, DQN)。
这个简单的示例展示了完整的强化学习循环:探索 → 反馈 → 改进。

  • Q 表:保存每个状态-动作的价值
  • ε-greedy 策略:平衡探索与利用
  • 奖励函数设计:引导智能体形成目标导向行为
  • 强化学习思想:通过试错和奖励反馈不断改进策略

强化学习的魅力在于,它不需要显式答案,而是让机器自己“摸索”出最优策略。你可以在此基础上继续扩展,比如加入 matplotlib 动画可视化 或使用 神经网络(Deep Q-Learning) 解决更复杂的任务。

英文:How Do Machines Learn to Make Their Own Decisions? Reinforcement Learning Explained

本文一共 705 个汉字, 你数一下对不对.
用 Python 学强化学习: Q-Learning 迷宫示例. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 用 Python 学强化学习: Q-Learning 迷宫示例 Python 人工智能 (AI) 学习笔记 计算机
The post 用 Python 学强化学习: Q-Learning 迷宫示例 first appeared on 小赖子的英国生活和资讯.