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