C OPenMP:何时可以并行化循环

C OPenMP:何时可以并行化循环,c,parallel-processing,openmp,C,Parallel Processing,Openmp,对于以下每个代码段,使用OpenMP pragmas使循环并行,或 解释为什么代码段不适合并行执行 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. f

对于以下每个代码段,使用OpenMP pragmas使循环并行,或 解释为什么代码段不适合并行执行

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];
a。对于(i=0;i

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

我不会做你的硬件,但我会给出一个提示。在使用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);
    }
}
?

这里,我们在for循环之外定义了<代码> x>代码>和<代码> y>代码。现在考虑<代码> y>代码>。每个线程将在没有任何同步的情况下访问/写入它,从而发生数据竞争,极有可能导致逻辑错误。


阅读更多内容,祝你的硬件好运。

这不是硬件解决服务…@gsamaras如果你能解决任何一个问题,我会尝试allOK,我会给你一个提示@Dinesheddy,但我不会解决任何硬件。此外,我会投票给你,因为你的评论很好,但下次请表现出一些努力!
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);
    }
}