Могу ли я получить доступ к одному и тому же вектору из вложенных параллельных циклов?

Я понимаю, как #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 в то же время?

Любая помощь будет принята с благодарностью, спасибо

РЕДАКТИРОВАТЬ:

Я успешно выполнил код несколько раз без каких-либо ошибок, и он, кажется, работает достаточно хорошо. Однако я до сих пор не знаю, является ли это хорошей практикой или нет для распараллеливания такого рода кода.

0 ответов

Другие вопросы по тегам