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