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

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

По умолчанию считается что все переменные в 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, но тут нужно постараться так промазать.

dmitry

Добавить комментарий