У меня трудное время, параллельное программе. У меня есть класс Program
, который содержит некоторые переменные (например, opencv Mat) и функцию run
.Атрибут распределения данных переменных класса в OpenMP
class Program {
Mat image;
...
void run(string inputFileName) {
...
someFunctionInAnotherFile(image, ...); // call by reference, image gets manipulated
}
...
};
int main() {
#pragma omp parallel default(none) shared(inputVector)
Program program;
#pragma omp for schedule(guided,1)
for(unsigned int inputNumber = 0; inputNumber < inputVector.size(); ++inputNumber) {
program.run(inputVector[ inputNumber ]);
}
}
Переменная program
должна быть частной, так как объявлен внутри parallel
области, не так ли? Но как насчет члена image
, будет ли он также частным? Я не мог найти ничего об этом в спецификациях openMP, только информация о динамических хранимых переменных (но какой класс хранения являются членами класса?).
run
сам вызывает функции, определенные в некоторых других .cpp-файлах. Будут ли локальные переменные внутри этих функций частными? Я надеюсь, что это так.
Большая проблема: есть условия гонки, примечательные, потому что результат изменяется между несколькими программами. Поэтому вопрос для ответа должен быть похож на «Как может быть какая-то одна общая переменная, которая вызывает расы в этой программе?»
Любая помощь в расследовании этой проблемы высоко оценена, я также с радостью предоставит дополнительную информацию, если это необходимо.
EDIT:
Я только что обнаружил, что файлы, содержащие другие функции, содержат глобальные переменные. Это может быть проблема? Полагаю, что так.