2016-03-14 88 views
-7

对于以下每个代码段,请使用OpenMP pragmas使循环并行,或者说明代码段不适合并行执行的原因。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]; 

任何关于上述问题将是思维非常welcome..any线帮助..

+3

这不是硬件解决服务... – Samer

+0

@gsamaras如果你可以解决任何一个我会尝试所有 –

+0

好吧,我会给出一个提示@DineshReddy,但我没有解决任何硬件。此外,由于您的评论很好,我鼓励您,但*下一次显示一些努力* **请**! – gsamaras

回答

1

我不会做你的硬件,但我会给出提示。当玩弄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); 
    } 
} 

是OK的,因为xy是私有变量。

什么

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); 
    } 
} 

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

了解更多here祝你好运。