Где размещаются частные переменные openmp? В каждом стеке потоков, динамически или через какой-то общий массив или что-то в этом роде?
OpenMP Расположение частных переменных?
Ответы (2)
Спецификация OpenMP не указывает, должны ли эти переменные размещаться в стеке или в куче (и находятся ли они в куче, если она находится в общем массиве или если для каждого потока выделяется один объект). Обычно я бы предположил, что частные переменные размещаются в стеке (нет причин не делать этого, и в целом это более эффективно). Согласно руководству, такое поведение используется в libgomp (реализация, используемая gcc) в по крайней мере, ничего не известно о других реализациях (хотя я не вижу причин, по которым они не должны делать то же самое).
OpenMP ничего не указывает о размещении частных переменных.
Есть два варианта: куча и стек.
Если мы подумаем о том, что каждый поток выполняет меньшее количество инструкций, для главного потока имеет смысл выделить частные переменные, как показано ниже.
Код :
1: set_threads(n)
2: #pragma omp parallel private(var)
3: {
4: var = ...
5:}
Машинный код:
строка 2: var_ptr = новые переменные [n]
строка 4: var_ptr [get_thread_id()] = ...
Но приведенный выше код приведет к большому количеству ложного совместного использования частных переменных в разных потоках. Поэтому я думаю, что компилятору будет разумно размещать их в стеке каждого потока.
private
, по крайней мере, похоже, их нет.
- person Grizzly; 26.01.2012