这是一个巨大的数组,其中包含按升序排列的元素。我们需要查找数组是否包含任何重复的元素。蛮力方法很简单,当我们遍历循环时,如果对于任何给定的索引i,a [i] == a [i + 1],我们可以尽早返回以表明该数组包含重复元素。
但是,在多核环境中,我们可以通过使多个for循环并行运行(每个工作在输入循环的一部分上)来绝对提高性能。我们如何在那里实现同步?早期归还工作如何?
答案 0 :(得分:4)
您必须检查让同步变量告诉循环尽早结束的性能是否更好,然后再让线程遍历数组的子集并返回它们是否找到了东西。如果您没有无锁原子布尔,那么让线程运行到子集的末尾,然后进行同步可能会更快。
算法本身非常简单,您只需要确保处理极端情况即可。可以说您的数据集是
1, 2, 3, 4, 4, 6, 7, 8
,然后将其分成4个偶数线程。线程会得到
thread 1: 1, 2
thread 2: 3, 4
thread 3: 4, 6
thread 4: 7, 8
,并且每个线程都找不到重复项,因为重复项跨越两个不同的线程。这意味着每个线程需要一个子集,该子集与一个元素的其他子集重叠,以便您找到重复的子集。这意味着线程应该像这样
thread 1: 1, 2, 3
thread 2: 3, 4, 4
thread 3: 4, 6, 7
thread 4: 7, 8 // the last thread does need to overlap anything
您可以逐个检查a[i] == a[i+1]
来遍历每个子集,并确保找到一个重复项。
您不必担心对向量内容的读取操作进行同步。只要在检查向量时不对其进行修改,可以让多个读取器同时读取它。仅当具有多个线程并且其中一个或多个线程写入共享数据时才需要同步。