Вопросы OpenMP - PullRequest
       19

Вопросы OpenMP

1 голос
/ 01 февраля 2010

Я хочу распараллелить цикл в функции-члене класса. Однако в коде есть две ошибки:

class myclass  
{  
public:  

int _k;  

void f(int nb_examples, int nb_try)  
{  
      int i;  
      int ks[nb_try];  
      // assignment to elements in ks  
      omp_set_num_threads(_nb_threads);  
    #pragma omp parallel shared(ks) private(i, _k) // error: ‘myclass::_k’ is not a variable in clause ‘private’  
      {  
    #pragma omp for schedule(dynamic) nowait  
        for(i=0; i < nb_try; i ++){  
          _k = ks[i];  
          if (_k > nb_examples)  break;// error: break statement used with OpenMP for loop  
          // operations on _k  
        }  
      }   
}  
}

Как объяснить эти ошибки и решить проблемы? Спасибо и всего наилучшего!

1 Ответ

6 голосов
/ 01 февраля 2010

Что касается второй ошибки, спецификация OpenMP не позволяет вам выйти из параллельного цикла for или выбросить исключения из-за параллельного характера.Вместо этого посмотрите решение для обхода в этом блоге: http://www.thinkingparallel.com/2007/06/29/breaking-out-of-loops-in-openmp/

Для первой ошибки мне потребовалось некоторое время, чтобы разобраться в том, что на самом деле происходит - я думаю, это объясняет это:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...