我一直致力于prime sieve算法,基本的实现对我来说很好。我目前正在努力解决的问题是将计算分配并分配到多个处理器。
我知道它需要在共享内存区域或文本文件中存储实际筛子,但是如何分割计算相关步骤。
任何领导都会有所帮助。谢谢!
答案 0 :(得分:4)
将数字拆分为相同大小的部分,每个处理器将负责其中一个部分。
另一个处理器(或其中一个处理器)将生成多个需要被交叉的数字。并将此号码传递给其他处理器。
然后,每个处理器将使用节大小的剩余部分除以给定的数字和它自己的节索引来确定偏移到它自己的部分,然后循环并交叉掉适用的数字。
或者,只需使用共享内存就可以获得更简单的方法。
让第一个处理器开始越过2的倍数,3的第二个倍数,5的第三个倍数等等。
基本上只是让每个处理器从数组中获取下一个数字并随之运行。
如果你做得不好,你最终可能会得到第三次穿越4的倍数,因为当第三次开始时第一次没有达到4,所以它没有被划掉,但它不应该' t会导致更多的工作 - 处理器会抓住一些素数的倍数需要越来越长的时间,而处理该素数的处理器总是处理掉第一个值,因此发生这种冗余的可能性很快就会减少。
使用像这样的共享内存往往会有风险 - 如果你计划每个索引使用一位,大多数语言不允许你在那个级别上工作,你最终需要做一些按位操作(可能按位-AND)在几个字节上进行所需的更改(虽然这种复杂性可能隐藏在某些API中),并且许多语言也不会将此操作称为所谓的原子操作,这意味着一个线程可以获得一个值,然后把它写回来,另一个可以在第一个线程写入之前进入并获取值,然后在第一个线程的写入之后将其写回,从而导致第一个线程的更改丢失。对此没有简单有效的解决方案 - 你究竟需要做什么将取决于语言。