Научно-образовательный IT-форум при КНИТУ-КАИ

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



[+] Конcтрукция flush в OpenMP

Сообщений 1 страница 2 из 2

1

Эта конструкция осуществляет немедленный сброс значений разделяемых переменных в память. Таким образом, гарантируется, что во всех потоках значение переменной будет одинаковое. Однако интересно, как же будет проходить работа следующего фрагмента кода?

Код:
...
a=0;
#pragma omp parallel sections
{
     #pragma omp flush(a)
     #pragma omp section
     {
          for(i=0; i<10; i++, a++);
     }
     #pragma omp section
     {
          for(i=0; i<10; i++, a++);
     }
}// omp sections
...


Будет ли осуществляться взаимоблокировка потоков при работе с переменной a в двух параллельно работающих потоках? Если да, то в чем же тогда отличие от применения конструкции atomic, например, в такой интерпретации:

Код:
...
a=0;
#pragma omp parallel sections
{
     #pragma omp section
     {
          for(i=0; i<10; i++)
          #pragma omp atomic 
           a++;
     }
     #pragma omp section
     {
          for(i=0; i<10; i++);
          #pragma omp atomic 
          a++;
     }
}// omp sections
...

2

Вопрос раскрыт, ознакомился со статьей [см. ссылку]. Оказывается все гораздо проще, чем я думал. Использование директивы #pragma omp flush(a) подобно вызову функции, которая актуализирует значение переменной. Если переменная изменилась в кэш, то значение сбрасывается из кэш в ОЗУ, а если значение изменилось в ОЗУ, то обновляется кэш.

Однако, если у кого-то есть заметки по вопросу и ответу, то пишите.