twin primes. serial and parallel
来源:互联网 发布:淘宝网什么时候搞活动 编辑:程序博客网 时间:2024/05/06 22:58
bool mark [N];
vector <int> primeList; void sieve () {memset (mark, true, sizeof (mark));mark [0] = mark [1] = false;for ( int i = 4; i < N; i += 2 ) mark [i] = false;for ( int i = 3; i * i <= N; i++ ){ if ( mark [i] ) { for ( int j = i * i; j < N; j += 2 * i ) mark [j] = false; }}primeList.clear ();primeList.push_back (2);for ( int i = 3; i < N; i += 2 ){ if ( mark [i] ) primeList.push_back (i);}//printf ("%d\n", primeList.size ()); } int main (){sieve ();vector <int> twinPrime;for ( size_t i = 1; i < primeList.size (); i++ ){ if ( primeList [i] - primeList [i - 1] == 2 ) twinPrime.push_back (primeList [i - 1]);}int t;scanf("%d",&t);int s;while ( t-- ){ scanf("%d",&s); printf ("%d %d\n", twinPrime [s - 1], twinPrime [s - 1] + 2);}return 0;
parallel version of twin primeszhuanzaizi
/* *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, //子问题规模 begin, //数据区间左端点 end; //数据区间右端点 double start_time, //开始时间 end_time, //结束时间 total_time, //总时间(取所有进程时间中的最大值) my_time; //单个进程的时间 mycount = 0; allcount = 0; MPI_Init(&argc,&argv); //MPI程序初始化 MPI_Comm_size(MPI_COMM_WORLD,&task_num); //取子任务个数 MPI_Comm_rank(MPI_COMM_WORLD,&myrank); //取子任务标识 if (argc != 2) //参数个数为2:文件名以及问题规模n { Help(argv[0]); exit(0); } if (myrank == 0) { n=atoi(argv[1]); } MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); //主程序将获取的参数n广播 start_time= MPI_Wtime(); //开始时间 partion_size = (int)ceil(n*1.0/task_num); //每个进程划分得到的数据规模 //左闭右开 begin = myrank * partion_size; end = (myrank+1) * partion_size; //保证第一组数据从2开始 if (begin < 2) begin = 2; //保证最后一组数据不越界 if (end > n+1) end = n+1; int i, k; k = 0; for (i = begin; i < end; i++) is_prime[i] = true; if (myrank == 0) //主程序 { int j; fprintf (stdout, "\n正在使用%d个子任务,在查找%d之内的素数.\n",task_num,n); for (i = 2; i < partion_size && i*i < n; i++) { if(is_prime[i]) { for (j = i*i; j < partion_size; j = j+i) is_prime[j] = false; data[k] = i; //每找到一个素数就广播 //注意,广播的第3个参数指定了广播发送方,第4个参数指定了群组,群组中其他进程为接收方。 MPI_Bcast(data+k, 1, MPI_INT, 0, MPI_COMM_WORLD); k++; } } data[k] = 0; //广播0表示结束 MPI_Bcast(data+k, 1, MPI_INT, 0, MPI_COMM_WORLD); } else //从程序 { int new_begin; while (1) { //接收来自主程序的广播 MPI_Bcast(data+k, 1, MPI_INT, 0, MPI_COMM_WORLD); //接收到0表示结束 if (data[k] == 0) break; //本区间中第一个能被data[k]整除的数 new_begin = begin+(data[k]-begin%data[k])%data[k]; if (new_begin>end) break; //筛掉data[k]的倍数 for (i = new_begin; i < end; i += data[k]) is_prime[i] = false; k++; } } fprintf (stdout, "\nI'm process %d,the primes I found are:\n",myrank); for (i = begin; i < end; i++) if(is_prime[i]) { mycount++; fprintf(stdout, "%d ", i); } fprintf(stdout, "\n"); //素数个数归约 MPI_Reduce(&mycount,&allcount,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD); end_time = MPI_Wtime(); my_time = end_time - start_time; //printf("\nI'm process %d,my running time is %f seconds\n",myrank,my_time); //执行时间归约 MPI_Reduce(&my_time,&total_time,1,MPI_DOUBLE,MPI_MAX,0,MPI_COMM_WORLD); if(myrank==0) { printf("\nTotal count of prime number:%d\n",allcount); printf("Elapsed time = %f seconds\n",total_time); fflush(stdout); } MPI_Finalize(); return 0;}void Help(char* prog_name) { fprintf(stderr, "Please input the command as follow: %s <n> \n", prog_name); fprintf(stderr, " (n: number of elements)\n");}
阅读全文
0 0
- twin primes. serial and parallel
- UVA Twin Primes
- UVA 10394 Twin Primes
- UVa 10394 - Twin Primes
- 2 UVA 10394 Twin Primes
- Serial和Parallel垃圾回收
- UVa 10394 Twin Primes (孪生素数)
- Garbage Collectors – Serial vs. Parallel vs. CMS vs. G1 (and what’s new in Java 8)
- 垃圾收集器Serial 、Parallel、CMS、G1
- 垃圾收集器Serial 、Parallel、CMS、G1
- 1277: QAQ and twin lock
- HotSpot中Parallel Scavenge/Parallel Old与Serial/Serial Old内存分配策略区别
- HotSpot中Parallel Scavenge/Parallel Old与Serial/Serial Old内存分配策略区别
- JVM中垃圾收集器 serial、parNew、parallel Scavenge;serial old、parallel old、CMS、G1
- TWIN~
- Parallel and Perpendicular
- Concurrent and Parallel Programming
- Parallel Containers and Objects
- Solr搜索统计 JSON Faceting API
- oracle
- Find All Duplicates in an Array,leetcode,442
- Android自定义View的属性,attr format取值类型
- OC基础-类的点语法15
- twin primes. serial and parallel
- iOS 关键字 copy,assign,strong,retain,weak,readonly,readwrite,nonatomic,atomic,unsafe_unretained的使用与区别
- 224.map6-路线搜索
- /proc/$pid/environ?
- 225.map7-定位
- iOS 最新 APP 提交上架流程~(打包 ipa)
- spark性能优化:数据倾斜调优
- spark性能优化:数据倾斜调优
- BSidesSF-2017-pinlock-150