gpt4 book ai didi

task - 具有和不具有并行性的 OpenMP 任务

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

Node *head = &node1;
while (head)
{
#pragma omp task
cout<<head->value<<endl;
head = head->next;
}

#pragma omp parallel
{
#pragma omp single
{
Node *head = &node1;
while (head)
{
#pragma omp task
cout<<head->value<<endl;
head = head->next;
}
}
}

在第一个 block 中,我只是创建了没有并行指令的任务,而在第二个 block 中,我使用了并行指令和单指令,这是我在论文中看到的常见方式。
我想知道他们之间有什么区别?顺便说一句,我知道这些指令的基本含义。

我评论中的代码:
void traverse(node *root)
{
if (root->left)
{
#pragma omp task
traverse(root->left);
}
if (root->right)
{
#pragma omp task
traverse(root->right);
}
process(root);
}

最佳答案

不同之处在于,在第一个 block 中,您并没有真正创建任何任务,因为 block 本身没有嵌套(在语法上或词法上)没有嵌套在事件并行区域内。在第二 block task构造在语法上嵌套在 parallel 中。如果该区域恰好在运行时处于事件状态(事件并行区域是由多个线程组成的团队执行的区域),则该区域将排队显式任务。词法嵌套不太明显。观察以下示例:

void foo(void)
{
int i;

for (i = 0; i < 10; i++)
#pragma omp task
bar();
}

int main(void)
{
foo();

#pragma omp parallel num_threads(4)
{
#pragma omp single
foo();
}

return 0;
}

第一次调用 foo()发生在任何平行区域之外。因此 task指令(几乎)什么都不做,所有调用 bar()连续发生。第二次调用 foo()来自并行区域内部,因此将在 foo() 内部生成新任务. parallel由于线程数固定为 4,因此区域处于事件状态由 num_threads(4)条款。

OpenMP 指令的这种不同行为是一种设计特性。主要思想是能够编写可以串行和并行执行的代码。

仍然存在 taskfoo() 中构建进行一些代码转换,例如 foo()被转换成类似的东西:

void foo_omp_fn_1(void *omp_data)
{
bar();
}

void foo(void)
{
int i;

for (i = 0; i < 10; i++)
OMP_make_task(foo_omp_fn_1, NULL);
}

这里 OMP_make_task()是 OpenMP 支持库中的一个假设(非公开)函数,它将对该函数的调用排队,作为其第一个参数提供。如果 OMP_make_task()检测到它在事件并行区域之外工作,它会简单地调用 foo_omp_fn_1()反而。这增加了调用 bar() 的开销。在连环案件中。而不是 main -> foo -> bar , 通话就像 main -> foo -> OMP_make_task -> foo_omp_fn_1 -> bar .这意味着串行代码执行速度较慢。

工作共享指令更清楚地说明了这一点:

void foo(void)
{
int i;

#pragma omp for
for (i = 0; i < 12; i++)
bar();
}

int main(void)
{
foo();

#pragma omp parallel num_threads(4)
{
foo();
}

return 0;
}

第一次调用 foo()将串行运行循环。第二次调用将在 4 个线程中分配 12 次迭代,即每个线程只会执行 3 次迭代。再一次,使用一些代码转换魔法来实现这一点,串行循环的运行速度会比没有 #pragma omp for 时慢。出现在 foo() .

这里的教训是永远不要在不需要的地方添加 OpenMP 结构。

关于task - 具有和不具有并行性的 OpenMP 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13431099/

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