2012-07-02 41 views
1

當我在使用OpenMP時沒有reduction(+ : sum)函數時,OpenMP版本可以正常工作。OpenMP - 使用函數

#include <iostream> 
#include <omp.h> 
using namespace std; 

int sum = 0; 
void summation() 
{ 
    sum = sum + 1; 
} 

int main() 
{ 
    int i,sum; 

#pragma omp parallel for reduction (+ : sum) 
    for(i = 0; i < 1000000000; i++) 
     summation(); 

#pragma omp parallel for reduction (+ : sum) 
    for(i = 0; i < 1000000000; i++) 
     summation(); 

#pragma omp parallel for reduction (+ : sum) 
    for(i = 0; i < 1000000000; i++) 
     summation(); 

    std::cerr << "Sum is=" << sum << std::endl; 
} 

但是當我在一個全局變量調用函數summation,OpenMP的版本正在更多的時間比串行版本。

我想知道相同的原因和應該作出的改變。

回答

0

summation函數不使用您正在減少的OMP共享變量。修復:

#include <iostream> 
#include <omp.h> 

void summation(int& sum) { sum++; } 

int main() 
{ 
    int sum; 

#pragma omp parallel for reduction (+ : sum) 
    for(int i = 0; i < 1000000000; ++i) 
     summation(sum); 

    std::cerr << "Sum is=" << sum << '\n'; 
} 
0

給上網本一個變量同步將超過您通過使用他們都會彼此無休止地等待多cores-獲得什麼樣的方式,因爲只有一個花費的時間變量,並且一次只能有一個內核訪問它。這種設計不具備併發能力,您所支付的所有同步只會增加運行時間。