gpt4 book ai didi

parallel-processing - OpenMP 中使用循环的并行部分

转载 作者:行者123 更新时间:2023-12-04 12:57:36 25 4
gpt4 key购买 nike

我想知道是否有任何技术可以使用 for 循环在 OpenMp 中创建并行部分。

例如,我不想创建 n 个不同的 #pragma omp 部分,而是想使用 n 次迭代 for 循环 创建它们,每个部分都有一些变化的参数。

#pragma omp parallel sections
{
#pragma omp section
{
/* Executes in thread 1 */
}
#pragma omp section
{
/* Executes in thread 2 */
}
#pragma omp section
{
/* Executes in thread n */
}
}

最佳答案

使用显式 OpenMP 任务:

#pragma omp parallel
{
// Let only one thread create all tasks
#pragma omp single nowait
{
for (int i = 0; i < num_tasks; i++)
#pragma omp task
{
// Code for task with parameters, based on i
}
}
// Let the threads process all tasks
#pragma omp taskwait

// Further parallel processing ...
}

OpenMP task 指令之后的代码块是一个显式任务。显式任务排队等待稍后执行。 taskwait 指令与 barrier 类似,但用于任务。另见 this answer类似的问题。

任务可以递归地创建其他任务。因此显式任务分配可用于处理图形和树。但要注意开销 - 它比大多数其他构造的开销更大,并且与来自带有 schedule(dynamic) 的循环的开销非常相似。此外,在任务内部引用的外部范围的变量默认为 firstprivate

请注意,显式任务是 OpenMP 3.0 中添加的功能。符合早期 OpenMP 版本的编译器可能不支持 task 指令。几乎所有现代编译器都支持 OpenMP 3.0 或更高版本,Microsoft Visual C++ 除外,它仅支持 OpenMP 2.0(即使在 VS2012 中)。

关于parallel-processing - OpenMP 中使用循环的并行部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13810400/

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