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 作为分界点