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;
							 | 
						||
| 
								 | 
							
								}
							 |