Подтвердить что ты не робот

Разница между OpenMP threadprivate и частным

Я пытаюсь распараллелить программу на C с помощью OpenMP.

Я хотел бы узнать больше о:

  • Различия между директивой threadprivate и частным и
  • В каких случаях мы должны использовать любой из них.

Насколько я знаю, разница - это глобальная область с threadprivate и сохраненным значением в параллельных регионах. В нескольких примерах я нашел несколько примеров: если часть кода содержит некоторые глобальные/статические переменные, которые должны быть приватизированы, эти переменные включаются в список threadprivate, а их начальные значения копируются в частные копии, используя copyin.

Однако существует ли какое-либо правило, которое запрещает нам использовать предложение private для работы с глобальными/статическими переменными? возможно, какие-либо подробности реализации?

Я не мог найти никакого объяснения в спецификации OpenMP3.0.

4b9b3361

Ответ 1

Наиболее важные отличия, которые вы должны запомнить:

  • A private переменная является локальной для региона и большую часть времени будет размещаться в стеке. Время жизни переменной конфиденциальности - это продолжительность, определенная в предложении о разделе данных. Каждый поток (включая главный поток) делает частную копию исходной переменной (новая переменная больше не привязана к хранилищу с исходной переменной).

  • A threadprivate с другой стороны, скорее всего, будет помещаться в кучу или в локальное хранилище потоков (это можно рассматривать как глобальную память, локальную для потока). Переменная A threadprivate сохраняется в разных регионах (в зависимости от некоторых ограничений). Основной поток использует исходную переменную, все остальные потоки составляют частную копию исходной переменной (основная переменная по-прежнему связана с исходной переменной).


  • Есть и более сложные отличия:

    • Переменные, определенные как private, являются undefined для каждого потока при вводе конструкции, а соответствующая общая переменная undefined при выходе из параллельной конструкции; начальный статус указателя private не определен.

    • Но данные в общих блоках threadprivate следует считать undefined при входе в первую параллельную область, если не указано условие copyin. Когда общий блок появляется в директиве threadprivate, каждая копия потока инициализируется один раз до его первого использования.

  • OpenMP Specifications (раздел 2.14.2) действительно дают очень хорошее описание (а также более подробно) threadprivate директива:

    Каждая копия переменной threadprivate инициализируется один раз в порядке, указанном программой, но в неопределенной точке программы перед первой ссылкой на эту копию. Хранение всех копий переменной threadprivate освобождается в соответствии с тем, как статические переменные обрабатываются на базовом языке, но в неопределенной точке программы.

    Программа, в которой поток ссылается на другую копию потоков переменной threadprivate, не соответствует требованиям.

    Содержимое переменной threadprivate может изменяться в точке планирования задачи, если исполняемый поток переключается на другую задачу, которая изменяет переменную. Подробнее о планировании задач см. Раздел 1.3 на стр. 14 и раздел 2.11 на стр. 113.

    В области parallel ссылки основного потока будут связаны с копией переменной в потоке, который встретил область parallel.

    Во время последовательных ссылок на части будет ссылка на исходную цепочку переменных. Значения данных в исходной копии потоков переменной threadprivate гарантированно сохраняются между любыми двумя последовательными ссылками на переменную в программе.

    Значения данных в переменных threadprivate не начальных потоков гарантируют сохранение между двумя последовательными активными областями parallel только при соблюдении следующих условий:

    • Ни одна область parallel не вложена в другую явную область parallel.

    • Количество потоков, используемых для выполнения обеих областей parallel, одинаковое.

    • Политики слияния потоков, используемые для выполнения обеих областей parallel, одинаковы.

    • Значение переменной внутреннего ключа dyn-var в области задач приложения является ложным при входе в обе области parallel.

    Если все эти условия сохраняются, и если в обеих областях указана переменная threadprivate, то потоки с тем же номером потока в соответствующих областях будут ссылаться на ту же копию этой переменной.