Я пытаюсь использовать OpenMP для определенного фрагмента кода.Не уверен, что фрагмент нуждается в обновлении, возможно, он настроен слишком жестко для последовательной реализации.В любом случае вот (псевдо) код, который я пытаюсь распараллелить:
#pragma omp parallel for private(id, local_info, current_local_cell_id, local_subdomain_size) shared(cells, current_global_cell_id, global_id)
for(id = 0; id < grid_size; ++id) {
local_info = cells.get_local_subdomain_info(id);
local_subdomain_size = local_info.size();
...do other stuff...
do {
current_local_cell_id = cells.get_subdomain_cell_id(id);
global_id.set(id, current_global_cell_id + current_local_cell_id);
} while(id < local_subdomain_size && ++id);
current_global_cell_id += local_subdomain_size;
}
Это имеет полный смысл (после того, как на него какое-то время смотрят) в последовательном смысле, что также может означать, что оннужно переписать для OpenMP.Меня беспокоит то, что current_local_cell_id и local_subdomain_size являются частными, но current_global_cell_id и global_id являются общими.
Следовательно, выражение current_global_cell_id + = local_subdomain_size после внутреннего цикла:
do {
...
} while(...)
current_global_cell_id += local_subdomain_size;
может привести к ошибкам в настройке OpenMP, я подозреваю.Я был бы очень признателен, если бы кто-либо из экспертов OpenMP смог предоставить некоторые указатели на какие-либо специальные директивы OMP, которые я могу использовать для внесения минимальных изменений в код, но при этом использовать OpenMP для такого типа цикла for.