Относительно вашей первой проблемы: ваша функция Validity - это идеальный способ достижения производительности ниже последовательного в параллельном цикле.Тем не менее, вы уже дали правильный ответ.Вы должны заполнить независимые векторы для каждого потока и объединить их впоследствии.
inline void CNetwork::Validity() {
#pragma omp parallel for
for ( uint32_t i = 0 ; i < num_elements ; i++ ) {
#pragma omp critical
remove_node_v.push_back(i);
}
}
РЕДАКТИРОВАТЬ: Возможное средство может выглядеть следующим образом (если вам требуется последовательный доступ к вашим элементам, вам нужнонемного измените цикл)
inline void CNetwork::Validity() {
remove_node_v.reserve(num_elements);
#pragma omp parallel
{
std::vector<uint32_t> remove_node_v_thread_local;
uint32_t thread_id=omp_get_thread_num();
uint32_t n_threads=omp_get_num_threads();
for ( uint32_t i = thread_id ; i < num_elements ; i+=n_threads )
remove_node_v_thread_local.push_back(i);
#pragma omp critical
remove_node_v.insert(remove_node_v.end(), remove_node_v_thread_local.begin(), remove_node_v_thread_local.end());
}
}
Ваша вторая проблема может быть решена путем определения массива CNachbarn с размером максимально возможного количества потоков OMP и доступом к отдельным элементам массива из каждого потока, например:
CNachbarn* meine_nachbarn=alle_meine_nachbarn[omp_get_thread_num()]