2011-11-02 35 views
1

我这是相当耗费时间的函数,它是这样的,因为n的值非常大如何并行该功能

sum=0; for(i=0;i<n;i++) 
{ 
    a=func(i,b); 
    c=func(i,a); 
    sum+=c; 
} 

是否可以并行使用OpenMP这个循环?

+0

我们要需要看到更多的代码。现在,由于您在每次迭代中覆盖'c',代码不会执行任何操作。 – Mysticial

+0

执行此操作时,确保'func'在被多个线程调用时是可重入的。 – evnu

+0

你已经完全改变了你的问题。我建议你提出一个新问题,然后将这个问题还原为原始问题。所以我会分开回答。 – Mysticial

回答

4

以下是简短的方式:

int sum = 0; 

#pragma omp parallel for reduction(+:sum) 
    for(i = 0; i < n; i++){ 
     int a = func(i,b); 
     int c = func(i,a); 
     sum += c; 
    } 

这里有一个较长的(更灵活)的方式:

int sum = 0; 

#pragma omp parallel 
    { 
     int local_sum = 0; 

#pragma omp for 
     for(i = 0; i < n; i++){ 
      a = func(i,b); 
      c = func(i,a); 
      local_sum += c; 
     } 

#pragma omp critical 
     { 
      sum += local_sum; 
     } 
    } 
+0

谢谢你神秘:)是否有可能将它用于数组呢?说我想它是总和[我] = C ?? – user1019083

+0

是的。如果每次迭代都写入目标数组的不同元素,则根本不需要“简化”或同步。 (如果这回答你的问题,你可以通过点击绿色的复选标记来接受我的答案,你之前的问题也是如此。) – Mysticial

+0

神秘的,我修改了一下问题,我尝试着去处理它,但是没能你请帮我在这里 – user1019083