使用多个线程搜索数组,同时不做不必要的额外工作

Search through array with multiple threads while not doing any more extra work than necessary

假设您有一个 large 长度为 n 的未排序数组,您想要搜索它以查找特定元素(让此数组的元素是唯一的)。由于在最坏的情况下您必须在整个数组中搜索元素,因此 运行 时间为 O(n)。然而,由于现在大多数 CPU 都支持多核(具有超线程),您可以让多个线程搜索数组以加快速度。因此,使用 m 个内核,您将有 2m 个(独立)线程可供您使用。如果您仅将数组的一部分委托给每个线程,即给每个 2m 个线程 n/2m 数组元素进行处理,这将是最佳的。但是,当 2m 个线程中的一个找到该元素时,其他线程将需要停止(以保留系统资源),因为所有元素都是唯一的,其他线程永远找不到该元素。

所以我的问题是: 您将如何搜索具有 2m 个线程的唯一元素的大型未排序数组,同时最大限度地减少线程完成的工作和 运行 时间?您需要什么同步数据结构?当找到元素时,如何停止其他 2m - 1 个线程?

可能最简单的方法是使用原子布尔值(std::atomic<bool> 在 C++ 中),并让找到数字的线程在退出之前将该布尔值设置为 true。

除此之外,让每个线程将它的数组部分分成子部分,这样它就可以做一个紧密的循环来查找每个子部分中的数字,然后检查原子布尔值,然后重复,直到有 运行 个要检查的子部分。 (在一个大 for 循环的每次迭代后使用子部分而不是仅仅检查原子布尔值的原因是,由于缓存一致性问题,即使检查原子布尔值也会相当昂贵,所以最好分摊每个atomic-boolean-check over atomic-boolean-check over atomic-boolean-check over a larger number of iterations and tradeoff bit of extra/wasted 工作以换取更好的并行性)

制作每个子部分的理想尺寸将是您需要凭经验得出的,方法是尝试不同的尺寸,直到找到性能最佳的尺寸。