StanFord CS149 Assignment4 简记
2024-02-15 14:20:10
# Labs
Part 1
串行实现根据伪代码即可, 难度不大
并行化的部分也可以直接看代码
重点是其中一个 reduction 的操作
使用 reduction 而不是直接 parallel for 的原因是后者会不断对 global_diff 做原子操作, 而 reduction 效率更高
Part 2
朴素并行化
- 在
top_down_step下的第一个循环加上#pragma omp parallel for - 把 访问
distance的部分加上#pragma omp critical
优化
注意到 new_frontier->count 这个变量被访问很多次, 不断进行原子自增操作
可以拆分, 每个线程在本地做这些操作, 然后在最后通过 memcpy 和 __sync_fetch_and_add 与全局的信息做合并
优点: 每个线程多次访问 new_frontier->count 变成 每个线程只需要访问一次
Part 3
实现细节见代码
区别
top_down: 从frontier中向外探索bottom_up看所有的点是否是frontier中的后继结点
自底向上的优缺点
- 优点
- 写的时候只改变
distances[i], 不需要复杂的CAS操作 - 看到一个满足条件的
frontier就可以直接退出循环 - 自己的
distance不是 -1 的时候也可以退出循环
- 写的时候只改变
- 缺点
- 需要遍历所有的点, 计算量大
Part 4
综上所述
- 如果
frontier中点不多, 最好使用top_down - 如果
frontier中点很多, 那就不如使用bottom_up
多不多的界限可以实验, 这里取 10000000 作为分界点