openmp 并行求完数

 
 
// GetWanShu.cpp : 定义控制台应用程序的入口点。
//



#include "stdafx.h"
#include "omp.h"
#include <Windows.h>
#include "time.h"
//函数声明
void getWanShuBySection();
void getWanShu();
void getWanShuByReduction();
int _tmain(int argc, _TCHAR* argv[])
{
	//串行实现求完数
	clock_t start_LiXingLe=clock();
	 getWanShu();
	 clock_t end_LiXingLe=clock();
	 double chuanxingTime_LXL=end_LiXingLe-start_LiXingLe;
	 printf("             串行时间为:%f\n",chuanxingTime_LXL);
	 //section 并行方法实现
	 getWanShuBySection();
	 //Reduction 并行方法实现
     getWanShuByReduction();


	 //for 并行方法实现
	 omp_set_num_threads(4);

	 start_LiXingLe=clock();
#pragma omp parallel
	#pragma omp for
		 
				for (int n = 1; n <= 10000; n++)
				{
					  int  sum = 0;
					
					  for (int i = 1; i <= (n/2); i++)  //除到原来一半就可以了
					  {
						   if (n % i == 0)
						   {
							sum += i;
						   }
					  }
					  if (sum == n)
					  {
						 printf ("%d\n", sum);
					  }
				 }
		 
		 end_LiXingLe=clock();
		  double parallelTime_LXL=end_LiXingLe-start_LiXingLe;
		  printf("              for并行时间为 :%f\n",parallelTime_LXL);
		    printf("for加速比为:%f\n",chuanxingTime_LXL/ parallelTime_LXL);

	return 0;
}
void getWanShuBySection(){

	 omp_set_num_threads(4);

	clock_t start_LiXingLe=clock();
#pragma omp parallel
	{
	#pragma omp sections
		{
		
		#pragma omp section
			for (int n = 1; n < 2500; n++)
				{
					  int  sum = 0;
					  for (int i = 1; i <= (n/2); i++)  //除到原来一半就可以了
					  {
						   if (n % i == 0)
						   {
							sum += i;
						   }
					  }
					  if (sum == n)
					  {
						 printf ("%d\n", sum);
					  }
				 }
			#pragma omp section
			for (int n = 2500; n < 5000; n++)
				{
					  int  sum = 0;
					  for (int i = 1; i <= (n/2); i++)  //除到原来一半就可以了
					  {
						   if (n % i == 0)
						   {
							sum += i;
						   }
					  }
					  if (sum == n)
					  {
						 printf ("%d\n", sum);
					  }
				 }
			#pragma omp section
			for (int n = 5000; n <= 7500; n++)
				{
					  int  sum = 0;
					  for (int i = 1; i <= (n/2); i++)  //除到原来一半就可以了
					  {
						   if (n % i == 0)
						   {
							sum += i;
						   }
					  }
					  if (sum == n)
					  {
						 printf ("%d\n", sum);
					  }
				 }
			#pragma omp section
			for (int n = 7500; n <= 10000; n++)
				{
					  int  sum = 0;
					  for (int i = 1; i <= (n/2); i++)  //除到原来一半就可以了
					  {
						   if (n % i == 0)
						   {
							sum += i;
						   }
					  }
					  if (sum == n)
					  {
						 printf ("%d\n", sum);
					  }
				 }
		
		
		}
	
	}

	clock_t end_LiXingLe=clock();
	 printf("            section并行时间为 :%d\n",end_LiXingLe-start_LiXingLe);


}
void getWanShu(){

	for (int n = 1; n <= 10000; n++)
 {
	  int  sum = 0;
	  for (int i = 1; i <= (n/2); i++)  //除到原来一半就可以了
	  {
		   if (n % i == 0)
		   {
			sum += i;
		   }
	  }
	  if (sum == n)
	  {
		 printf ("%d\n", sum);
	  }
 }

}



void getWanShuByReduction(){

	 omp_set_num_threads(5);

	clock_t start_LiXingLe=clock();
		for (int n = 1; n <= 10000; n++)
		 {
			  int  sum = 0;
			  #pragma omp parallel for reduction(+:sum)
			  for (int i = 1; i <= (n/2); i++)  //除到原来一半就可以了
			  {
				   if (n % i == 0)
				   {
					sum += i;
				   }
			  }
			  if (sum == n)
			  {
				 printf ("%d\n", sum);
			  }
		 }
   clock_t end_LiXingLe=clock();
    printf("             reduction并行时间为 :%d\n",end_LiXingLe-start_LiXingLe);

}
 
 
 
 
 
 
 
 
运行结果:
 
 

openmp 并行求完数_第1张图片





你可能感兴趣的:(openmp 并行求完数)