gpt4 book ai didi

基于任务的编程 : #pragma omp task versus #pragma omp parallel for

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

考虑:

    void saxpy_worksharing(float* x, float* y, float a, int N) {
#pragma omp parallel for
for (int i = 0; i < N; i++) {
y[i] = y[i]+a*x[i];
}
}


    void saxpy_tasks(float* x, float* y, float a, int N) {
#pragma omp parallel
{
for (int i = 0; i < N; i++) {
#pragma omp task
{
y[i] = y[i]+a*x[i];
}
}
}

使用任务和 omp 并行指令有什么区别?为什么我们可以用任务编写递归算法,例如归并排序,而不能用工作共享?

最佳答案

我建议您查看来自 Lawrence Livermore 国家实验室的 OpenMP 教程,可用 here .

您的特定示例应该是 不是 使用 OpenMP 任务实现。第二个代码创建 N乘以线程任务的数量(因为在缺少 } 旁边的代码中存在错误;我稍后会回来),并且每个任务只执行一个非常简单的计算。正如您在我对 this question 的回答中所见,任务的开销将是巨大的。 .除了第二个代码在概念上是错误的。由于没有工作共享指令,所有线程将执行循环的所有迭代,而不是 N任务,N将创建的线程数的倍数。它应该以下列方式之一重写:

单任务生产者 - 常见模式,NUMA 不友好:

void saxpy_tasks(float* x, float* y, float a, int N) {
#pragma omp parallel
{
#pragma omp single
{
for (int i = 0; i < N; i++)
#pragma omp task
{
y[i] = y[i]+a*x[i];
}
}
}
}
single指令将使循环仅在单个线程内运行。所有其他线程将跳过它并在 single 的末尾遇到隐式障碍。构造。由于屏障包含隐式任务调度点,等待线程将在任务可用时立即开始处理任务。

并行任务生产者 - 更 NUMA 友好:
void saxpy_tasks(float* x, float* y, float a, int N) {
#pragma omp parallel
{
#pragma omp for
for (int i = 0; i < N; i++)
#pragma omp task
{
y[i] = y[i]+a*x[i];
}
}
}

在这种情况下,任务创建循环将在线程之间共享。

如果您不知道 NUMA 是什么,请忽略有关 NUMA 友好性的评论。

关于基于任务的编程 : #pragma omp task versus #pragma omp parallel for,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13065943/

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