herrDeng網內搜尋

自訂搜尋

Ads

2021年8月26日 星期四

openmp C ++平行化程式算Fibonacci費式數列

 

 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);
}

沒有留言:

Related Posts Plugin for WordPress, Blogger...

熱門文章