openmp 并行求完数

来源:互联网 发布:3d场景软件 编辑:程序博客网 时间:2024/06/16 15:03
// 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 sectionfor (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 sectionfor (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 sectionfor (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 sectionfor (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);}
运行结果: