代码之家  ›  专栏  ›  技术社区  ›  J D

Cilk的共享内存并行编程方法是灵丹妙药吗?

  •  3
  • J D  · 技术社区  · 14 年前

    共享内存并行编程(特别是多核)中的哪些挑战无法解决,或者无法使用Cilk风格的解决方案(即每核工作窃取任务的嵌套数据并行)有效解决?

    1 回复  |  直到 14 年前
        1
  •  6
  •   Ira Baxter    14 年前

    任务 并行性(可用于实现 数据并行性)。它很可爱,但是。。。

    Cilk不支持SIMD数据并行或流并行。

    它不跨线程边界处理(AFAIK)异常处理。 如果您想要构建一个非常大、复杂的符号应用程序,这是必需的。 如果您想进行推测性计算,它也很有用。

    第二个含义是Cilk应用程序不能在巨大的数据结构上递归,因为您选择的任何大小的堆栈都是有界的,并且有一个示例,您将耗尽堆栈。(这不是Cilk的设计缺陷,只是其实现的缺陷)。这太糟糕了,因为巨大的东西是你想要并行的地方之一。

    PARLANSE ,提供 任意大数量的计算粒度,具有工作窃取,但具有堆分配的粒度和激活记录。每个颗粒都有自己的上下文(因此可以实现大量的颗粒交互集,因为在需要等待事件时保存颗粒状态非常简单。PARLANSE synchonization原语包括未来、信号量和关键函数结果(见下文)

    PARLANSE提供了显式的“团队”(计算粒度集)作为抽象,异常从函数传播到计算粒度的顶部(Java将其定义为“未定义”,这很愚蠢),然后作为异步中止异常返回给团队父级,再返回给所有其他团队子级(可在try子句中捕获)让其他孩子打扫卫生。

    关键功能 ,其结果保证以原子方式返回给调用方,因此函数可以肯定地返回结果,也可以不返回,并且函数可以在异步中止处理程序中安全地清理资源。

    特殊的“偏序”团队允许对已知偏序的计算进行编码;我认为,如果您有大量这样的数据集,那么这比Cilk的嵌套并行性更有效。

    (我们使用PARLANSE来实现 large-scale program analysis/transformation tools.

    (PARLANSE也不做流或SIMD,但它们不超出语言的范围。人们可以将流和SIMD添加到C和C++中,但它可能相当困难)。