Трансляция переменных Intel TBB

Я использую Intel TBB для создания параллельного сита Эратосфена. Я уже сделал это в MPI на языке C.

Итак, я хочу, чтобы мой первый поток (или задача?) Находил простое число, а затем передавал его другим потокам, чтобы все они могли «пересечь» это простое число из своей части массива.

Проблема: я не могу найти способ:

  1. Обнаружить первый поток или задачу.

  2. Заставьте других ждать, пока первый поток или задача не передадут свое простое число.

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

Заранее спасибо!


person user3134687    schedule 15.01.2014    source источник


Ответы (1)


Я хотел лучше понять алгоритм, поэтому сделал несколько Погуглил" параллельный Эратосфен "и нашел это, в котором используется язык, аналогичный вашему подходу, но не очень хорошо объясняющийся алгоритм. Судя по описанию алгоритма, он плохо подходит для API на основе задач, такого как TBB. В частности, задача не должна блокировать или ждать чего-либо; он должен быть порожден, когда у него есть работа, а затем выполняться до завершения. Если мы адаптируем концепцию вашего алгоритма к подходу, основанному на задачах, то он будет выглядеть так:

  1. Создайте вектор, содержащий известные простые числа. Здесь нет необходимости в параллелизме, потому что он не будет записываться одновременно. Заполните его стартовым набором (все простые числа до 100?). Создайте int для хранения наибольшего проверенного числа (установлено значение 100).
  2. Запустите parallel_reduce разделов чисел от наибольшего проверенного числа p +1 до некоторого числа не более p ^ 2. Каждая задача parallel_reduce будет поддерживать свой собственный вектор обнаруженных простых чисел. parallel_reduce автоматически разделит эти задачи на более мелкие.
  3. В задачах parallel_reduce каждый запускает последовательное сито, используя вектор известных простых чисел, чтобы исключить составные числа в своем диапазоне, и заполняет свой собственный вектор обнаруженных простых чисел.
  4. Когда parallel_reduce объединяет две задачи, скопируйте все простые числа из вектора одной задачи в вектор другой задачи.
  5. Когда вы решаете одну задачу, у вас есть вектор простых чисел, который нужно добавить к известным простым числам. Опять же, параллелизм здесь не нужен.
  6. Обновите int наибольшего проверенного числа до того, что вы проверили, и вернитесь к шагу 2, пока не получите все нужные простые числа.

Так что нет ни «трансляции» простых чисел, ни какой-либо специальной работы для первой задачи. Есть просто серия parallel_reduces, которая дает вам все больше и больше простых чисел.

ОБНОВЛЕНИЕ

Если вы должны передавать информацию между задачами, способ сделать это с помощью TBB - защитить доступ к этим данным с помощью tbb :: mutex.

Однако проблема дизайна заключается не в том, как безопасно передавать данные между задачами - проблема в том, что делает каждая задача, пока она ожидает данных? Если ответ «ничего», вам не следует использовать задания. Задачи предназначены для выполнения до завершения и не должны вызывать ожидание вращения или блокировку на примитиве синхронизации, таком как tbb :: mutex. Если вы можете спроектировать свои задачи таким образом, чтобы они повторялись через работу и периодически проверяли наличие новых данных из других задач, чтобы изменить их подход, это будет работать нормально. Тот же подход с повторением и проверкой новых данных легче смоделировать с помощью серии вызовов parallel_reduce, как описано выше.

person Brad Werth    schedule 21.02.2014
comment
Да, есть варианты обновления алгоритма Эратосфена и удаления широковещательной передачи и т. Д. Но моя цель - не решето Эратосфена, а решение проблемы синхронизации таксов в Intel TBB. Подобно тому, как MPI может отправлять что-то из того или иного процесса, я хочу сделать то же самое с Intel TBB. Я хочу избежать завершения одной итерации для ряда задач, а затем создать другой набор задач для выполнения второй итерации, я хочу синхронизировать задачи, пока они работают. Есть ли встроенный механизм в TBB? И спасибо за ответ. - person user3134687; 22.02.2014
comment
Как объяснялось в моем обновлении выше, задачи не должны синхронизироваться, и поэтому TBB не предоставляет механизма для этого. Создавайте задачи, когда у вас есть работа, позвольте им завершиться и исчезнуть, когда работа сделана. - person Brad Werth; 27.03.2014