# HG changeset patch # User hausers # Date 1322668585 -3600 # Node ID 8194b72c6c30fb2f29a75ac90de1be1b10c3cf0e initial import diff -r 000000000000 -r 8194b72c6c30 src/Application/SSR_Sieve/Divide_Pr.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/Application/SSR_Sieve/Divide_Pr.c Wed Nov 30 16:56:25 2011 +0100 @@ -0,0 +1,94 @@ +#include "SSR_Sieve.h" + + +#define BLOCK_LOW(id,p,n) ((id)*(n)/(p)) +//#define BLOCK_HIGH(id,p,n) (BLOCK_LOW(id+1,p,n)-1) +#define BLOCK_SIZE(id,p,n) (BLOCK_LOW(id+1,p,n)-BLOCK_LOW(id,p,n)) +//#define BLOCK_OWNER(index,p,n) ((((p)*(index)+1)-1)/(n)) +// + +int findNextK(char *primeNumbers,int k) { + int i= k+1; + while (primeNumbers[i] == 1) i++; + return i; +} + +void divideIntoSubArrays (void *_sieveParams, VirtProcr *animPr) { + SieveParams *sieveParams; + char *primeNumbers; + SubSequence *subSequence[NUM_CORES]; +// struct SubSequence *subSequence[NUM_CORES]; + VirtProcr *intervalProcr[NUM_CORES]; + void *msg[NUM_CORES]; + int p; // number of threads + int i; + int n; + int k; + int maxNum; + int offset; + int blockLow,blockHigh,blockSize; + + p= NUM_CORES; + + sieveParams= (SieveParams *)_sieveParams; + + maxNum= sieveParams->maxNum; + primeNumbers= sieveParams->primeNumbers; + + // create data_structures for each virtual processor + for (i= 0; iprimeNumbers= &primeNumbers[blockLow]; + subSequence[i]->offset= blockLow; + subSequence[i]->cV= k; + subSequence[i]->size= blockSize; + subSequence[i]->mainPr= animPr; + intervalProcr[i]= SSR__create_procr_with(&intervalPr,subSequence[i],animPr); + } + // synchronization point + for (i= 0; iprimeNumbers= primeNumbers; + sieveParams->maxNum= n; + + SSR__create_seed_procr_and_do_work(÷IntoSubArrays,sieveParams); + + return primeNumbers; +} + diff -r 000000000000 -r 8194b72c6c30 src/Application/SSR_Sieve/IntervalPr.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/Application/SSR_Sieve/IntervalPr.c Wed Nov 30 16:56:25 2011 +0100 @@ -0,0 +1,24 @@ +#include "SSR_Sieve.h" + +void intervalPr (void *_intervalParams, VirtProcr *animPr) { + SubSequence *intervalSequence; + VirtProcr *mainPr; + char* primeNumbers; + int offset; + int size; + int cV; + + intervalSequence= (SubSequence *)_intervalParams; + primeNumbers= intervalSequence->primeNumbers; + offset= intervalSequence->offset; + size= intervalSequence->size; + cV= intervalSequence->cV; + mainPr= intervalSequence->mainPr; + + sieve(primeNumbers,size,offset,cV); + + SSR__send_from_to(NULL,animPr,mainPr); + + SSR__dissipate_procr(animPr); +} + diff -r 000000000000 -r 8194b72c6c30 src/Application/SSR_Sieve/SSR_Sieve.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/Application/SSR_Sieve/SSR_Sieve.h Wed Nov 30 16:56:25 2011 +0100 @@ -0,0 +1,40 @@ +#ifndef SSR_SIEVE_H +#define SSR_SIEVE_H +#endif + +#include + +#include "../../SSR_lib/SSR.h" +#include "../Sieve.h" + + +typedef struct { + char* primeNumbers; + int maxNum; +} SieveParams; + +typedef struct { + VirtProcr *mainPr; + char *primeNumbers; + int offset; + int size; + int cV; +} SubSequence; + +//struct SubSequence { +// char* primeNumbers; +// int offset; +// int size; +// int cV; +//} + +// === Processor Functions === +void divideIntoSubArrays (void* _sieveParams, VirtProcr *animPr); +void intervalPr (void *_intervalParams, VirtProcr *animPr); + +// === Entry Point === +char* computePrimeNumbers (int maxNum); + + +// === DEBUG === +void printSubSequence (SubSequence *subSequence[NUM_CORES], int p); diff -r 000000000000 -r 8194b72c6c30 src/Application/SSR_Sieve/SSR_Sieve_debug.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/Application/SSR_Sieve/SSR_Sieve_debug.c Wed Nov 30 16:56:25 2011 +0100 @@ -0,0 +1,12 @@ +#include "SSR_Sieve.h" +#include "../SievePrints.h" + +void printSubSequence (SubSequence *subSequence[NUM_CORES], int p) { + int i; + for (i= 0; i +#include +#include "SievePrints.h" + +void printArray (char* ar, int n) { + int i; + if (n > 1) printf("[%i,",ar[0]); + if (n == 1) printf("[%i",ar[0]); + for (i= 1; i 1) printf("%i",ar[n-1]); + if (n > 0) printf("]\n"); +} + +void printPrimes (char* ar, int size, int offset) { + int i; + char* primeNumbers; + int j= 0; + int count= 0; + for (i= 0; i +#include +#include "SievePrints.h" +#include "SSR_Sieve/SSR_Sieve.h" + +char __ProgrammName[] = "Sieve of Eratosthenes"; +char __DataSet[255]; + +int main (int argc, char**argv) { + char* primeNumbers; + int n; + if (argc != 2) { + printf("Argument n expected!\n"); + return 1; + } + n= atoi(argv[1]); + primeNumbers= computePrimeNumbers(n); + printPrimes(primeNumbers,n,0); + return 0; +}