Mercurial > cgi-bin > hgwebdir.cgi > PR > Applications > SSR > SSR__Sieve__Bench
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(÷IntoSubArrays,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 +}
