并行OpenMP减少与功能定义?

问题描述:

我使用OpenMP,但问题是,我声明/定义一个函数如下:并行OpenMP减少与功能定义?

void compute_image(double pixel[nb], double &sum) 
{ 
     #pragma omp parallel for reduction(+:sum) 
    for (int j=0;j<640;j++) 
    { 
    if ... 
    sum=sum+pixel[0]; 
    .... 
    } 
.... 
} 

我现在知道的是,:

Error 2 error C3030: 'sum' : variable in 'reduction' clause/directive cannot have reference type C:\Users...\test.cpp 930 

其实,我无法摆脱的OpenMP。 任何解决方案?

而不是减少,您可以将sum=sum+pixel[0]放在#pragma omp atomic#pragma omp critical行下。

另一个选项可能是在omp部分之前有一个double local_sum = sum;,在local_sum上减少,然后在for循环之后有sum = local_sum;

+2

使用第二个选项(local_sum)可能会比使用“omp atomic”或“omp critical”更好,因为reduction子句允许每个线程都有其自己的本地版本local_sum。使用“comp critical”强制线程等待更新总和,并使用“omp atomic”使线程争夺相同的内存位置。 – 2013-05-14 16:27:52