[讨论] 平行化计算质数数量

楼主: noahleft (NoahLeft)   2021-07-04 11:02:42
*感谢版友EricTCartman和Schottky的建议 采用Sieve法来取质数*
*感谢版友stucode的建议 避免data race*
*更新Sieve法的benchmark*
问题:计算小于N的质数数量.
接续问题:改成平行化. 且注意load-balance.
版本1(非平行化): 所有质数不会被小于自己的质数整除
用一个vector存所有小于N的质数,
M=[2..N], 只要确认所有小于M的质数无法整除就好,
最后回传总数
版本2(非平行化): 所有质数不会被小于自己的整数整除
M=[2..N], 只确认所有小于M/2的数字无法整除
版本3(平行化): 将版本2用pthread实现
版本4(非平行化): Sieve法:质数的合数必不是质数
版本5(非平行化): 同上 只是将目标函式抽取出来
版本6(平行化): 将版本5以lock-free方式平行化且改为任何数的合数必不是质数
感谢版友stucode提到data race
为了避免data race, 每个thread不会取用到其他thread的资料
可编译版本可以看下面这个gist
https://gist.github.com/noahleft/27c52232932db6c77e78d78e09d2420d
Benchmark: N=1M
版本1: 22.82 sec
版本2:128.62 sec
版本3: 72.73 sec
Benchmark: N=100M
版本4: 9.33 sec
版本5: 9.52 sec
版本6: 13.24 sec
值得注意的是我有试着用mux方式去实作"选择下一个质数",
然而对这个题目而言,使用lock的成本太高
作者: EricTCartman (阿ㄆㄧㄚˇ)   2021-07-04 11:41:00
版本一的做法怪怪的,一般都是用划表的方式做
作者: Schottky (顺风相送)   2021-07-04 11:42:00
https://bit.ly/3wkN76F 这方法不错,供您参考
作者: EricTCartman (阿ㄆㄧㄚˇ)   2021-07-04 11:42:00
版本1动态内存配置太花时间, 容器也不方便平行化你用筛法就能直接平行滤掉了
楼主: noahleft (NoahLeft)   2021-07-04 11:54:00
感谢 问题看来是一开始提的方法不适合平行化
作者: stucode   2021-07-05 19:43:00
你的筛法平行版本有点问题,vector<bool> 的特性可能会导致 data race

Links booklink

Contact Us: admin [ a t ] ucptt.com