并行素数筛法的几种思路
1.每个进程负责剔除一个数的倍数:
我们注意到,2的倍数比3多,3的倍数比5多,以此类推,即前几个进程几乎决定了总的执行时间,所以本方法不可能是高效的。
2.每个进程负责剔除一定范围内的数的倍数:
下面代码所实现的是这一种。
/*
*Author:张华键
*
*Date:2015/10/30
*
*本程序用于并行求素数,给定一个整数n(本程序n <= 2^9*10^3),使用ceil(sqrt(n)/2)个进程进行筛选素数
*
*数据区根据进程个数均等划分
*
*主程序(0号进程)每找到一个素数k,就将其广播,其他从进程收到k,将本区间内k的倍数筛除
*
*/
#include <stdio.h>
#define MPICH_SKIP_MPICXX
#include <mpi.h>
#include <stdlib.h>
#include <math.h>
#pragma comment(lib,"mpi.lib")
bool is_prime[512100];
int data[1500]; //起步素数
void Help(char* prog_name); //usage of the program
/* -------------------------------------------------------------------
* 主程序
* ------------------------------------------------------------------- */
int main(int argc, char* argv[])
{
int n, //问题规模
mycount, //单个进程中素数个数
allcount, //总的素数个数
myrank, //子任务标识
task_num, //子任务个数
partion_size,