View difference between Paste ID: jwSqYejb and T3yzViZP
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
}