Ошибка параллельной проблемы OPENMP для двойного цикла

#c #multithreading #parallel-processing #openmp

#c #многопоточность #параллельная обработка #openmp

Вопрос:

Я получал сообщение об ошибке: «free (): поврежденные несортированные фрагменты» при попытке запустить:

 #pragma omp parallel for reduction( :save) shared(save2)
   for (size_t i = 0; i <= N;   i) {
    vector<float> dist = cdist(i, arestas);
    vector<float> distinv(dist.size());

    for (size_t j = 0; j < N();   j) {
      if (arr[j] > 0)
        arrv[j] = (1/N)   (1 / arr[j]);
      else
        arrv[j] = 0;
    }
    save = accumulate(arrv.begin(), arrv.end(), 0.0);
    vector<double>::iterator iter = save2.begin()   i;
    save2.insert(iter, sum);
  }
 

Комментарии:

1. Когда вы говорите: «Код не работает», что вы имеете в виду? Что происходит? Какой результат вы получаете?

2. free(): повреждены несортированные фрагменты

Ответ №1:

Возможно, я здесь упустил момент, но как насчет того, чтобы просто сделать это таким образом (не проверено)?

 vector<double> sum2(N);

#pragma omp parallel for num_threads(8)
for ( size_t i = 0; i < N; i   ) {
    double sum = 0;
    for ( size_t j = 0; j < dist.size();   j ) {
        if ( dist[j] > 0 ) {
            sum  = 1. / dist[j];
        }
    }
    sum2[i] = sum;
}
 

Еще есть возможность улучшить эту версию ( if например, удалив оператор, чтобы помочь векторизации), но если у вас не было каких-то необъяснимых ограничений в вашем коде, я думаю, что эта версия является хорошей отправной точкой.