#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;
ierr = MPI_init ( &argc, &argv );
ierr = MPI_comm_size ( MPI_COMM_WORLD, &p );
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;
}
ierr = MPI_Finalize ( );
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;
}
I2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGUgPG1waS5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8dGltZS5oPgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdICk7CmludCBwcmltZV9udW1iZXIgKGludCBuLCBpbnQgaWQsIGludCBwKTsKdm9pZCB0aW1lc3RhbXAgKCk7CmludCBtYWluIChpbnQgYXJnYyAsIGNoYXIgKmFyZ3ZbXSApCnB1cnBvc2U6Cm1haW4gaXMgdGhlIG1haW4gcHJvZ3JhbSBmb3IgUFJJTUVfTVBJLgp7CmludCBpOwppbnQgaWQ7CmludCBpZXJyOwppbnQgbjsKaW50IG5fZmFjdG9yOwppbnQgbl9oaTsKaW50IG5fbG87CmludCBwOwppbnQgcHJpbWVzOwppbnQgcHJpbWVzX3BhcnQ7CmRvdWJsZSB3dGltZTsKbl9sbyA9IDE7Cm5faGkgPSAyNjIxNDQ7Cm5fZmFjdG9yID0gMjsKCgppZXJyID0gTVBJX2luaXQgKCAmYXJnYywgJmFyZ3YgKTsKCmllcnIgPSBNUElfY29tbV9zaXplICggTVBJX0NPTU1fV09STEQsICZwICk7CgoKaWVyciA9IE1QSV9DT01NX1JBTksgKE1QSV9DT01NX1dPUkxELCAmaWQgKTsKaWYgKCBpZCA9PSAwKQp7CnRpbWVzdGFtcCAoICk7CnByaW50ZiAoICJcbiIgKTsKcHJpbnRmICggIlBSSU1FX01QSVxuIiApOwpwcmludGYgKCAiIEMvTVBJIHZlcnNpb25cbiIgKTsKcHJpbnRmICggIlxuIiApOwpwcmludGYgKCAiQW4gTVBJIGV4YW1wbGUgcHJvZ3JhbSB0byBjb3VudCBudW1iZXIgb2YgcHJpbWVzLlxuIiApOwpwcmludGYgKCAiVGhlIG51bWJlcm9mIHByb2Nlc3NlcyBpcyAlZFxuIiwgcCApOwpwcmludGYgKCAiXG4iICk7CnByaW50ZiAoICIgTiBwaSBUaW1lXG4iICk7CnByaW50ZiAoICJcbiIgKTsKfQpuID0gbl9sbzsKd2hpbGUgKCBuIDw9IG5faGkgKQp7CmlmICggaWQgPT0gMCkKewp3dGltZSA9IE1QSV9XdGltZSAoICk7Cn0KaWVyciA9IE1QSV9CY2FzdCAoICZuLCAxLCBNUElfSU5ULCAwLCBNUElfQ09NTV9XT1JMRCApOwpwcmltZXNfcGFydCA9IHByaW1lLW51bWJlciAoIG4sIGlkLCBwICk7CmllcnIgPSBNUElfUmVkdWNlICggJnByaW1lc19wYXJ0LCAmcHJpbWVzLCAxLCBNUElfSU5ULCBNUElfU1VNLCAwLCBNUElfQ09NTV9XT1JMRCApOwppZiAoIGlkID09IDAgKQp7Cnd0aW1lID0gTVBJX1d0aW1lICggKSAtIHd0aW1lOwpwcmludGYgKCAiICU4ZCAlOGQgJTE0ZlxuIiwgbiwgcHJpbWVzLCB3dGltZSApOwp9Cm4gPSBuICogbl9mYWN0b3I7Cn0KCgppZXJyID0gTVBJX0ZpbmFsaXplICggKTsKCgppZiAoIGlkID09IDAgKQp7CnByaW50ZiAoICJcbiIgKTsKcHJpbnRmICggIlBSSU1FX01QSSAtIE1hc3RlciBwcm9jZXNzOiBcbiIpOwpwcmludGYgKCAiIE5vcm1hbCBlbmQgb2YgZXhlY3V0aW9uLiBcbiIpOwp0aW1lc3RhbXAgKCApOwp9CnJldHVybiAwOwp9CnsKaW50IGk7CmludCBqOwppbnQgcHJpbWU7CmludCB0b3RhbDsKdG90YWwgPSAwOwpmb3IgKCBpID0gMiArIGlkOyBpIDw9IG47IGkgPSBpICsgcCApCnsKcHJpbWUgPSAxOwpmb3IgKCBqID0gMjsgaiA8IGk7IGogKysgKQp7CmlmICggKCBpJSBqICkgPT0gMCApCnsKcHJpbWUgPSAwOwpicmVhazsKfQp9CnRvdGFsID0gdG90YWwgKyBwcmltZTsKfQpyZXR1cm4gdG90YWw7Cn0=