4

我正在 Linux 中创建一个多线程应用程序。这是场景:

假设我有一个类的 x 实例BloomFilter并且我有一些 y GB 的数据(大于可用内存)。我需要在每个布隆过滤器实例中测试这 y GB 数据的成员资格。很明显,并行编程将有助于加快任务速度,因为我只读取数据,因此它可以在所有进程或线程之间共享。

现在我对使用 Cilk、Cilk++ 还是 OpenMP(哪个更好)感到困惑。此外,我对多线程或多处理选择哪一个感到困惑

4

2 回答 2

4

Cilk Plus 是英特尔当前对 Cilk 的实施。它们都是多线程环境,即在执行期间产生多个线程。

如果您不熟悉并行编程,OpenMP 可能更适合您,因为它允许更轻松地并行化已开发的顺序代码。您是否已经有代码的顺序版本?

OpenMP 使用 pragma 指示编译器哪些部分的代码必须并行运行。如果我正确理解你的问题,你可能需要这样的东西:

   #pragma omp parallel for firstprivate(array_of_bloom_filters)
   for i in DATA:
      check(i,array_of_bloom_filters);

不同的布隆过滤器的实例在每个线程中复制,以避免在线程之间共享数据时发生争用。

更新: 本文实际上考虑了一个非常不平衡的应用程序,即不同的任务(分配在不同的线程上)可能会产生非常不同的工作负载。引用你提到的论文“一个高度不平衡的任务图,挑战调度、负载平衡、终止检测和任务粗化策略”。考虑到为了平衡线程之间的计算,有必要减少任务大小,从而增加同步所花费的时间。换句话说,良好的负载平衡总是要付出代价的。您的问题的描述不是很详细,但在我看来,您遇到的问题是相当平衡的。如果不是这种情况,那就选择 Cilk,它的工作窃取方法可能是不平衡工作负载的最佳解决方案。

于 2012-06-09T16:07:07.827 回答
1

在发布此消息时,英特尔正在大力推动 Cilk(tm) Plus;最近,一些工作已转向 OpenMP 4.0。通常很难将 OpenMP 与 Cilk(tm) Plus 进行对比。
如果不可能在线程之间均匀分配工作,可能会在 OpenMP 版本中设置 schedule(runtime),然后在运行时尝试环境变量的各种值,例如 OMP_SCHEDULE=guided、OMP_SCHEDULE=dynamic,2 或 OMP_SCHEDULE=汽车。这些是与 Cilk(tm) Plus 窃取工作方式最接近的 OpenMP 类比。英特尔 MKL 库中的一些稀疏矩阵函数实际上会首先扫描作业并确定分配给每个线程的数量以平衡工作。为了使这种方法有用,串行扫描和分配所花费的时间必须低于并行工作所花费的时间。工作窃取或动态调度可能会失去 OpenMP 在提升缓存局部性方面的许多潜在优势,例如通过 OMP_PROC_BIND=close 来固定具有缓存局部性的线程。在 NUMA 架构上,糟糕的缓存局部性成为一个更大的问题,它可能导致在远程内存访问上花费大量时间。OpenMP 和 Cilk(tm) Plus 都具有在串行和并行执行之间切换的功能。

于 2014-01-20T14:08:50.167 回答