69 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include <thrust/unique.h>
 | 
						|
#include <thrust/distance.h>
 | 
						|
#include <thrust/system/omp/execution_policy.h>
 | 
						|
#include <iostream>
 | 
						|
#include "union2.h"
 | 
						|
 | 
						|
int unircpu(int *res, int rows, int tipo, int **ret)
 | 
						|
{
 | 
						|
 | 
						|
	//cout << "En union = " << rows << " " << tipo << endl;
 | 
						|
 | 
						|
	s2 *t2, *re2;
 | 
						|
	s3 *t3, *re3;
 | 
						|
	int nrows, *nres;
 | 
						|
	//int size;
 | 
						|
 | 
						|
	switch(tipo)
 | 
						|
	{
 | 
						|
		case 1: 
 | 
						|
		{
 | 
						|
			thrust::sort(thrust::omp::par, res, res + rows);
 | 
						|
			nres = thrust::unique(thrust::omp::par, res, res + rows);
 | 
						|
			nrows = thrust::distance(res, nres);
 | 
						|
			/*if(nrows < rows / 2)
 | 
						|
			{
 | 
						|
				size = nrows * tipo * sizeof(int);
 | 
						|
				nres = (int *)malloc(size);
 | 
						|
				memcpy(nres, res, size);
 | 
						|
				free(*ret);
 | 
						|
				*ret = nres;
 | 
						|
			}*/
 | 
						|
			return nrows;	
 | 
						|
		}			
 | 
						|
		case 2: 
 | 
						|
		{
 | 
						|
			t2 = (s2*)res;
 | 
						|
			thrust::sort(thrust::omp::par, t2, t2 + rows, o2());
 | 
						|
			re2 = thrust::unique(thrust::omp::par, t2, t2 + rows, p2());
 | 
						|
			nrows = thrust::distance(t2, re2);
 | 
						|
			/*if(nrows < rows / 2)
 | 
						|
			{
 | 
						|
				size = nrows * tipo * sizeof(int);
 | 
						|
				nres = (int *)malloc(size);
 | 
						|
				memcpy(nres, res, size);
 | 
						|
				free(*ret);
 | 
						|
				*ret = nres;
 | 
						|
			}*/
 | 
						|
			return nrows;
 | 
						|
		}
 | 
						|
		case 3: 
 | 
						|
		{
 | 
						|
			t3 = (s3*)res;
 | 
						|
			thrust::sort(thrust::omp::par, t3, t3 + rows, o3());
 | 
						|
			re3 = thrust::unique(thrust::omp::par, t3, t3 + rows, p3());
 | 
						|
			nrows = thrust::distance(t3, re3);
 | 
						|
			/*if(nrows < rows / 2)
 | 
						|
			{
 | 
						|
				size = nrows * tipo * sizeof(int);
 | 
						|
				nres = (int *)malloc(size);
 | 
						|
				memcpy(nres, res, size);
 | 
						|
				free(*ret);
 | 
						|
				*ret = nres;
 | 
						|
			}*/
 | 
						|
			return nrows;
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return 0;
 | 
						|
}
 |