#include <math.h>
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char *argv[] );
int prime_number (int n, int id, int p);
void timestamp ();
int main (int argc , char *argv[] )
purpose:
main is the main program for PRIME_MPI.
{
int i;
int id;
int ierr;
int n;
int n_factor;
int n_hi;
int n_lo;
int p;
int primes;
int primes_part;
double wtime;
n_lo = 1;
n_hi = 262144;
n_factor = 2;
/*
Initialize MPI.
*/
ierr = MPI_init ( &argc, &argv );
/*
Get the number of proesses.
*/
ierr = MPI_comm_size ( MPI_COMM_WORLD, &p );
/*
determine this processes's rank.
*/
ierr = MPI_COMM_RANK (MPI_COMM_WORLD, &id );
if ( id == 0)
{
timestamp ( );
printf ( " C/MPI version\n" );
printf ( "An MPI example program to count number of primes.\n" );
printf ( "The numberof processes is %d\n", p
);
}
n = n_lo;
while ( n <= n_hi )
{
if ( id == 0)
{
wtime = MPI_Wtime ( );
}
ierr = MPI_Bcast ( &n, 1, MPI_INT, 0, MPI_COMM_WORLD );
primes_part = prime-number ( n, id, p );
ierr = MPI_Reduce ( &primes_part, &primes, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD );
if ( id == 0 )
{
wtime = MPI_Wtime ( ) - wtime;
printf ( " %8d %8d %14f\n", n
, primes
, wtime
);
}
n = n * n_factor;
}
/*
Terminate MPI.
*/
ierr = MPI_Finalize ( );
/*
Terminate.
*/
if ( id == 0 )
{
printf ( "PRIME_MPI - Master process: \n");
printf ( " Normal end of execution. \n");
timestamp ( );
}
return 0;
}
{
int i;
int j;
int prime;
int total;
total = 0;
for ( i = 2 + id; i <= n; i = i + p )
{
prime = 1;
for ( j = 2; j < i; j ++ )
{
if ( ( i% j ) == 0 )
{
prime = 0;
break;
}
}
total = total + prime;
}
return total;
}
I2luY2x1ZGUgPG1hdGguaD4KCiNpbmNsdWRlIDxtcGkuaD4KCiNpbmNsdWRlIDxzdGRpby5oPgoKI2luY2x1ZGUgPHN0ZGxpYi5oPgoKI2luY2x1ZGUgPHRpbWUuaD4KCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10gKTsKCmludCBwcmltZV9udW1iZXIgKGludCBuLCBpbnQgaWQsIGludCBwKTsKCnZvaWQgdGltZXN0YW1wICgpOwoKaW50IG1haW4gKGludCBhcmdjICwgY2hhciAqYXJndltdICkKCnB1cnBvc2U6CgptYWluIGlzIHRoZSBtYWluIHByb2dyYW0gZm9yIFBSSU1FX01QSS4KCnsKCiAgICBpbnQgaTsKCiAgICBpbnQgaWQ7CgogICAgaW50IGllcnI7CgogICAgaW50IG47CgogICAgaW50IG5fZmFjdG9yOwoKICAgIGludCBuX2hpOwoKICAgIGludCBuX2xvOwoKICAgIGludCBwOwoKICAgIGludCBwcmltZXM7CgogICAgaW50IHByaW1lc19wYXJ0OwoKICAgIGRvdWJsZSB3dGltZTsKCiAgICAgbl9sbyA9IDE7CgogICAgbl9oaSA9IDI2MjE0NDsKCiAgICBuX2ZhY3RvciA9IDI7CgovKgoKICAgSW5pdGlhbGl6ZSBNUEkuCgoqLwoKICAgaWVyciA9IE1QSV9pbml0ICggJmFyZ2MsICZhcmd2ICk7CgovKgoKICAgR2V0IHRoZSBudW1iZXIgb2YgcHJvZXNzZXMuCgoqLwoKICAgIGllcnIgPSBNUElfY29tbV9zaXplICggTVBJX0NPTU1fV09STEQsICZwICk7CgovKgoKICAgIGRldGVybWluZSB0aGlzIHByb2Nlc3NlcydzIHJhbmsuCgoqLwoKICAgIGllcnIgPSBNUElfQ09NTV9SQU5LIChNUElfQ09NTV9XT1JMRCwgJmlkICk7CgogICAgaWYgKCBpZCA9PSAwKQoKICAgICB7CgogICAgICAgICB0aW1lc3RhbXAgKCApOwoKICAgICAgICAgcHJpbnRmICggIlxuIiApOwoKICAgICAgICAgcHJpbnRmICggIlBSSU1FX01QSVxuIiApOwoKICAgICAgICAgcHJpbnRmICggIiBDL01QSSB2ZXJzaW9uXG4iICk7CgogICAgICAgICBwcmludGYgKCAiXG4iICk7CgogICAgICAgICBwcmludGYgKCAiQW4gTVBJIGV4YW1wbGUgcHJvZ3JhbSB0byBjb3VudCBudW1iZXIgb2YgcHJpbWVzLlxuIiApOwoKICAgICAgICAgcHJpbnRmICggICJUaGUgbnVtYmVyb2YgcHJvY2Vzc2VzIGlzICVkXG4iLCBwICk7CgogICAgICAgIHByaW50ZiAoICJcbiIgKTsKCiAgICAgICAgcHJpbnRmICAgKCAiICAgICAgICAgIE4gICAgICAgICAgcGkgICAgICAgIFRpbWVcbiIgKTsKCiAgICAgICAgcHJpbnRmICAgKCAiXG4iICk7Cgp9CgpuICAgPSBuX2xvOwoKd2hpbGUgKCBuIDw9IG5faGkgKQoKewoKICAgICBpZiAgICggaWQgPT0gMCkKCiAgICAgICAgewoKICAgICAgICAgICAgd3RpbWUgICA9ICAgTVBJX1d0aW1lICggKTsKCiAgICAgICAgICB9CgogICAgICAgICAgaWVyciAgID0gTVBJX0JjYXN0ICggICAmbiwgMSwgTVBJX0lOVCwgMCwgTVBJX0NPTU1fV09STEQgKTsKCiAgICAgICAgICBwcmltZXNfcGFydCA9IHByaW1lLW51bWJlciAoIG4sIGlkLCBwICk7CgogICAgICAgICAgaWVyciAgPSBNUElfUmVkdWNlICggJnByaW1lc19wYXJ0LCAmcHJpbWVzLCAxLCBNUElfSU5ULCBNUElfU1VNLCAwLCBNUElfQ09NTV9XT1JMRCApOwoKICAgICAgaWYgKCBpZCA9PSAwICkKCiAgICAgICAgewoKICAgICAgICAgICAgd3RpbWUgICA9IE1QSV9XdGltZSAoICkgLSB3dGltZTsKCiAgICAgICAgICAgIHByaW50ZiAoICIgJThkICU4ZCAlMTRmXG4iLCBuLCBwcmltZXMsIHd0aW1lICk7CgogICAgICAgfQoKICAgIG4gPSBuICogbl9mYWN0b3I7Cgp9CgovKgoKVGVybWluYXRlIE1QSS4KCiovCgppZXJyID0gTVBJX0ZpbmFsaXplICAgKCApOwoKLyoKClRlcm1pbmF0ZS4KCiovCgogICBpZiAoIGlkID09IDAgICApCgp7CgogICAgIHByaW50ZiAoICAgIlxuIiApOwoKICAgICBwcmludGYgKCAgICJQUklNRV9NUEkgLSBNYXN0ZXIgcHJvY2VzczogXG4iKTsKCiAgICAgcHJpbnRmICAgKCAgICIgTm9ybWFsIGVuZCBvZiBleGVjdXRpb24uIFxuIik7CgogICAgIHRpbWVzdGFtcCAoICk7Cgp9CgogICByZXR1cm4gMDsKCn0KCnsKCiAgICAgaW50IGk7CgogICAgIGludCBqOwoKICAgICBpbnQgcHJpbWU7CgogICAgIGludCB0b3RhbDsKCiAgICAgdG90YWwgPSAwOwoKICAgICBmb3IgKCBpID0gMiArIGlkOyBpIDw9IG47IGkgPSBpICsgcCApCgogICAgIHsKCiAgICAgICBwcmltZSA9IDE7CgogICAgICAgZm9yICAgKCBqID0gMjsgaiA8IGk7IGogKysgKQoKICAgICAgIHsKCiAgICAgICAgICAgaWYgKCAoIGklIGogKSA9PSAwICkKCiAgICAgICB7CgogICAgICAgICAgcHJpbWUgPSAwOwoKICAgICAgICAgIGJyZWFrOwoKICAgICAgICB9Cgp9CgogICAgdG90YWwgPSB0b3RhbCArIHByaW1lOwoKfQoKcmV0dXJuIHRvdGFsOwoKfSAgIA==