Параллельно для циклов: найдите, содержит ли отсортированный массив повторяющиеся элементы - PullRequest
0 голосов
/ 10 мая 2019

Это огромный массив, содержащий элементы в порядке возрастания. Нам нужно выяснить, содержит ли массив дубликаты элементов. Подход грубой силы прост, что когда мы пересекаем цикл и, если для любого заданного индекса i, a [i] == a [i + 1], мы можем досрочно вернуться, указывая, что массив содержит повторяющиеся элементы.

Тем не менее, в многоядерной среде мы можем определенно улучшить производительность, имея несколько циклов for, работающих параллельно, каждый из которых работает над частью цикла ввода. Как нам добиться синхронизации там? Как бы рано вернуться работать?

1 Ответ

4 голосов
/ 10 мая 2019

Вы должны будете проверить, лучше ли производительность наличия переменной синхронизации, которая сообщает циклам завершаться раньше, чем просто позволить потокам проходить через подмножество массива и возвращаться, если они что-то находят.Если у вас нет атомарного bool без блокировки, тогда запуск потоков до конца подмножества и последующая синхронизация, вероятно, будут быстрее.

Сам алгоритм довольно прост, вам просто нужно убедиться, что выобрабатывать угловой корпус.Допустим, ваш набор данных

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], и вы гарантированно найдете дубликат, если таковой существует.


Вам не нужно беспокоиться о синхронизации операции чтения содержимого вектора.Пока вектор не изменяется, пока вы проверяете его, хорошо, чтобы несколько читателей читали с него одновременно.Синхронизация необходима только в том случае, если у вас есть несколько потоков, и один или несколько из этих потоков записывают общие данные.

...