Ama*_*tam 5 parallel-processing openmp cilk cilk-plus
我正在 Linux 中创建一个多线程应用程序。这是场景:
假设我有一个类的 x 个实例BloomFilter
,并且有一些 y GB 的数据(大于可用内存)。我需要测试每个布隆过滤器实例中这 y GB 数据的成员资格。很明显,并行编程将有助于加快任务速度,而且因为我只读取数据,因此它可以在所有进程或线程之间共享。
现在我很困惑该使用 Cilk、Cilk++ 还是 OpenMP 哪一个(哪一个更好)。我也很困惑该选择多线程还是多处理
Cilk Plus 是 Intel 目前实施的 Cilk。它们都是多线程环境,即在执行过程中产生多个线程。
如果您不熟悉并行编程,OpenMP 可能更适合您,因为它可以更轻松地并行化已开发的顺序代码。您已经有代码的顺序版本吗?
OpenMP 使用 pragma 指示编译器代码的哪些部分必须并行运行。如果我正确理解你的问题,你可能需要这样的东西:
#pragma omp parallel for firstprivate(array_of_bloom_filters)
for i in DATA:
check(i,array_of_bloom_filters);
Run Code Online (Sandbox Code Playgroud)
不同布隆过滤器的实例在每个线程中复制,以避免在线程之间共享数据时发生争用。
更新: 本文实际上考虑了一个非常不平衡的应用程序,即不同的任务(分配在不同的线程上)可能会产生非常不同的工作负载。引用您提到的论文“一个高度不平衡的任务图,挑战调度、负载平衡、终止检测和任务粗化策略”。考虑到为了平衡线程之间的计算,有必要减少任务大小,从而增加同步所花费的时间。换句话说,良好的负载平衡总是有代价的。你的问题描述不是很详细,但在我看来,你遇到的问题是相当平衡的。如果情况并非如此,那么请选择 Cilk,它的工作窃取方法可能是处理不平衡工作负载的最佳解决方案。