OPenMP:什么时候可以并行化循环
OPenMP: When can a Loop be parallelized
对于以下每个代码段,使用 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];
非常欢迎任何关于上述问题的帮助..任何思路..
你的HW我不会做,但我给个提示。在使用 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);
}
}
可以,因为 x
和 y
是私有变量。
怎么样
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 循环之外定义了 x
和 y
。现在考虑 y
。每个线程都会access/write它没有任何同步,因此会发生数据竞争,这很可能导致逻辑错误。
阅读更多内容 here 祝你的硬件好运。
对于以下每个代码段,使用 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];
非常欢迎任何关于上述问题的帮助..任何思路..
你的HW我不会做,但我给个提示。在使用 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);
}
}
可以,因为 x
和 y
是私有变量。
怎么样
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 循环之外定义了 x
和 y
。现在考虑 y
。每个线程都会access/write它没有任何同步,因此会发生数据竞争,这很可能导致逻辑错误。
阅读更多内容 here 祝你的硬件好运。