changeset 0:8194b72c6c30 tip

initial import
author hausers
date Wed, 30 Nov 2011 16:56:25 +0100
parents
children
files src/Application/SSR_Sieve/Divide_Pr.c src/Application/SSR_Sieve/EntryPoint.c src/Application/SSR_Sieve/IntervalPr.c src/Application/SSR_Sieve/SSR_Sieve.h src/Application/SSR_Sieve/SSR_Sieve_debug.c src/Application/Sieve.c src/Application/Sieve.h src/Application/Sieve.o src/Application/SievePrints.c src/Application/SievePrints.h src/Application/main.c
diffstat 11 files changed, 246 insertions(+), 0 deletions(-) [+]
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/src/Application/SSR_Sieve/Divide_Pr.c	Wed Nov 30 16:56:25 2011 +0100
     1.3 @@ -0,0 +1,94 @@
     1.4 +#include "SSR_Sieve.h"
     1.5 +
     1.6 +
     1.7 +#define BLOCK_LOW(id,p,n) ((id)*(n)/(p))
     1.8 +//#define BLOCK_HIGH(id,p,n) (BLOCK_LOW(id+1,p,n)-1)
     1.9 +#define BLOCK_SIZE(id,p,n) (BLOCK_LOW(id+1,p,n)-BLOCK_LOW(id,p,n))
    1.10 +//#define BLOCK_OWNER(index,p,n) ((((p)*(index)+1)-1)/(n))
    1.11 +//
    1.12 +
    1.13 +int findNextK(char *primeNumbers,int k) {
    1.14 +	int i= k+1;
    1.15 +	while (primeNumbers[i] == 1) i++; 
    1.16 +	return i;
    1.17 +}
    1.18 +
    1.19 +void divideIntoSubArrays (void *_sieveParams, VirtProcr *animPr) {
    1.20 +	SieveParams *sieveParams;
    1.21 +	char *primeNumbers;
    1.22 +	SubSequence *subSequence[NUM_CORES];
    1.23 +//	struct SubSequence *subSequence[NUM_CORES];
    1.24 +	VirtProcr *intervalProcr[NUM_CORES];
    1.25 +	void *msg[NUM_CORES];
    1.26 +	int p; // number of threads
    1.27 +	int i;
    1.28 +	int n;
    1.29 +	int k;
    1.30 +	int maxNum;
    1.31 +	int offset;
    1.32 +	int blockLow,blockHigh,blockSize;
    1.33 +
    1.34 +	p= NUM_CORES;
    1.35 +
    1.36 +	sieveParams= (SieveParams *)_sieveParams;
    1.37 +	
    1.38 +	maxNum= sieveParams->maxNum;
    1.39 +	primeNumbers= sieveParams->primeNumbers;
    1.40 +
    1.41 +	// create data_structures for each virtual processor
    1.42 +	for (i= 0; i<p; i++) {
    1.43 +		subSequence[i]= SSR__malloc_to(sizeof(SubSequence),animPr);
    1.44 +		if (!subSequence[i]) {
    1.45 +			printf("SSR__malloc failed for subSequence[i]!\n");
    1.46 +			exit(1);
    1.47 +		}
    1.48 +		intervalProcr[i]= SSR__malloc_to(sizeof(VirtProcr),animPr);
    1.49 +		if (!intervalProcr[i]) {
    1.50 +			printf("SSR_malloc failed for intervalProcr[%i]!\n",i);
    1.51 +		}
    1.52 +	}
    1.53 +
    1.54 +	k= 2; // initial prime number
    1.55 +
    1.56 +	while (k*k <= maxNum) {
    1.57 +		offset= 2*k;
    1.58 +		n= maxNum-offset; // compute range
    1.59 +		for (i= 0; i<p; i++) { // for all virtual processors
    1.60 +			blockLow= BLOCK_LOW(i,p,n)+offset;
    1.61 +			blockSize= BLOCK_SIZE(i,p,n);
    1.62 +			subSequence[i]->primeNumbers= &primeNumbers[blockLow];
    1.63 +			subSequence[i]->offset= blockLow;
    1.64 +			subSequence[i]->cV= k;
    1.65 +			subSequence[i]->size= blockSize;
    1.66 +			subSequence[i]->mainPr= animPr;
    1.67 +			intervalProcr[i]= SSR__create_procr_with(&intervalPr,subSequence[i],animPr);
    1.68 +		}
    1.69 +		// synchronization point 
    1.70 +		for (i= 0; i<p; i++) {
    1.71 +			msg[i]= SSR__receive_from_to(intervalProcr[i],animPr);	
    1.72 +		}
    1.73 +
    1.74 +		// compute next k
    1.75 +		k= findNextK(primeNumbers,k);
    1.76 +		
    1.77 +
    1.78 +	}
    1.79 +
    1.80 +	// DEBUG
    1.81 +	//printSubSequence(subSequence,p);
    1.82 +
    1.83 +	for (i= 0; i<p; i++) {
    1.84 +		SSR__free(subSequence[i],animPr);
    1.85 +		// not freeing virtualProcr, assuming this will be done by VMS
    1.86 +		// if (intervalProcr[i]) SSR__free(intervalProcr[i],animPr); 
    1.87 +		// free suceeded from time to time,so there is a check if you free
    1.88 +		// double
    1.89 +		// but there is a case where it's not detecting a second free on the
    1.90 +		// same address
    1.91 +		// maybe to free virtual processors the original malloc is used, and
    1.92 +		// therefore a second free can be detected
    1.93 +	}
    1.94 +
    1.95 +	SSR__dissipate_procr(animPr);
    1.96 +	
    1.97 +}
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/src/Application/SSR_Sieve/EntryPoint.c	Wed Nov 30 16:56:25 2011 +0100
     2.3 @@ -0,0 +1,18 @@
     2.4 +#include "SSR_Sieve.h"
     2.5 +
     2.6 +char* computePrimeNumbers (int n) {
     2.7 +	char* primeNumbers;
     2.8 +	SieveParams* sieveParams;
     2.9 +
    2.10 +	primeNumbers= malloc(n*sizeof(*primeNumbers));
    2.11 +	memset(primeNumbers,0,n);
    2.12 +
    2.13 +	sieveParams= malloc(sizeof(*sieveParams));
    2.14 +	sieveParams->primeNumbers= primeNumbers;
    2.15 +	sieveParams->maxNum= n;
    2.16 +
    2.17 +	SSR__create_seed_procr_and_do_work(&divideIntoSubArrays,sieveParams);
    2.18 +
    2.19 +	return primeNumbers;
    2.20 +}
    2.21 +
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/src/Application/SSR_Sieve/IntervalPr.c	Wed Nov 30 16:56:25 2011 +0100
     3.3 @@ -0,0 +1,24 @@
     3.4 +#include "SSR_Sieve.h"
     3.5 +
     3.6 +void intervalPr (void *_intervalParams, VirtProcr *animPr) {
     3.7 +	SubSequence *intervalSequence;
     3.8 +	VirtProcr *mainPr;
     3.9 +	char* primeNumbers;
    3.10 +	int offset;
    3.11 +	int size;
    3.12 +	int cV;
    3.13 +
    3.14 +	intervalSequence= (SubSequence *)_intervalParams;
    3.15 +	primeNumbers= intervalSequence->primeNumbers;
    3.16 +	offset= intervalSequence->offset;
    3.17 +	size= intervalSequence->size;
    3.18 +	cV= intervalSequence->cV;
    3.19 +	mainPr= intervalSequence->mainPr;
    3.20 +
    3.21 +	sieve(primeNumbers,size,offset,cV);
    3.22 +
    3.23 +	SSR__send_from_to(NULL,animPr,mainPr);
    3.24 +
    3.25 +	SSR__dissipate_procr(animPr);
    3.26 +}
    3.27 +
     4.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.2 +++ b/src/Application/SSR_Sieve/SSR_Sieve.h	Wed Nov 30 16:56:25 2011 +0100
     4.3 @@ -0,0 +1,40 @@
     4.4 +#ifndef SSR_SIEVE_H
     4.5 +#define SSR_SIEVE_H
     4.6 +#endif
     4.7 +
     4.8 +#include <stdlib.h>
     4.9 +
    4.10 +#include "../../SSR_lib/SSR.h"
    4.11 +#include "../Sieve.h"
    4.12 +
    4.13 +
    4.14 +typedef struct {
    4.15 +	char* primeNumbers;
    4.16 +	int maxNum;
    4.17 +} SieveParams;
    4.18 +
    4.19 +typedef struct {
    4.20 +	VirtProcr *mainPr; 
    4.21 +	char *primeNumbers;
    4.22 +	int offset;
    4.23 +	int size;
    4.24 +	int cV;
    4.25 +} SubSequence;
    4.26 +
    4.27 +//struct SubSequence {
    4.28 +//	char* primeNumbers;
    4.29 +//	int offset;
    4.30 +//	int size;
    4.31 +//	int cV;
    4.32 +//}
    4.33 +
    4.34 +// === Processor Functions ===
    4.35 +void divideIntoSubArrays (void* _sieveParams, VirtProcr *animPr); 
    4.36 +void intervalPr (void *_intervalParams, VirtProcr *animPr); 
    4.37 +
    4.38 +// === Entry Point ===
    4.39 +char* computePrimeNumbers (int maxNum);
    4.40 +
    4.41 +
    4.42 +// === DEBUG ===
    4.43 +void printSubSequence (SubSequence *subSequence[NUM_CORES], int p); 
     5.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     5.2 +++ b/src/Application/SSR_Sieve/SSR_Sieve_debug.c	Wed Nov 30 16:56:25 2011 +0100
     5.3 @@ -0,0 +1,12 @@
     5.4 +#include "SSR_Sieve.h"
     5.5 +#include "../SievePrints.h"
     5.6 +
     5.7 +void printSubSequence (SubSequence *subSequence[NUM_CORES], int p) {
     5.8 +	int i;
     5.9 +	for (i= 0; i<p; i++) {
    5.10 +		printf("%i: k = %i; offset = %i; size = %i; array= ",i,subSequence[i]->cV,subSequence[i]->offset,subSequence[i]->size);
    5.11 +		printArray(subSequence[i]->primeNumbers,subSequence[i]->size);
    5.12 +		printf("\n");
    5.13 +	}
    5.14 +}
    5.15 +
     6.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.2 +++ b/src/Application/Sieve.c	Wed Nov 30 16:56:25 2011 +0100
     6.3 @@ -0,0 +1,8 @@
     6.4 +void sieve (char* array, int size, int globalIndexStart, int k) {
     6.5 +	int i;
     6.6 +	int cV; // current value
     6.7 +	for (i= 0; i<size; i++) {
     6.8 +		cV= i+globalIndexStart;
     6.9 +		if (cV*cV % k == 0) array[i]= 1; 
    6.10 +	}
    6.11 +}
     7.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.2 +++ b/src/Application/Sieve.h	Wed Nov 30 16:56:25 2011 +0100
     7.3 @@ -0,0 +1,1 @@
     7.4 +void sieve (char* array,int size,int globalIndexStart,int k);
     8.1 Binary file src/Application/Sieve.o has changed
     9.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     9.2 +++ b/src/Application/SievePrints.c	Wed Nov 30 16:56:25 2011 +0100
     9.3 @@ -0,0 +1,25 @@
     9.4 +#include <stdio.h>
     9.5 +#include <stdlib.h>
     9.6 +#include "SievePrints.h"
     9.7 +
     9.8 +void printArray (char* ar, int n) {
     9.9 +    int i;
    9.10 +	if (n > 1) printf("[%i,",ar[0]);
    9.11 +	if (n == 1) printf("[%i",ar[0]);
    9.12 +	for (i= 1; i<n-1; i++) printf("%i,",ar[i]);
    9.13 +	if (n > 1) printf("%i",ar[n-1]);
    9.14 +	if (n > 0) printf("]\n");
    9.15 +}
    9.16 +
    9.17 +void printPrimes (char* ar, int size, int offset) {
    9.18 +	int i;
    9.19 +	char* primeNumbers;
    9.20 +	int j= 0;
    9.21 +	int count= 0;
    9.22 +	for (i= 0; i<size; i++) if (ar[i] == 0) count++;
    9.23 +	primeNumbers= malloc(count*sizeof(*primeNumbers));
    9.24 +	for (i= 0; i<size; i++) {
    9.25 +		if (ar[i] == 0) primeNumbers[j++]= i+offset;
    9.26 +	}
    9.27 +	printArray(primeNumbers,count);
    9.28 +}
    10.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    10.2 +++ b/src/Application/SievePrints.h	Wed Nov 30 16:56:25 2011 +0100
    10.3 @@ -0,0 +1,4 @@
    10.4 +void printArray (char* array,int size);
    10.5 +
    10.6 +void printPrimes (char* array, int size, int offset);
    10.7 +
    11.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    11.2 +++ b/src/Application/main.c	Wed Nov 30 16:56:25 2011 +0100
    11.3 @@ -0,0 +1,20 @@
    11.4 +#include <stdio.h>
    11.5 +#include <stdlib.h>
    11.6 +#include "SievePrints.h"
    11.7 +#include "SSR_Sieve/SSR_Sieve.h"
    11.8 +
    11.9 +char __ProgrammName[] = "Sieve of Eratosthenes";
   11.10 +char __DataSet[255];
   11.11 +
   11.12 +int main (int argc, char**argv) {
   11.13 +	char* primeNumbers;
   11.14 +	int n;
   11.15 +	if (argc != 2) {
   11.16 +		printf("Argument n expected!\n");
   11.17 +		return 1;
   11.18 +	}
   11.19 +	n= atoi(argv[1]);
   11.20 +	primeNumbers= computePrimeNumbers(n);
   11.21 +	printPrimes(primeNumbers,n,0);
   11.22 +	return 0;
   11.23 +}