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) {