gpt4 book ai didi

用于并行 for 循环的 C++ OpenMP 指令?

转载 作者:行者123 更新时间:2023-11-28 01:03:23 25 4
gpt4 key购买 nike

我正在特定代码片段上尝试 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 是私有(private)的,但 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 循环。

最佳答案

我不确定我是否理解您的代码。但是,我认为您确实需要某种并行积累。

你可以使用这样的模式

 size_t total = 0;
#pragma omp parallel for shared(total) reduction (+:total)
for (int i=0; i<MAXITEMS; i++)
{
total += getvalue(i); // TODO replace with your logic
}

// total has been 'magically' combined by OMP

相关说明,当您使用 gcc 时,您可以只使用 __gnu_parallel::accumulate直接替换 std::accumulate , 这确实 exactly相同。参见 Chapter 18. Parallel Mode

 size_t total = __gnu_parallel::accumulate(c.begin(), c.end(), 0, &myvalue_accum);

您甚至可以使用 -D_GLIBCXX_PARALLEL 进行编译这将充分利用 std如果可能,算法会自动并行化。 除非您知道自己在做什么,否则不要使用它!通常,性能会受到影响,并且由于意外的并行性而引入错误的机会是真实存在的

关于用于并行 for 循环的 C++ OpenMP 指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7670887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com