首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Intel TBB可变广播

Intel TBB可变广播
EN

Stack Overflow用户
提问于 2014-01-15 13:11:47
回答 1查看 177关注 0票数 0

我使用英特尔TBB来创建平行的Eratosthenes筛。我已经用C语言在MPI中完成了这一工作。

所以,我想要我的第一个线程(或任务?)找到一个素数,然后广播到其他线程,这样他们都可以“交叉”这个素数从他们的部分数组。

问题是:我找不到办法:

  1. 检测第一个线程或任务。
  2. 让其他人等到第一个线程或任务广播它的素数。

我已经知道如何使用减缩等,但我找不到这个。我发现了一个非常快的Eratosthenes算法的例子,但是根本没有同步,算法是不同的,我需要并行这个精确的默认算法。

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2014-02-21 01:38:17

我想更好地理解算法,所以我做了一些在“平行的Eratosthenes”上搜索并发现,它使用类似于您的方法的语言,但没有很好地解释算法。基于算法的描述,它不适合像TBB这样基于任务的API。具体来说,一个任务不应该阻止或等待任何事情;当它有工作要做时,应该生成它,然后运行到完成。如果我们将您的算法的概念调整为基于任务的方法,那么它将如下所示:

  1. 创建一个向量来保存已知的素数。这里不需要并发,因为它不会被并发写入。用一个启动集填充它(所有素数都达到100?)创建一个int来保存最大的选中数字(设置为100)。
  2. 从最大的选中数p+1到不大于p^2的某个数,启动一个数字分区。每个parallel_reduce任务都将维护自己发现的素数向量。parallel_reduce将自动将这些任务细分为较小的任务。
  3. 在parallel_reduce任务中,每个任务都使用已知素数向量运行串行筛,以消除其范围内的复合数,并填充自己的已发现素数向量。
  4. 当parallel_reduce连接两个任务时,将所有素数从一个任务的向量复制到另一个任务的向量。
  5. 当你完成一项任务时,你就有了一个素数向量来附加到已知的素数中。同样,这里不需要并发性。
  6. 将最大选中数字的整数更新为您检查过的任何内容,然后返回到步骤2,直到您得到了所需的所有素数。

因此,没有“广播”的质数,也没有任何特殊的工作,为第一项任务。只有一系列的parallel_reduces让你得到越来越多的质数。

更新

如果必须在任务之间传递信息,则使用TBB的方法是使用tbb::互斥保护对该数据的访问。

然而,设计的挑战不是如何在任务之间安全地传输数据--挑战是,每个任务在等待数据时都在做什么?,如果答案是“无”,那么您就不应该使用任务。任务被设计为运行到完成,不应该在同步原语(如tbb::mutex )上旋转、等待或阻塞。如果您可以设计您的任务,使它们在工作中迭代,并定期检查来自其他任务的新数据,以便修改它们的方法,这将很好。同样的迭代和检查新数据方法可以更容易地用一系列parallel_reduce调用建模,如上面所详述的那样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21138348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档