OpenMP.ru

Когда shared переменная внезапно становится private

by on Дек.25, 2013, under Распараллеливание

Был замечен сайд-эффект от типов хранилища переменных.

По умолчанию считается что все переменные в OpenMP секции являются shared. Допустим мы явно объявляем какой то int как shared:

int a;

#pragma omp parallel shared(a)
...

В процессе оптимизации приложения обнаруживается, что наш int весьма активно переиспользуется и вообще неплохо бы держать его в регистре. Ок, нет проблем:

register int a;

#pragma omp parallel shared(a)
...

Проблемы есть. Дело в том как только вы объявили int как register (и компилятор действительно держит его в регистре), эта переменная перестала быть shared.
Понятно что и по умолчанию register переменные будут только private!
Никаких уведомлений о том что невозможно сделать переменную shared я не заметил.
Обратный подвох тоже есть, так переменная в Thread Local Storage (TLS) никогда не станет shared, но тут нужно постараться так промазать.


Leave a Reply

You must be logged in to post a comment.

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!