c - OPenMP:何时可以并行化循环

标签 c parallel-processing openmp

对于以下每个代码段,使用 OpenMP 编译指示使循环并行,或者 解释一下为什么该代码段不适合并行执行。

a. for (i = 0; i < sqrt(x); i++)
 a[i] = 2.3 * i;
 if (i < 10)
 b[i] = a[i];
}

b. flag = 0;
 for (i = 0; i < n && !flag; i++)
 a[i] = 2.3 * i;
 if (a[i] < b[i])
 flag = 1;
}

c. for (i = 0; i < n && !flag; i++)
 a[i] = foo(i);
d. for (i = 0; i < n && !flag; i++) {
 a[i] = foo(i);
 if (a[i] < b[i])
 a[i] = b[i];
}

e. for (i = 0; i < n && !flag; i++) {
 a[i] = foo(i);
 if (a[i] < b[i])
 break;
}

f. dotp = 0;
for (i = 0; i < n; i++)
 dotp += a[i] * b[i];
g. for (i = k; i < 2 * k; i++)
 a[i] = a[i] + a[i – k];
h. for (i = k; i < n; i++) {
 a[i] = c * a[i – k];

非常欢迎有关上述问题的任何帮助..任何思路..

最佳答案

我不会做你的硬件,但我会给出一个提示。使用 OpenMp for 循环时,您应该警惕变量的范围。例如:

#pragma omp parallel for
for(int x=0; x < width; x++)
{
    for(int y=0; y < height; y++)
    {
        finalImage[x][y] = RenderPixel(x,y, &sceneData);
    }
}

没问题,因为 xy 是私有(private)变量。

怎么样

int x,y;
#pragma omp parallel for
for(x=0; x < width; x++)
{
    for(y=0; y < height; y++)
    {
        finalImage[x][y] = RenderPixel(x,y, &sceneData);
    }
}

在这里,我们在 for 循环之外定义了 xy。现在考虑y。每个线程都会在没有任何同步的情况下访问/写入它,因此会发生数据竞争,这很可能导致逻辑错误。

了解更多 here祝您的硬件好运。

关于c - OPenMP:何时可以并行化循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35996639/

相关文章:

c# - Parallel.ForEach x of x

c - 跟踪系统调用

c - 初始化 Switch Case

android - 是否可以在移动设备上使用 OpenCL?

algorithm - 完美嵌套循环和不完美嵌套循环有什么区别?

Pthreads、MPI 和 OpenMP 中的 C++

fortran - 文件已在另一个单元中打开 程序中止。

c++ - OpenMP:如何在任务中实现线程本地对象?

c - 在 C 的 char 数组中存储无符号整数的问题

c - 数据结构的建议!