2017-10-21 128 views
1

我想並行化一個編碼函數,我嘗試在for處添加一個簡單的pragma,但結果是錯誤的。我認爲迭代是依賴的(通過code變量),因此它們不能直接並行化。OpenMP |並行化一個循環與依賴迭代

int encodePrimeFactorization(int number){ 
    int code = 0; 
    for (int i=PF_NUMBER-1; i>=0 ; i--){ 
     code = code * 2; 
     int f = prime_factors[i]; 
     if (number % f == 0){ 
     code = code + 1; 
     } 
    } 
    return code; 
} 

有沒有一種方法,使code獨立變量每個迭代?

回答

1

是的。至少對我來說,它更容易想想,如果你看一下算法是這樣的:

int code = 0; 
for (int i=PF_NUMBER-1; i>=0 ; i--) { 
    code = code << 1; 
    int f = prime_factors[i]; 
    if (number % f == 0){ 
    // The last bit of code is never set here, 
    // because it has been just shifted to the left 
    code = code | 1; 
    } 
} 

現在你可以設定位已經轉移,同時設置:

int code = 0; 
for (int i=PF_NUMBER-1; i>=0 ; i--) { 
    int f = prime_factors[i]; 
    if (number % f == 0){ 
    code = code | (1 << i); 
    } 
} 

現在就變成了微不足道的減少。現在,您可以在設置時移動設置位:

int code = 0; 
#pragma omp parallel for reduction(|,code) 
for (int i=PF_NUMBER-1; i>=0 ; i--) { 
    int f = prime_factors[i]; 
    if (number % f == 0){ 
    code |= (1 << i); 
    } 
} 

也就是說,您不會獲得任何性能增益。這隻能工作到31位,這對於並行開銷的好處太小了。如果這是你代碼中的熱門部分,你必須找到它來應用並行化。