我使用英特尔TBB来创建平行的Eratosthenes筛。我已经用C语言在MPI中完成了这一工作。
所以,我想要我的第一个线程(或任务?)找到一个素数,然后广播到其他线程,这样他们都可以“交叉”这个素数从他们的部分数组。
问题是:我找不到办法:
我已经知道如何使用减缩等,但我找不到这个。我发现了一个非常快的Eratosthenes算法的例子,但是根本没有同步,算法是不同的,我需要并行这个精确的默认算法。
提前感谢!
发布于 2014-02-21 01:38:17
我想更好地理解算法,所以我做了一些在“平行的Eratosthenes”上搜索并发现,它使用类似于您的方法的语言,但没有很好地解释算法。基于算法的描述,它不适合像TBB这样基于任务的API。具体来说,一个任务不应该阻止或等待任何事情;当它有工作要做时,应该生成它,然后运行到完成。如果我们将您的算法的概念调整为基于任务的方法,那么它将如下所示:
因此,没有“广播”的质数,也没有任何特殊的工作,为第一项任务。只有一系列的parallel_reduces让你得到越来越多的质数。
更新
如果必须在任务之间传递信息,则使用TBB的方法是使用tbb::互斥保护对该数据的访问。
然而,设计的挑战不是如何在任务之间安全地传输数据--挑战是,每个任务在等待数据时都在做什么?,如果答案是“无”,那么您就不应该使用任务。任务被设计为运行到完成,不应该在同步原语(如tbb::mutex )上旋转、等待或阻塞。如果您可以设计您的任务,使它们在工作中迭代,并定期检查来自其他任务的新数据,以便修改它们的方法,这将很好。同样的迭代和检查新数据方法可以更容易地用一系列parallel_reduce调用建模,如上面所详述的那样。
https://stackoverflow.com/questions/21138348
复制相似问题