#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
например, удалив оператор, чтобы помочь векторизации), но если у вас не было каких-то необъяснимых ограничений в вашем коде, я думаю, что эта версия является хорошей отправной точкой.