我想在特定的代碼片段上使用OpenMP。不確定片段是否需要修改,可能是爲了順序執行而設置過於嚴格。反正這裏是我想要並行化(僞)代碼:並行for循環的C++ 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循環,我將不勝感激。
在GNU並行模式上添加提示 – sehe
有趣的評論。感謝您分享此信息。 –