程序多线程化时应生成多少线程?
1. 问题引入
在程序多线程化过程中,软件流水线调度并不一定能带来最佳的多线程性能。为解决这一问题,提出了一种基于 OPT 内核的 T - OPT 技术,该技术通过高级的以线程级并行(TLP)为中心的代码移动,消除内核中的线程同步需求,并帮助确定使用的线程数量。
2. 示例数据依赖图
以一个数据依赖图(DDG)为例进行说明,图中虚线箭头表示循环携带依赖,实线箭头表示迭代内数据依赖,依赖距离用尖括号表示。此 DDG 中存在一些简单循环,如 v2 → v5 → v8 → v2
、 v4 → v7 → v4
、 v2 → v5 → v3 → v4 → v8 → v2
。
3. 不同调度方法分析
3.1 贪心调度(Greedy Schedule)
贪心调度采用 ASAP(尽快)调度策略,将 DDG 对应的循环每次迭代映射到不同线程。同一水平层的操作在功能单元可用时可并行执行,迭代间的数据依赖通过同步原语(如 post
、 wait
)来保证。但线程同步限制了 TLP 的利用,随着调度进行,会出现流水线气泡,且气泡会逐渐变长,导致线程空闲增加,影响多线程性能。迭代间的数据依赖关系如下:
- v15 → v10
- v17 → v5
- v8 → v2
- v5 → v3
-