395 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			395 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| #include <omp.h>
 | |
| #include <vector>
 | |
| #include "pred.h"
 | |
| 
 | |
| using namespace std;
 | |
| 
 | |
| int selectproyectcpu(int *dop1, int rows, int cols, int head_size, int *select, int numselect, int *selfjoin, int numselfj, int *project, int **ret)
 | |
| {
 | |
| 	int size = 0, pos, temp;
 | |
| 	int i, x, y, z, w;
 | |
| 	int *fres, *ptr;
 | |
| 	int div, fin, ini[NUM_T + 1];
 | |
| 	vector<int> vec[NUM_T];
 | |
| 
 | |
| 	for(x = 0; x < NUM_T; x++)
 | |
| 		vec[x].reserve(INISIZE);
 | |
| 
 | |
| 	//omp_set_num_threads(NUM_T);
 | |
| 	div = rows / NUM_T;
 | |
| 	ini[0] = 0;
 | |
| 	for(x = 1; x < NUM_T; x++)
 | |
| 		ini[x] = div * x;
 | |
| 	ini[NUM_T] = rows;
 | |
| 
 | |
| 	if(numselect > 0)
 | |
| 	{	
 | |
| 		#pragma omp parallel for private(x,pos,y,z,fin,temp,w)
 | |
| 		for(i = 0; i < NUM_T; i++)
 | |
| 		{
 | |
| 			fin = ini[i+1];
 | |
| 			for(x = ini[i]; x < fin; x++)
 | |
| 			{
 | |
| 				pos = x * cols;
 | |
| 				for(y = 0; y < numselect; y += 2)
 | |
| 				{
 | |
| 					if(dop1[pos+select[y]] != select[y+1])
 | |
| 						break;
 | |
| 				}
 | |
| 				for(z = 0; z < numselfj; z++)
 | |
| 				{
 | |
| 					temp = dop1[pos+selfjoin[z]];
 | |
| 					w = z + 1;
 | |
| 					while(selfjoin[w] > -1)
 | |
| 					{
 | |
| 						if(temp != dop1[pos+selfjoin[w]])
 | |
| 							break;
 | |
| 						w++;
 | |
| 					}
 | |
| 					z = w;
 | |
| 					if(selfjoin[w] != -1)
 | |
| 						break;
 | |
| 				}
 | |
| 				if(y == numselect && z == numselfj)
 | |
| 				{
 | |
| 					for(y = 0; y < head_size; y++)
 | |
| 						vec[i].push_back(dop1[pos+project[y]]);
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		if(numselfj > 0)
 | |
| 		{
 | |
| 			#pragma omp parallel for private(x,pos,y,z,fin,w,temp)
 | |
| 			for(i = 0; i < NUM_T; i++)
 | |
| 			{
 | |
| 				fin = ini[i+1];
 | |
| 				for(x = ini[i]; x < fin; x++)
 | |
| 				{
 | |
| 					pos = x * cols;
 | |
| 					for(z = 0; z < numselfj; z++)
 | |
| 					{
 | |
| 						temp = dop1[pos+selfjoin[z]];
 | |
| 						w = z + 1;
 | |
| 						while(selfjoin[w] > -1)
 | |
| 						{
 | |
| 							if(temp != dop1[pos+selfjoin[w]])
 | |
| 								break;
 | |
| 							w++;
 | |
| 						}
 | |
| 						z = w;
 | |
| 						if(selfjoin[w] != -1)
 | |
| 							break;
 | |
| 					}
 | |
| 					if(z == numselfj)
 | |
| 					{
 | |
| 						for(y = 0; y < head_size; y++)
 | |
| 							vec[i].push_back(dop1[pos+project[y]]);
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			fres = (int *)malloc(rows * cols * sizeof(int));
 | |
| 			#pragma omp parallel for private(pos,y,z)
 | |
| 			for(x = 0; x < rows; x++)
 | |
| 			{
 | |
| 				pos = x * cols;
 | |
| 				z = pos;
 | |
| 				for(y = 0; y < head_size; y++, z++)
 | |
| 					fres[z] = dop1[pos+project[y]];
 | |
| 			}
 | |
| 			*ret = fres;
 | |
| 			return rows;
 | |
| 		}
 | |
| 	}
 | |
| 	for(x = 0; x < NUM_T; x++)
 | |
| 	{
 | |
| 		ini[x] = vec[x].size();
 | |
| 		size += ini[x];
 | |
| 	}
 | |
| 	fres = (int *)malloc(size * sizeof(int));
 | |
| 	ptr = fres;
 | |
| 	for(x = 0; x < NUM_T; x++)
 | |
| 	{
 | |
| 		memmove(ptr, vec[x].data(), ini[x] * sizeof(int));
 | |
| 		ptr += ini[x];
 | |
| 	}
 | |
| 	*ret = fres;
 | |
| 	return size / head_size;
 | |
| }
 | |
| 
 | |
| int selectproyectcpu2(int *dop1, int rows, int cols, int *select, int numselect, int *selfjoin, int numselfj, int wj, int **ret, int **list)
 | |
| {
 | |
| 	int size = 0, pos, temp;
 | |
| 	int i, x, y, z, w;
 | |
| 	int *fres, *lres, *ptr;
 | |
| 	int div, fin, ini[NUM_T + 1];
 | |
| 	int *vec[NUM_T];
 | |
| 	int *lis[NUM_T];
 | |
| 	int cont[NUM_T];
 | |
| 	
 | |
| 	//omp_set_num_threads(NUM_T);
 | |
| 	div = rows / NUM_T;
 | |
| 	ini[0] = 0;
 | |
| 	for(x = 1; x < NUM_T; x++)
 | |
| 		ini[x] = div * x;
 | |
| 	ini[NUM_T] = rows;
 | |
| 
 | |
| 	pos = div + NUM_T;
 | |
| 	for(x = 0; x < NUM_T; x++)
 | |
| 	{
 | |
| 		vec[x] = (int *)malloc(pos * sizeof(int));
 | |
| 		lis[x] = (int *)malloc(pos * sizeof(int));
 | |
| 		cont[x] = 0;
 | |
| 	}
 | |
| 
 | |
| 	/*cout << "numselect = " << numselect << endl;
 | |
| 	for(x = 0; x < numselect; x++)
 | |
| 		cout << select[x] << " ";
 | |
| 	cout << endl;*/
 | |
| 
 | |
| 	if(numselect > 0)
 | |
| 	{	
 | |
| 		#pragma omp parallel for private(x,pos,y,z,fin,temp,w)
 | |
| 		for(i = 0; i < NUM_T; i++)
 | |
| 		{
 | |
| 			fin = ini[i+1];
 | |
| 			for(x = ini[i]; x < fin; x++)
 | |
| 			{
 | |
| 				pos = x * cols;
 | |
| 				for(y = 0; y < numselect; y += 2)
 | |
| 				{
 | |
| 					if(dop1[pos+select[y]] != select[y+1])
 | |
| 						break;
 | |
| 				}
 | |
| 				for(z = 0; z < numselfj; z++)
 | |
| 				{
 | |
| 					temp = dop1[pos+selfjoin[z]];
 | |
| 					w = z + 1;
 | |
| 					while(selfjoin[w] > -1)
 | |
| 					{
 | |
| 						if(temp != dop1[pos+selfjoin[w]])
 | |
| 							break;
 | |
| 						w++;
 | |
| 					}
 | |
| 					z = w;
 | |
| 					if(selfjoin[w] != -1)
 | |
| 						break;
 | |
| 				}
 | |
| 				if(y == numselect && z == numselfj)
 | |
| 				{
 | |
| 					lis[i][cont[i]] = x;
 | |
| 					if(list != NULL)
 | |
| 						vec[i][cont[i]] = dop1[pos+wj];
 | |
| 					cont[i]++;
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		if(numselfj > 0)
 | |
| 		{
 | |
| 			#pragma omp parallel for private(x,pos,y,z,fin,w,temp) firstprivate(cont)
 | |
| 			for(i = 0; i < NUM_T; i++)
 | |
| 			{
 | |
| 				fin = ini[i+1];
 | |
| 				for(x = ini[i]; x < fin; x++)
 | |
| 				{
 | |
| 					pos = x * cols;
 | |
| 					for(z = 0; z < numselfj; z++)
 | |
| 					{
 | |
| 						temp = dop1[pos+selfjoin[z]];
 | |
| 						w = z + 1;
 | |
| 						while(selfjoin[w] > -1)
 | |
| 						{
 | |
| 							if(temp != dop1[pos+selfjoin[w]])
 | |
| 								break;
 | |
| 							w++;
 | |
| 						}
 | |
| 						z = w;
 | |
| 						if(selfjoin[w] != -1)
 | |
| 							break;
 | |
| 					}
 | |
| 					if(z == numselfj)
 | |
| 					{
 | |
| 						lis[i][cont[i]] = x;
 | |
| 						if(list != NULL)
 | |
| 							vec[i][cont[i]] = dop1[pos+wj];
 | |
| 						cont[i]++;
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	//cout << "despues sel" << endl;
 | |
| 
 | |
| 	for(x = 0; x < NUM_T; x++)
 | |
| 		size += cont[x];
 | |
| 	lres = (int *)malloc(size * sizeof(int));
 | |
| 	ptr = lres;
 | |
| 	for(x = 0; x < NUM_T; x++)
 | |
| 	{
 | |
| 		memmove(ptr, lis[x], cont[x] * sizeof(int));
 | |
| 		ptr += cont[x];
 | |
| 	}
 | |
| 	if(list != NULL)
 | |
| 	{
 | |
| 		fres = (int *)malloc(size * sizeof(int));
 | |
| 		ptr = fres;
 | |
| 		for(x = 0; x < NUM_T; x++)
 | |
| 		{
 | |
| 			memmove(ptr, vec[x], cont[x] * sizeof(int));
 | |
| 			ptr += cont[x];
 | |
| 		}
 | |
| 		*ret = fres;	
 | |
| 		*list = lres;
 | |
| 	}
 | |
| 	else
 | |
| 		*ret = lres;
 | |
| 	for(x = 0; x < NUM_T; x++)
 | |
| 	{
 | |
| 		free(lis[x]);
 | |
| 		free(vec[x]);
 | |
| 	}
 | |
| 	return size;
 | |
| }
 | |
| 
 | |
| int selectproyectcpu3(int *dop1, int rows, int cols, int *select, int numselect, int *selfjoin, int numselfj, int wj, int **ret, int **list)
 | |
| {
 | |
| 	int size = 0, pos, temp;
 | |
| 	int i, x, y, z, w;
 | |
| 	int *fres, *lres, *ptr;
 | |
| 	int div, fin, ini[NUM_T + 1];
 | |
| 	vector<int> vec[NUM_T];
 | |
| 	vector<int> lis[NUM_T];
 | |
| 
 | |
| 	for(x = 0; x < NUM_T; x++)
 | |
| 	{
 | |
| 		vec[x].reserve(INISIZE);
 | |
| 		lis[x].reserve(INISIZE);
 | |
| 	}
 | |
| 	
 | |
| 	//omp_set_num_threads(NUM_T);
 | |
| 	div = rows / NUM_T;
 | |
| 	ini[0] = 0;
 | |
| 	for(x = 1; x < NUM_T; x++)
 | |
| 		ini[x] = div * x;
 | |
| 	ini[NUM_T] = rows;
 | |
| 
 | |
| 	/*cout << "numselect = " << numselect << endl;
 | |
| 	for(x = 0; x < numselect; x++)
 | |
| 		cout << select[x] << " ";
 | |
| 	cout << endl;*/
 | |
| 
 | |
| 	if(numselect > 0)
 | |
| 	{	
 | |
| 		#pragma omp parallel for private(x,pos,y,z,fin,temp,w)
 | |
| 		for(i = 0; i < NUM_T; i++)
 | |
| 		{
 | |
| 			fin = ini[i+1];
 | |
| 			for(x = ini[i]; x < fin; x++)
 | |
| 			{
 | |
| 				pos = x * cols;
 | |
| 				for(y = 0; y < numselect; y += 2)
 | |
| 				{
 | |
| 					if(dop1[pos+select[y]] != select[y+1])
 | |
| 						break;
 | |
| 				}
 | |
| 				for(z = 0; z < numselfj; z++)
 | |
| 				{
 | |
| 					temp = dop1[pos+selfjoin[z]];
 | |
| 					w = z + 1;
 | |
| 					while(selfjoin[w] > -1)
 | |
| 					{
 | |
| 						if(temp != dop1[pos+selfjoin[w]])
 | |
| 							break;
 | |
| 						w++;
 | |
| 					}
 | |
| 					z = w;
 | |
| 					if(selfjoin[w] != -1)
 | |
| 						break;
 | |
| 				}
 | |
| 				if(y == numselect && z == numselfj)
 | |
| 				{
 | |
| 					lis[i].push_back(x);
 | |
| 					if(list != NULL)
 | |
| 						vec[i].push_back(dop1[pos+wj]);
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		if(numselfj > 0)
 | |
| 		{
 | |
| 			#pragma omp parallel for private(x,pos,y,z,fin,w,temp)
 | |
| 			for(i = 0; i < NUM_T; i++)
 | |
| 			{
 | |
| 				fin = ini[i+1];
 | |
| 				for(x = ini[i]; x < fin; x++)
 | |
| 				{
 | |
| 					pos = x * cols;
 | |
| 					for(z = 0; z < numselfj; z++)
 | |
| 					{
 | |
| 						temp = dop1[pos+selfjoin[z]];
 | |
| 						w = z + 1;
 | |
| 						while(selfjoin[w] > -1)
 | |
| 						{
 | |
| 							if(temp != dop1[pos+selfjoin[w]])
 | |
| 								break;
 | |
| 							w++;
 | |
| 						}
 | |
| 						z = w;
 | |
| 						if(selfjoin[w] != -1)
 | |
| 							break;
 | |
| 					}
 | |
| 					if(z == numselfj)
 | |
| 					{
 | |
| 						lis[i].push_back(x);
 | |
| 						if(list != NULL)
 | |
| 							vec[i].push_back(dop1[pos+wj]);
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	//cout << "despues sel" << endl;
 | |
| 
 | |
| 	for(x = 0; x < NUM_T; x++)
 | |
| 	{
 | |
| 		ini[x] = lis[x].size();
 | |
| 		size += ini[x];
 | |
| 	}
 | |
| 	lres = (int *)malloc(size * sizeof(int));
 | |
| 	ptr = lres;
 | |
| 	for(x = 0; x < NUM_T; x++)
 | |
| 	{
 | |
| 		memmove(ptr, lis[x].data(), ini[x] * sizeof(int));
 | |
| 		ptr += ini[x];
 | |
| 	}
 | |
| 	if(list != NULL)
 | |
| 	{
 | |
| 		fres = (int *)malloc(size * sizeof(int));
 | |
| 		ptr = fres;
 | |
| 		for(x = 0; x < NUM_T; x++)
 | |
| 		{
 | |
| 			memmove(ptr, vec[x].data(), ini[x] * sizeof(int));
 | |
| 			ptr += ini[x];
 | |
| 		}
 | |
| 		*ret = fres;	
 | |
| 		*list = lres;
 | |
| 	}
 | |
| 	else
 | |
| 		*ret = lres;
 | |
| 	return size;
 | |
| }
 |