openmp C ++平行化程式算Fibonacci費式數列。簡易的費式數列,可以練就諸多的程式設計概念與技巧https://www.youtube.com/playlist?list=PLYRlUBnWnd5Jb9PI7P1V2GEgOu1n3hki-
平行化的費氏數列遞迴程式,這真需要老師教,有的程式設計師也搞不定。如果就照網路一般作法,居然是序列版的好幾倍時間(問題出在哪裡?可能別人用的compiler太好,根本不用操心threads用幾個,而你用的compiler每呼叫一次多重執行緒遞迴函數,又多配置了執行緒,所謂的好幾倍,是謙虛的說法,事實上可能是萬倍、百萬倍時間)。此時真不能高估compiler的能力,少用神Class,要能自己分配執行緒才是王道。關鍵的程式碼如下:
#include <omp.h> int f0(int n, int n_threads){ int x, y; if( n<=1) return 1; else { if (n_threads>1) { n_threads=(n_threads+1)/2; #pragma omp task shared(x) x=f0(n-1, n_threads); #pragma omp task shared(y) y=f0(n-2, n_threads); #pragma omp taskwait return x+y; } else { x=f0(n-1, 1); y=f0(n-2, 1); return x+y; } } }而主程式呼叫的部分,可寫為
#pragma omp parallel sections num_threads(8) { answer=f0(40,8); }
沒有留言:
張貼留言