数学公式与计算机架构知识详解
1. 数学概率示例
先看一个抛硬币的例子。抛
n
枚硬币,设
Xi
为第
i
枚硬币正面朝上的指示变量,那么
X = X1 + ··· + Xn
就是正面朝上的总数。显然,
E[X] = n/2
。有概率边界
prob(X ≤(1−ε)n/2) ≤e−ε²n/4
。当
ε = 0.1
时,
prob(X ≤0.9·n/2)≤e−0.01·n/4
。比如
n = 10000
,正面朝上的期望数是 5000,而正面朝上总数小于 4500 的概率小于
e−25
,这是一个极小的数。
同时给出了两个练习题:
-
练习 A.3
:估计上述例子中
X
大于 5050 的概率。
-
练习 A.4(球与箱子问题延续)
:设
W
为 1 号箱子中的球数,需证明
prob(W = k) = C(n, k) * (1/m)ᵏ * (1 - 1/m)⁽ⁿ⁻ᵏ⁾
,并尝试计算
E[W] = ∑k prob(W = k)k
。
2. 有用的数学公式
以下是一些有用的数学公式及其证明:
| 公式名称 | 公式内容 |
| ---- | ---- |
| 阶乘的简单近似 |
(n/e)ⁿ ≤ n! ≤ nⁿ
,更精确的是
e * (n/e)ⁿ ≤ n! ≤ (en) * (n/e)ⁿ
|
| 斯特林阶乘近似 |
n! = (1 + O(1/n)) * √(2πn) * (n/e)ⁿ
|
| 二项式系数近似 |
C(n, k) ≤ (n * e / k)ᵏ
|
| 前
n
个整数的和 |
∑(i = 1 to n) i = n(n + 1) / 2
|
| 调和数 |
lnn ≤ Hn = ∑(i = 1 to n) 1/i ≤ lnn + 1
|
| 几何级数 |
∑(i = 0 to n - 1) qⁱ = (1 - qⁿ) / (1 - q) (q ≠ 1)
;
∑(i ≥ 0) qⁱ = 1 / (1 - q) (|q| < 1)
;
∑(i ≥ 0) 2⁻ⁱ = 2
;
∑(i ≥ 0) i * 2⁻ⁱ = 2
|
| 詹森不等式 | 对于凹函数
f
,
∑(i = 1 to n) f(xi) ≤ n * f(∑(i = 1 to n) xi / n)
;对于凸函数
f
,
∑(i = 1 to n) f(xi) ≥ n * f(∑(i = 1 to n) xi / n)
|
| 对数的泰勒级数近似 |
x - 1/2 * x² ≤ ln(1 + x) ≤ x - 1/2 * x² + 1/3 * x³ ≤ x
|
3. 公式证明
-
阶乘近似公式证明
:
-
对于
n! ≤ nⁿ,因为n! = n(n - 1)···1,显然n! ≤ nⁿ。 -
对于
n! ≥ (n/e)ⁿ,由微积分知识eˣ = ∑(i ≥ 0) xⁱ / i!,当x = n时,eⁿ ≥ nⁿ / n!,所以n! ≥ (n/e)ⁿ。更精确的上下界通过积分估计得到。
-
对于
-
二项式系数近似公式证明
:由阶乘近似公式可得
C(n, k) = n(n - 1)···(n - k + 1) / k! ≤ nᵏ / (k/e)ᵏ = (n * e / k)ᵏ。 -
前
n个整数和公式证明 :
graph LR
A[1 + 2 + ... + n] --> B[1/2 * ((1 + 2 + ... + n - 1 + n) + (n + n - 1 + ... + 2 + 1))]
B --> C[1/2 * ((n + 1) + (2 + n - 1) + ... + (n - 1 + 2) + (n + 1))]
C --> D[n(n + 1) / 2]
通过将原式与倒序相加,再进行化简得到结果。
-
调和数公式证明
:利用积分估计,
∫(i + 1 to i) (1/x)dx ≤ 1/i ≤ ∫(i to i - 1)(1/x)dx
,从而得到
lnn ≤ ∑(i = 1 to n) 1/i ≤ 1 + lnn
。
-
几何级数公式证明
:由
(1 - q) * ∑(i = 0 to n - 1) qⁱ = ∑(i = 0 to n - 1) qⁱ - ∑(i = 1 to n) qⁱ = 1 - qⁿ
,当
|q| < 1
时,令
n
趋于无穷,可得
∑(i ≥ 0) qⁱ = 1 / (1 - q)
。当
q = 1/2
时,
∑(i ≥ 0) 2⁻ⁱ = 2
,
∑(i ≥ 1) i * 2⁻ⁱ = 2
。
-
詹森不等式证明
:用数学归纳法,当
n = 1
时无需证明。假设
n ≥ 2
,设
x* = ∑(1 ≤ i ≤ n)xi / n
,
x¯ = ∑(1 ≤ i ≤ n - 1)xi / (n - 1)
,通过一系列推导和凹函数性质可证。
4. 计算机架构 - 核心与硬件线程
以运行共享内存程序的机器为例,该机器有四个英特尔至强 E7 - 8890 v3 处理器,每个处理器有 18 个核心。处理器核心有用于执行指令的算术和逻辑单元以及控制指令流执行的流水线。指令来自最多两个硬件线程,每个硬件线程有专用寄存器存储操作数,核心的其他资源大多由两个线程共享。
由于 x86 是复杂指令集计算机(CISC)架构,指令复杂,先被转换为类似精简指令集计算机(RISC)的微指令。流水线最多有 19 个阶段处理微指令,机器是超标量的,同一流水线阶段最多可同时处理 8 条指令。但由于指令间的数据依赖、大内存访问延迟和条件分支等原因,通常难以达到 8 条指令的处理量。使用两个硬件线程共享资源可减少资源浪费,但性能提升不一定明显,甚至可能为负。所以在实际中,选择硬件线程或专用核心取决于哪种能带来更好的整体性能。
5. 计算机架构 - 内存层次结构
该机器的每个核心有 32 KB 的一级(L1)数据缓存,由核心支持的硬件线程共享,还有同样大小的单独 L1 指令缓存。缓存内容以 64 字节的块(缓存行)管理,地址按缓存行大小对齐。
每个核心还有 256 KB 的二级(L2)统一缓存,用于数据和指令。L1 缓存追求速度,L2 缓存采用更紧凑设计但访问延迟更高、吞吐量更低。
所有核心共享一个 45 MB 的三级(L3)缓存,同一芯片上的许多并发内存操作可在 L3 缓存内完成,无需访问主内存。这就是很多共享内存程序在单芯片上扩展性好,多芯片上扩展性差的原因之一。
机器每个处理器芯片连接 128 GB 主内存,称为内存层次结构的第四级。处理器芯片通过高速互连接口连接,每个芯片都有到其他芯片的专用链路。非本地内存访问会有更高延迟和更低带宽,这种现象称为非统一内存访问(NUMA),处理器芯片也叫 NUMA 节点。
数学公式与计算机架构知识详解
6. 计算机架构 - 缓存一致性协议
-
顺序缓存替换策略
:当核心访问地址
i的数据时,会在数据缓存中查找包含该数据的缓存行b。若层次结构中包含b的最高层为j,则将b复制到j - 1层到 1 层的缓存中,再从 1 层访问。移动缓存行可能需逐出另一个块,若该块被修改过,则需写入下一层。- 若访问的数据跨两个缓存行,即使数据小于块大小,也会增加成本,某些操作对非对齐访问还会有额外开销或无法工作。因此,合理的数据布局避免非对齐访问是重要的性能优化手段。
- 写操作处理 :假设采用写回缓存,写操作先到 L1 缓存。若访问的缓存行已在 L1 缓存中,操作简单;否则,可能需逐出其他缓存行,并从较低层次读取访问的块,以避免额外的簿记工作。
-
共享内存并行计算机中的问题
:在共享内存并行计算机中,多个处理元素(PE)访问同一内存块时会更复杂。若 PE
i写入块b,其他 PEj本地缓存中的b副本将无效,需使该副本无效并重新读取,这会导致显著开销,也是共享内存程序可扩展性受限的主要原因之一。- 即使 PEs 访问同一缓存行的不同内存位置,也会出现这种开销,称为伪共享。可通过仔细的内存布局避免,如为锁变量分配完整的缓存行,或使用该缓存行剩余部分存储仅由持有该锁的线程访问的数据,这种使数据结构比必要时更大的技术称为填充。
-
当多个线程同时尝试写入同一缓存行
b时,性能会显著下降,称为对b的争用。
-
内存一致性模型
:实际机器的内存访问与理想化的即时全局可见效果相差甚远,硬件的缓存一致性机制只能为应用程序提供近似的理想化视图。机器的内存一致性模型或内存模型定义了与理想化视图的可能偏差。
- 编译器或硬件会对线程的内存访问操作进行重新排序,一些写操作会通过额外的内存缓冲区延迟。在顺序程序中,这种操作不会改变计算结果,但在并发程序中会引发问题。
-
在 C++ 中,存储类
volatile确保变量在使用前总是从内存加载,且编译器不会对volatile变量的访问进行重新排序。atomic_signal_fence(memory_order_seq_cst);语句为编译器定义了内存屏障,屏障前的所有读写操作必须在屏障后的所有读写操作之前编译。 -
x86 架构保证线程的读操作对其他线程按正确顺序出现,写操作也是如此,但硬件可能会对读操作和较旧的不同位置写操作进行重新排序。可使用 C++ 命令
atomic_thread_fence()保证读写操作的顺序。不过,不同线程的操作仍可能任意混合,且对不同线程的显示顺序可能不同。
7. 计算机架构 - 原子操作
- 比较并交换(CAS)操作 :x86 架构的 CAS 操作与之前描述的完全一致,可用于访问 32 位、64 位或对齐的 128 位数据。其他一些架构的 CAS 操作可能最多仅支持 64 位,或保证稍弱,有时即使实际值等于期望值也可能失败,这可能需要额外的检查循环。
- 其他原子指令 :x86 架构和其他架构还提供原子的获取并加/减/最小/最大/与/或/异或指令。虽然可以使用 CAS 实现这些操作,但使用内置操作可能更快,特别是当多个线程争用对同一变量的操作时。
8. 计算机架构 - 硬件事务性内存
从 Haswell 微架构开始,英特尔 x86 处理器支持一种受限的硬件事务性内存实现,称为事务同步扩展。程序员可以使用机器指令
XBEGIN
和
XEND
封装临界区。
-
事务失败处理
:与简单机制不同,事务
t
可能失败,即硬件检测到另一个线程以某种方式访问了
t
触及的缓存行,使得
t
看起来不是原子执行的。此时,事务将回滚,所有效果将被撤销,并调用中止处理程序。
-
重试与后备机制
:可以重试事务,但可能会出现事务不断失败而系统无法前进的情况。因此,程序员必须提供一些最终的后备机制,如使用锁或原子操作来保证系统正常工作。当事务中止不太可能发生,即事务访问的内存部分争用较小时,硬件事务在性能方面具有吸引力。
9. 计算机架构 - 内存管理
在现实中,内存并非像随机存取机(RAM)模型中的简单一维数组。
-
虚拟地址
:进程看到的是虚拟地址。虚拟内存管理将虚拟地址映射到物理地址,这增加了内存管理的复杂性。
-
内存分配与释放
:操作系统负责内存的分配和释放,以满足进程的内存需求。不同的操作系统和编程语言有不同的内存管理策略和机制。例如,C++ 中的
new
和
delete
运算符用于动态内存分配和释放,而 Java 有自动垃圾回收机制来管理内存。
总结
本文详细介绍了数学概率中的抛硬币示例及相关公式,包括阶乘近似、二项式系数近似等公式的证明,还深入探讨了计算机架构的多个方面,如核心与硬件线程、内存层次结构、缓存一致性协议、原子操作、硬件事务性内存和内存管理。了解这些知识对于编写高效的并行程序和理解计算机系统的工作原理至关重要。在实际应用中,需要根据具体情况选择合适的技术和策略,以优化程序性能和提高系统的可扩展性。
| 主题 | 关键要点 |
|---|---|
| 数学概率 | 抛硬币示例的概率计算,多个有用数学公式及证明 |
| 核心与硬件线程 | x86 架构核心与硬件线程特点,性能影响因素 |
| 内存层次结构 | L1、L2、L3 缓存及主内存特点,NUMA 现象 |
| 缓存一致性协议 | 顺序缓存替换、写操作处理、共享内存问题及解决方法 |
| 原子操作 | CAS 操作及其他原子指令特点 |
| 硬件事务性内存 | 事务执行、失败处理及后备机制 |
| 内存管理 | 虚拟地址、内存分配与释放机制 |
graph LR
A[计算机架构] --> B[核心与硬件线程]
A --> C[内存层次结构]
A --> D[缓存一致性协议]
A --> E[原子操作]
A --> F[硬件事务性内存]
A --> G[内存管理]
B --> B1[CISC 架构指令处理]
B --> B2[流水线与超标量处理]
B --> B3[硬件线程性能影响]
C --> C1[L1 缓存特点]
C --> C2[L2 缓存特点]
C --> C3[L3 缓存特点]
C --> C4[主内存与 NUMA 现象]
D --> D1[顺序缓存替换策略]
D --> D2[写操作处理]
D --> D3[共享内存问题及解决]
E --> E1[CAS 操作特点]
E --> E2[其他原子指令]
F --> F1[事务执行与失败处理]
F --> F2[重试与后备机制]
G --> G1[虚拟地址]
G --> G2[内存分配与释放]
超级会员免费看
8634

被折叠的 条评论
为什么被折叠?



