OpenMP и C ++: правильно ли я делаю объекты в цикле частными? - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь добавить OpenMP в существующий код C ++. Я новичок в OpenMP и немного заржавел с C ++. У меня есть цикл, который работает не так, как ожидалось, даже с одним потоком OpenMP, и мне интересно, если я что-то упускаю.

У меня есть класс, который просто хранит кучу данных:

class Properties {
   double thing1;
   double thing2[10];
   double thing3;
}

Тогда есть класс центрального интереса. Некоторые из его свойств могут храниться в вышеприведенном Properties классе:

  class MainThing {
       // usual constructors etc.
       double thing1;
       double thing2[10];
       double thing3;
       void ShowProps(Properties *pProp);
       // other functionality
    }
    void MainThing::ShowProps(Properties pProp) {
       // just copies the various properties of object into pProp
    }

Тогда есть основной код. Я определяю массив объектов MainThing, перебираю массив, вызываю ShowProps для каждого объекта в массиве и обрабатываю полученные таким образом свойства.

   int main() {

       int i, num_objs;
       Properties props;
       MainThing *current_obj;
       MainThing *main_objs;
       // allocate and instantiate elements of main_objs

    #pragma omp parallel shared(main_objs, num_objs)
    {
    #pragma omp for private(i, current_obj, props)
       for (i=0; i<num_objs; i++) {
          current_obj = main_objs+i;
          current_obj->ShowProps(&props);
          // do lots of stuff with "props"
          // this loop is "embarrassingly parallel"
          // no dependence from one iteration to another
       }
    }  // end pragma omp parallel

    }

Вещи не складываются так, как ожидалось, как я сказал. Поэтому я просто хочу знать, сделал ли я все необходимое, чтобы сделать различные объекты и т. Д. В цикле должным образом закрытыми?

Кстати, возможно, в этот игрушечный код нужно внести много улучшений. И я буду рад услышать их всех. Но имейте в виду, что я работаю с чужим кодом, и хотя я упустил много деталей, я как можно точнее распараллелил его структуру. Только OpenMP, как он есть, является моей собственной работой.

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