Я пытаюсь добавить 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, как он есть, является моей собственной работой.