SHOW:
|
|
- or go back to the newest paste.
| 1 | #include <cstdio> | |
| 2 | #include <cstring> | |
| 3 | #include <cstdlib> | |
| 4 | #include <iostream> | |
| 5 | #include <algorithm> | |
| 6 | #include <thread> | |
| 7 | using namespace std; | |
| 8 | const size_t size=50000000; | |
| 9 | void s(double ** bucketsstart, double** bucketsend, int start,int delta, int numbuckets){
| |
| 10 | for (;start<=numbuckets; start+=delta) | |
| 11 | sort(bucketsstart[start],bucketsend[start]); | |
| 12 | } | |
| 13 | int main(){
| |
| 14 | double *data=new double[size]; | |
| 15 | FILE *f = fopen("gaussian.dat", "rb");
| |
| 16 | fread(data,8,size,f); | |
| 17 | FILE* h=fopen("helper.txt","rb");
| |
| 18 | int numbuckets; | |
| 19 | fread(&numbuckets,sizeof(int),1,h); | |
| 20 | int dscale; | |
| 21 | fread(&dscale,sizeof(int),1,h); | |
| 22 | double dmin; //minimum value of tabularised distribution | |
| 23 | double dmax; //,aximum ditto | |
| 24 | fread(&dmin,sizeof(double),1,h); | |
| 25 | fread(&dmax,sizeof(double),1,h); | |
| 26 | //int minn=dmin*dscale; | |
| 27 | int ile; | |
| 28 | fread(&ile,sizeof(int),1,h); | |
| 29 | int *tab=new int[ile]; | |
| 30 | int test=fread(tab,sizeof(int),ile,h); | |
| 31 | if (test!=ile) cout<<"blad\n"; | |
| 32 | double * databuckets=new double [size*4+size/numbuckets*4]; //just to be sure | |
| 33 | double ** bucketsstart= new double* [numbuckets+1];// pointer to beggining of every bucket | |
| 34 | double ** bucketsend= new double* [numbuckets+1]; //pointer to end | |
| 35 | int offset=4*size/numbuckets; | |
| 36 | for (int i=0; i<numbuckets+1; i++){
| |
| 37 | bucketsend[i]=bucketsstart[i]=databuckets+i*offset; | |
| 38 | } | |
| 39 | for (int i=0; i<size; i++){
| |
| 40 | if (data[i]>dmax) {
| |
| 41 | *bucketsend[numbuckets]++=data[i]; | |
| 42 | } | |
| 43 | else if (data[i]<dmin) *bucketsend[0]++=data[i]; | |
| 44 | else {
| |
| 45 | *bucketsend[tab[(int)((data[i]-dmin)*dscale)]]++=data[i]; | |
| 46 | } | |
| 47 | } | |
| 48 | const int numthreads=4; | |
| 49 | thread** thr=new thread*[numthreads]; | |
| 50 | for (int i=0; i<numthreads; i++){
| |
| 51 | thr[i] =new thread (s,bucketsstart,bucketsend,i,numthreads,numbuckets); | |
| 52 | } | |
| 53 | for (int i=0; i<numthreads; i++){
| |
| 54 | thr[i]->join(); | |
| 55 | delete thr[i]; | |
| 56 | } | |
| 57 | delete [] thr; | |
| 58 | double* currData=data; | |
| 59 | for (int i=0; i<=numbuckets; i++){
| |
| 60 | memcpy(currData,bucketsstart[i],(bucketsend[i]-bucketsstart[i])*8); | |
| 61 | currData+=bucketsend[i]-bucketsstart[i]; | |
| 62 | } | |
| 63 | //for (int i=0; i<size-1; i++){
| |
| 64 | // if (data[i]>data[i+1]) cout<<i<<' '<<data[i]<<' '<<data[i+1]<<endl; | |
| 65 | //} | |
| 66 | ||
| 67 | //fwrite(data,8,size,stdout); | |
| 68 | fclose(h); | |
| 69 | fclose(f); | |
| 70 | } |