openMP - parallelization with for loop and private
c++, multiprocessing, multithreading, openmp
Solution
When you use `private` for a variable a private copy starts with no value, I mean it is not initialized at that time. Therefore, the value passed by parameter do not set `set_` variable. You need to use `firstprivate` instead, which first initializes the private copy with the current value.
Problem
I wrote a function to evaluate a given function at points in a set (set_). Code with no parallelization is like that: ``` void Method::evaluateSet(double* funcEvals_, double** set_) { for(int j= 0;j<m_npts;j++) { if(!(isInsideConstraints(set_[j])) || qIsNaN(funcEvals_[j]) || !qIsFinite(funcEvals_[j])) { funcEvals_[j] = DBL_MAX; } else { solverInput input_(m_input); input_.setFunParameters(simplex_[j]); funcEvals_[j]=input_.apply(simplex_[j]); } } } ``` and this is working properly. I then parallelize using openMP, with a parallel construct, and a private copy of the variable set_ for each thread. Loop is ``` #pragma omp parallel for private (set_) for(int j= 0;j<m_npts;j++) { if(!(isInsideConstraints(set_[j])) || qIsNaN(funcEvals_[j]) || !qIsFinite(funcEvals_[j])) { funcEvals_[j] = DBL_MAX; } else { solverInput input_(m_input); input_.setFunParameters(set_[j]); funcEvals_[j]=input_.apply(set_[j]); } } #pragma omp barrier ``` It crashes, and error occurs at if evaluation, with `set_ is being used without been initialized`. I don't understand. Since I set the `set_` variable private, shouldn't there be a copy of original `set_` in each thread? What is wrong with the code and how to improve? Thanks and regards.