Могу ли я получить доступ к одному и тому же вектору из вложенных параллельных циклов?
Я понимаю, как #pragma omp parallel for
работает, и мне интересно, если следующий код будет работать, или я не использую распараллеливание правильно.
Дан ввод вектора исходных решений с пользовательским классом Sol
Хочу генерировать n_iter
решения для каждого из этих семян, и положить их все в один вектор.
Простая версия этого кода:
// input:
std::vector<Sol> seed_sols; // vector containing seed solutions
int n_iter; // number of iterations per seed
// create data structure to hold all solutions to be generated
std::vector<Sol> sols(seed_sols.size()*n_iter);
#pragma omp parallel for
for (int seed_sol = 0; seed_sol < seed_sols.size(); ++seed_sol){
Sol curr_seed = seed_sols[seed_sol];
#pragma omp parallel for
for (int i = 0; i < n_iter; ++i){
sols[seed_sol*n_iter + i] = generateSol(curr_seed);
}
}
Можно ли запустить два параллельных цикла таким образом? и будет ли внутренний цикл действительно делать что-нибудь, чтобы ускорить процесс, если я ограничен 4 потоками, и размер seed_sols
больше 4?
Могу ли я безопасно запустить этот код, используя два параллельных цикла, даже если они обращаются к одной и той же структуре данных, потому что нет никакого способа, которым они могут получить доступ к одному и тому же элементу sols
в то же время?
Любая помощь будет принята с благодарностью, спасибо
РЕДАКТИРОВАТЬ:
Я успешно выполнил код несколько раз без каких-либо ошибок, и он, кажется, работает достаточно хорошо. Однако я до сих пор не знаю, является ли это хорошей практикой или нет для распараллеливания такого рода кода.