Fix an Intel compiler error in covariance_impl.cc. Intel C compiler strictly asks for parallel loops with collapse to be perfectly nested. Otherwise, compiling Ceres with ICC will throw an error at line 348 of covariance_impl.cc. Change-Id: I1ecb68e89b7faf79e4153dfe6675c390d1780db4
diff --git a/internal/ceres/covariance_impl.cc b/internal/ceres/covariance_impl.cc index 0fa40ce..d698f88 100644 --- a/internal/ceres/covariance_impl.cc +++ b/internal/ceres/covariance_impl.cc
@@ -309,12 +309,13 @@ const ProblemImpl::ParameterMap& parameter_map = problem_->parameter_map(); // For OpenMP compatibility we need to define these vectors in advance + const int num_parameters = parameters.size(); vector<int> parameter_sizes; vector<int> cum_parameter_size; - parameter_sizes.reserve(parameters.size()); - cum_parameter_size.resize(parameters.size() + 1); + parameter_sizes.reserve(num_parameters); + cum_parameter_size.resize(num_parameters + 1); cum_parameter_size[0] = 0; - for (int i = 0; i < parameters.size(); ++i) { + for (int i = 0; i < num_parameters; ++i) { ParameterBlock* block = FindOrDie(parameter_map, const_cast<double*>(parameters[i])); if (lift_covariance_to_ambient_space) { @@ -345,8 +346,8 @@ #else # pragma omp parallel for num_threads(num_threads) schedule(dynamic) #endif - for (int i = 0; i < parameters.size(); ++i) { - for (int j = 0; j < parameters.size(); ++j) { + for (int i = 0; i < num_parameters; ++i) { + for (int j = 0; j < num_parameters; ++j) { // The second loop can't start from j = i for compatibility with OpenMP // collapse command. The conditional serves as a workaround if (j >= i) {