764 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			764 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								/*Computer generated file to remove duplicates. Since Thrust's unique and sort, unlike their std's counterparts, don't have a way to specify the size of each element in
							 | 
						||
| 
								 | 
							
								the array, comparing pairs, triplets and other sets is not possible without defining a new pointer and all related operations for each set. If you have a better idea to do
							 | 
						||
| 
								 | 
							
								this, please don't hesitate to email us.*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <thrust/device_vector.h>
							 | 
						||
| 
								 | 
							
								#include <thrust/unique.h>
							 | 
						||
| 
								 | 
							
								#include <thrust/distance.h>
							 | 
						||
| 
								 | 
							
								#include <thrust/sort.h>
							 | 
						||
| 
								 | 
							
								#include <iostream>
							 | 
						||
| 
								 | 
							
								#include "memory.h"
							 | 
						||
| 
								 | 
							
								#include "union2.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int unir(int *res, int rows, int tipo, int **ret, int final)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									thrust::device_ptr<int> pt, re;
							 | 
						||
| 
								 | 
							
									thrust::device_ptr<s2> pt2, re2;
							 | 
						||
| 
								 | 
							
									thrust::device_ptr<s3> pt3, re3;
							 | 
						||
| 
								 | 
							
									thrust::device_ptr<s4> pt4, re4;
							 | 
						||
| 
								 | 
							
									thrust::device_ptr<s5> pt5, re5;
							 | 
						||
| 
								 | 
							
									thrust::device_ptr<s6> pt6, re6;
							 | 
						||
| 
								 | 
							
									thrust::device_ptr<s7> pt7, re7;
							 | 
						||
| 
								 | 
							
									thrust::device_ptr<s8> pt8, re8;
							 | 
						||
| 
								 | 
							
									thrust::device_ptr<s9> pt9, re9;
							 | 
						||
| 
								 | 
							
									thrust::device_ptr<s10> pt10, re10;
							 | 
						||
| 
								 | 
							
									thrust::device_ptr<s11> pt11, re11;
							 | 
						||
| 
								 | 
							
									thrust::device_ptr<s12> pt12, re12;
							 | 
						||
| 
								 | 
							
									thrust::device_ptr<s13> pt13, re13;
							 | 
						||
| 
								 | 
							
									thrust::device_ptr<s14> pt14, re14;
							 | 
						||
| 
								 | 
							
									thrust::device_ptr<s15> pt15, re15;
							 | 
						||
| 
								 | 
							
									thrust::device_ptr<s16> pt16, re16;
							 | 
						||
| 
								 | 
							
									thrust::device_ptr<s17> pt17, re17;
							 | 
						||
| 
								 | 
							
									thrust::device_ptr<s18> pt18, re18;
							 | 
						||
| 
								 | 
							
									thrust::device_ptr<s19> pt19, re19;
							 | 
						||
| 
								 | 
							
									thrust::device_ptr<s20> pt20, re20;
							 | 
						||
| 
								 | 
							
									s2 *t2;
							 | 
						||
| 
								 | 
							
									s3 *t3;
							 | 
						||
| 
								 | 
							
									s4 *t4;
							 | 
						||
| 
								 | 
							
									s5 *t5;
							 | 
						||
| 
								 | 
							
									s6 *t6;
							 | 
						||
| 
								 | 
							
									s7 *t7;
							 | 
						||
| 
								 | 
							
									s8 *t8;
							 | 
						||
| 
								 | 
							
									s9 *t9;
							 | 
						||
| 
								 | 
							
									s10 *t10;
							 | 
						||
| 
								 | 
							
									s11 *t11;
							 | 
						||
| 
								 | 
							
									s12 *t12;
							 | 
						||
| 
								 | 
							
									s13 *t13;
							 | 
						||
| 
								 | 
							
									s14 *t14;
							 | 
						||
| 
								 | 
							
									s15 *t15;
							 | 
						||
| 
								 | 
							
									s16 *t16;
							 | 
						||
| 
								 | 
							
									s17 *t17;
							 | 
						||
| 
								 | 
							
									s18 *t18;
							 | 
						||
| 
								 | 
							
									s19 *t19;
							 | 
						||
| 
								 | 
							
									s20 *t20;
							 | 
						||
| 
								 | 
							
									int flag, nrows, *nres, size;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if TIMER
							 | 
						||
| 
								 | 
							
									cuda_stats.unions++;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									switch(tipo)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										case 1:
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											pt = thrust::device_pointer_cast(res);
							 | 
						||
| 
								 | 
							
											flag = 0;
							 | 
						||
| 
								 | 
							
											while(flag != 1)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												try
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													thrust::sort(pt, pt + rows);
							 | 
						||
| 
								 | 
							
													if(final)
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														re = thrust::unique(pt, pt + rows, q1());
							 | 
						||
| 
								 | 
							
														re = thrust::unique(pt, re);
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													else
							 | 
						||
| 
								 | 
							
														re = thrust::unique(pt, pt + rows);
							 | 
						||
| 
								 | 
							
													flag = 1;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												catch(std::bad_alloc &e)
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													limpiar("sort/unique in unir", 0);
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											nrows = thrust::distance(pt, re);
							 | 
						||
| 
								 | 
							
											if(nrows < rows / 2)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												size = nrows * tipo * sizeof(int);
							 | 
						||
| 
								 | 
							
												reservar(&nres, size);
							 | 
						||
| 
								 | 
							
												cudaMemcpyAsync(nres, res, size, cudaMemcpyDeviceToDevice);
							 | 
						||
| 
								 | 
							
												cudaFree(*ret);
							 | 
						||
| 
								 | 
							
												*ret = nres;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											return nrows;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										case 2:
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											t2 = (s2*)res;
							 | 
						||
| 
								 | 
							
											pt2 = thrust::device_pointer_cast(t2);
							 | 
						||
| 
								 | 
							
											flag = 0;
							 | 
						||
| 
								 | 
							
											while(flag != 1)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												try
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													thrust::sort(pt2, pt2 + rows, o2());
							 | 
						||
| 
								 | 
							
													if(final)
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														re2 = thrust::unique(pt2, pt2 + rows, q2());
							 | 
						||
| 
								 | 
							
														re2 = thrust::unique(pt2, re2, p2());
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													else
							 | 
						||
| 
								 | 
							
														re2 = thrust::unique(pt2, pt2 + rows, p2());
							 | 
						||
| 
								 | 
							
													flag = 1;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												catch(std::bad_alloc &e)
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													limpiar("sort/unique in unir", 0);
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											nrows = thrust::distance(pt2, re2);
							 | 
						||
| 
								 | 
							
											if(nrows < rows / 2)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												size = nrows * tipo * sizeof(int);
							 | 
						||
| 
								 | 
							
												reservar(&nres, size);
							 | 
						||
| 
								 | 
							
												cudaMemcpyAsync(nres, res, size, cudaMemcpyDeviceToDevice);
							 | 
						||
| 
								 | 
							
												cudaFree(*ret);
							 | 
						||
| 
								 | 
							
												*ret = nres;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											return nrows;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										case 3:
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											t3 = (s3*)res;
							 | 
						||
| 
								 | 
							
											pt3 = thrust::device_pointer_cast(t3);
							 | 
						||
| 
								 | 
							
											flag = 0;
							 | 
						||
| 
								 | 
							
											while(flag != 1)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												try
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													thrust::sort(pt3, pt3 + rows, o3());
							 | 
						||
| 
								 | 
							
													if(final)
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														re3 = thrust::unique(pt3, pt3 + rows, q3());
							 | 
						||
| 
								 | 
							
														re3 = thrust::unique(pt3, re3, p3());
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													else
							 | 
						||
| 
								 | 
							
														re3 = thrust::unique(pt3, pt3 + rows, p3());
							 | 
						||
| 
								 | 
							
													flag = 1;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												catch(std::bad_alloc &e)
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													limpiar("sort/unique in unir", 0);
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											nrows = thrust::distance(pt3, re3);
							 | 
						||
| 
								 | 
							
											if(nrows < rows / 2)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												size = nrows * tipo * sizeof(int);
							 | 
						||
| 
								 | 
							
												reservar(&nres, size);
							 | 
						||
| 
								 | 
							
												cudaMemcpyAsync(nres, res, size, cudaMemcpyDeviceToDevice);
							 | 
						||
| 
								 | 
							
												cudaFree(*ret);
							 | 
						||
| 
								 | 
							
												*ret = nres;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											return nrows;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										case 4:
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											t4 = (s4*)res;
							 | 
						||
| 
								 | 
							
											pt4 = thrust::device_pointer_cast(t4);
							 | 
						||
| 
								 | 
							
											flag = 0;
							 | 
						||
| 
								 | 
							
											while(flag != 1)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												try
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													thrust::sort(pt4, pt4 + rows, o4());
							 | 
						||
| 
								 | 
							
													if(final)
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														re4 = thrust::unique(pt4, pt4 + rows, q4());
							 | 
						||
| 
								 | 
							
														re4 = thrust::unique(pt4, re4, p4());
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													else
							 | 
						||
| 
								 | 
							
														re4 = thrust::unique(pt4, pt4 + rows, p4());
							 | 
						||
| 
								 | 
							
													flag = 1;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												catch(std::bad_alloc &e)
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													limpiar("sort/unique in unir", 0);
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											nrows = thrust::distance(pt4, re4);
							 | 
						||
| 
								 | 
							
											if(nrows < rows / 2)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												size = nrows * tipo * sizeof(int);
							 | 
						||
| 
								 | 
							
												reservar(&nres, size);
							 | 
						||
| 
								 | 
							
												cudaMemcpyAsync(nres, res, size, cudaMemcpyDeviceToDevice);
							 | 
						||
| 
								 | 
							
												cudaFree(*ret);
							 | 
						||
| 
								 | 
							
												*ret = nres;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											return nrows;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										case 5:
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											t5 = (s5*)res;
							 | 
						||
| 
								 | 
							
											pt5 = thrust::device_pointer_cast(t5);
							 | 
						||
| 
								 | 
							
											flag = 0;
							 | 
						||
| 
								 | 
							
											while(flag != 1)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												try
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													thrust::sort(pt5, pt5 + rows, o5());
							 | 
						||
| 
								 | 
							
													if(final)
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														re5 = thrust::unique(pt5, pt5 + rows, q5());
							 | 
						||
| 
								 | 
							
														re5 = thrust::unique(pt5, re5, p5());
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													else
							 | 
						||
| 
								 | 
							
														re5 = thrust::unique(pt5, pt5 + rows, p5());
							 | 
						||
| 
								 | 
							
													flag = 1;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												catch(std::bad_alloc &e)
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													limpiar("sort/unique in unir", 0);
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											nrows = thrust::distance(pt5, re5);
							 | 
						||
| 
								 | 
							
											if(nrows < rows / 2)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												size = nrows * tipo * sizeof(int);
							 | 
						||
| 
								 | 
							
												reservar(&nres, size);
							 | 
						||
| 
								 | 
							
												cudaMemcpyAsync(nres, res, size, cudaMemcpyDeviceToDevice);
							 | 
						||
| 
								 | 
							
												cudaFree(*ret);
							 | 
						||
| 
								 | 
							
												*ret = nres;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											return nrows;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										case 6:
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											t6 = (s6*)res;
							 | 
						||
| 
								 | 
							
											pt6 = thrust::device_pointer_cast(t6);
							 | 
						||
| 
								 | 
							
											flag = 0;
							 | 
						||
| 
								 | 
							
											while(flag != 1)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												try
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													thrust::sort(pt6, pt6 + rows, o6());
							 | 
						||
| 
								 | 
							
													if(final)
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														re6 = thrust::unique(pt6, pt6 + rows, q6());
							 | 
						||
| 
								 | 
							
														re6 = thrust::unique(pt6, re6, p6());
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													else
							 | 
						||
| 
								 | 
							
														re6 = thrust::unique(pt6, pt6 + rows, p6());
							 | 
						||
| 
								 | 
							
													flag = 1;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												catch(std::bad_alloc &e)
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													limpiar("sort/unique in unir", 0);
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											nrows = thrust::distance(pt6, re6);
							 | 
						||
| 
								 | 
							
											if(nrows < rows / 2)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												size = nrows * tipo * sizeof(int);
							 | 
						||
| 
								 | 
							
												reservar(&nres, size);
							 | 
						||
| 
								 | 
							
												cudaMemcpyAsync(nres, res, size, cudaMemcpyDeviceToDevice);
							 | 
						||
| 
								 | 
							
												cudaFree(*ret);
							 | 
						||
| 
								 | 
							
												*ret = nres;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											return nrows;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										case 7:
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											t7 = (s7*)res;
							 | 
						||
| 
								 | 
							
											pt7 = thrust::device_pointer_cast(t7);
							 | 
						||
| 
								 | 
							
											flag = 0;
							 | 
						||
| 
								 | 
							
											while(flag != 1)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												try
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													thrust::sort(pt7, pt7 + rows, o7());
							 | 
						||
| 
								 | 
							
													if(final)
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														re7 = thrust::unique(pt7, pt7 + rows, q7());
							 | 
						||
| 
								 | 
							
														re7 = thrust::unique(pt7, re7, p7());
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													else
							 | 
						||
| 
								 | 
							
														re7 = thrust::unique(pt7, pt7 + rows, p7());
							 | 
						||
| 
								 | 
							
													flag = 1;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												catch(std::bad_alloc &e)
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													limpiar("sort/unique in unir", 0);
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											nrows = thrust::distance(pt7, re7);
							 | 
						||
| 
								 | 
							
											if(nrows < rows / 2)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												size = nrows * tipo * sizeof(int);
							 | 
						||
| 
								 | 
							
												reservar(&nres, size);
							 | 
						||
| 
								 | 
							
												cudaMemcpyAsync(nres, res, size, cudaMemcpyDeviceToDevice);
							 | 
						||
| 
								 | 
							
												cudaFree(*ret);
							 | 
						||
| 
								 | 
							
												*ret = nres;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											return nrows;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										case 8:
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											t8 = (s8*)res;
							 | 
						||
| 
								 | 
							
											pt8 = thrust::device_pointer_cast(t8);
							 | 
						||
| 
								 | 
							
											flag = 0;
							 | 
						||
| 
								 | 
							
											while(flag != 1)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												try
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													thrust::sort(pt8, pt8 + rows, o8());
							 | 
						||
| 
								 | 
							
													if(final)
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														re8 = thrust::unique(pt8, pt8 + rows, q8());
							 | 
						||
| 
								 | 
							
														re8 = thrust::unique(pt8, re8, p8());
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													else
							 | 
						||
| 
								 | 
							
														re8 = thrust::unique(pt8, pt8 + rows, p8());
							 | 
						||
| 
								 | 
							
													flag = 1;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												catch(std::bad_alloc &e)
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													limpiar("sort/unique in unir", 0);
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											nrows = thrust::distance(pt8, re8);
							 | 
						||
| 
								 | 
							
											if(nrows < rows / 2)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												size = nrows * tipo * sizeof(int);
							 | 
						||
| 
								 | 
							
												reservar(&nres, size);
							 | 
						||
| 
								 | 
							
												cudaMemcpyAsync(nres, res, size, cudaMemcpyDeviceToDevice);
							 | 
						||
| 
								 | 
							
												cudaFree(*ret);
							 | 
						||
| 
								 | 
							
												*ret = nres;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											return nrows;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										case 9:
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											t9 = (s9*)res;
							 | 
						||
| 
								 | 
							
											pt9 = thrust::device_pointer_cast(t9);
							 | 
						||
| 
								 | 
							
											flag = 0;
							 | 
						||
| 
								 | 
							
											while(flag != 1)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												try
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													thrust::sort(pt9, pt9 + rows, o9());
							 | 
						||
| 
								 | 
							
													if(final)
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														re9 = thrust::unique(pt9, pt9 + rows, q9());
							 | 
						||
| 
								 | 
							
														re9 = thrust::unique(pt9, re9, p9());
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													else
							 | 
						||
| 
								 | 
							
														re9 = thrust::unique(pt9, pt9 + rows, p9());
							 | 
						||
| 
								 | 
							
													flag = 1;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												catch(std::bad_alloc &e)
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													limpiar("sort/unique in unir", 0);
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											nrows = thrust::distance(pt9, re9);
							 | 
						||
| 
								 | 
							
											if(nrows < rows / 2)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												size = nrows * tipo * sizeof(int);
							 | 
						||
| 
								 | 
							
												reservar(&nres, size);
							 | 
						||
| 
								 | 
							
												cudaMemcpyAsync(nres, res, size, cudaMemcpyDeviceToDevice);
							 | 
						||
| 
								 | 
							
												cudaFree(*ret);
							 | 
						||
| 
								 | 
							
												*ret = nres;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											return nrows;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										case 10:
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											t10 = (s10*)res;
							 | 
						||
| 
								 | 
							
											pt10 = thrust::device_pointer_cast(t10);
							 | 
						||
| 
								 | 
							
											flag = 0;
							 | 
						||
| 
								 | 
							
											while(flag != 1)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												try
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													thrust::sort(pt10, pt10 + rows, o10());
							 | 
						||
| 
								 | 
							
													if(final)
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														re10 = thrust::unique(pt10, pt10 + rows, q10());
							 | 
						||
| 
								 | 
							
														re10 = thrust::unique(pt10, re10, p10());
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													else
							 | 
						||
| 
								 | 
							
														re10 = thrust::unique(pt10, pt10 + rows, p10());
							 | 
						||
| 
								 | 
							
													flag = 1;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												catch(std::bad_alloc &e)
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													limpiar("sort/unique in unir", 0);
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											nrows = thrust::distance(pt10, re10);
							 | 
						||
| 
								 | 
							
											if(nrows < rows / 2)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												size = nrows * tipo * sizeof(int);
							 | 
						||
| 
								 | 
							
												reservar(&nres, size);
							 | 
						||
| 
								 | 
							
												cudaMemcpyAsync(nres, res, size, cudaMemcpyDeviceToDevice);
							 | 
						||
| 
								 | 
							
												cudaFree(*ret);
							 | 
						||
| 
								 | 
							
												*ret = nres;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											return nrows;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										case 11:
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											t11 = (s11*)res;
							 | 
						||
| 
								 | 
							
											pt11 = thrust::device_pointer_cast(t11);
							 | 
						||
| 
								 | 
							
											flag = 0;
							 | 
						||
| 
								 | 
							
											while(flag != 1)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												try
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													thrust::sort(pt11, pt11 + rows, o11());
							 | 
						||
| 
								 | 
							
													if(final)
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														re11 = thrust::unique(pt11, pt11 + rows, q11());
							 | 
						||
| 
								 | 
							
														re11 = thrust::unique(pt11, re11, p11());
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													else
							 | 
						||
| 
								 | 
							
														re11 = thrust::unique(pt11, pt11 + rows, p11());
							 | 
						||
| 
								 | 
							
													flag = 1;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												catch(std::bad_alloc &e)
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													limpiar("sort/unique in unir", 0);
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											nrows = thrust::distance(pt11, re11);
							 | 
						||
| 
								 | 
							
											if(nrows < rows / 2)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												size = nrows * tipo * sizeof(int);
							 | 
						||
| 
								 | 
							
												reservar(&nres, size);
							 | 
						||
| 
								 | 
							
												cudaMemcpyAsync(nres, res, size, cudaMemcpyDeviceToDevice);
							 | 
						||
| 
								 | 
							
												cudaFree(*ret);
							 | 
						||
| 
								 | 
							
												*ret = nres;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											return nrows;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										case 12:
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											t12 = (s12*)res;
							 | 
						||
| 
								 | 
							
											pt12 = thrust::device_pointer_cast(t12);
							 | 
						||
| 
								 | 
							
											flag = 0;
							 | 
						||
| 
								 | 
							
											while(flag != 1)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												try
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													thrust::sort(pt12, pt12 + rows, o12());
							 | 
						||
| 
								 | 
							
													if(final)
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														re12 = thrust::unique(pt12, pt12 + rows, q12());
							 | 
						||
| 
								 | 
							
														re12 = thrust::unique(pt12, re12, p12());
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													else
							 | 
						||
| 
								 | 
							
														re12 = thrust::unique(pt12, pt12 + rows, p12());
							 | 
						||
| 
								 | 
							
													flag = 1;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												catch(std::bad_alloc &e)
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													limpiar("sort/unique in unir", 0);
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											nrows = thrust::distance(pt12, re12);
							 | 
						||
| 
								 | 
							
											if(nrows < rows / 2)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												size = nrows * tipo * sizeof(int);
							 | 
						||
| 
								 | 
							
												reservar(&nres, size);
							 | 
						||
| 
								 | 
							
												cudaMemcpyAsync(nres, res, size, cudaMemcpyDeviceToDevice);
							 | 
						||
| 
								 | 
							
												cudaFree(*ret);
							 | 
						||
| 
								 | 
							
												*ret = nres;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											return nrows;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										case 13:
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											t13 = (s13*)res;
							 | 
						||
| 
								 | 
							
											pt13 = thrust::device_pointer_cast(t13);
							 | 
						||
| 
								 | 
							
											flag = 0;
							 | 
						||
| 
								 | 
							
											while(flag != 1)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												try
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													thrust::sort(pt13, pt13 + rows, o13());
							 | 
						||
| 
								 | 
							
													if(final)
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														re13 = thrust::unique(pt13, pt13 + rows, q13());
							 | 
						||
| 
								 | 
							
														re13 = thrust::unique(pt13, re13, p13());
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													else
							 | 
						||
| 
								 | 
							
														re13 = thrust::unique(pt13, pt13 + rows, p13());
							 | 
						||
| 
								 | 
							
													flag = 1;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												catch(std::bad_alloc &e)
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													limpiar("sort/unique in unir", 0);
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											nrows = thrust::distance(pt13, re13);
							 | 
						||
| 
								 | 
							
											if(nrows < rows / 2)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												size = nrows * tipo * sizeof(int);
							 | 
						||
| 
								 | 
							
												reservar(&nres, size);
							 | 
						||
| 
								 | 
							
												cudaMemcpyAsync(nres, res, size, cudaMemcpyDeviceToDevice);
							 | 
						||
| 
								 | 
							
												cudaFree(*ret);
							 | 
						||
| 
								 | 
							
												*ret = nres;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											return nrows;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										case 14:
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											t14 = (s14*)res;
							 | 
						||
| 
								 | 
							
											pt14 = thrust::device_pointer_cast(t14);
							 | 
						||
| 
								 | 
							
											flag = 0;
							 | 
						||
| 
								 | 
							
											while(flag != 1)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												try
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													thrust::sort(pt14, pt14 + rows, o14());
							 | 
						||
| 
								 | 
							
													if(final)
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														re14 = thrust::unique(pt14, pt14 + rows, q14());
							 | 
						||
| 
								 | 
							
														re14 = thrust::unique(pt14, re14, p14());
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													else
							 | 
						||
| 
								 | 
							
														re14 = thrust::unique(pt14, pt14 + rows, p14());
							 | 
						||
| 
								 | 
							
													flag = 1;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												catch(std::bad_alloc &e)
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													limpiar("sort/unique in unir", 0);
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											nrows = thrust::distance(pt14, re14);
							 | 
						||
| 
								 | 
							
											if(nrows < rows / 2)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												size = nrows * tipo * sizeof(int);
							 | 
						||
| 
								 | 
							
												reservar(&nres, size);
							 | 
						||
| 
								 | 
							
												cudaMemcpyAsync(nres, res, size, cudaMemcpyDeviceToDevice);
							 | 
						||
| 
								 | 
							
												cudaFree(*ret);
							 | 
						||
| 
								 | 
							
												*ret = nres;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											return nrows;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										case 15:
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											t15 = (s15*)res;
							 | 
						||
| 
								 | 
							
											pt15 = thrust::device_pointer_cast(t15);
							 | 
						||
| 
								 | 
							
											flag = 0;
							 | 
						||
| 
								 | 
							
											while(flag != 1)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												try
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													thrust::sort(pt15, pt15 + rows, o15());
							 | 
						||
| 
								 | 
							
													if(final)
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														re15 = thrust::unique(pt15, pt15 + rows, q15());
							 | 
						||
| 
								 | 
							
														re15 = thrust::unique(pt15, re15, p15());
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													else
							 | 
						||
| 
								 | 
							
														re15 = thrust::unique(pt15, pt15 + rows, p15());
							 | 
						||
| 
								 | 
							
													flag = 1;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												catch(std::bad_alloc &e)
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													limpiar("sort/unique in unir", 0);
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											nrows = thrust::distance(pt15, re15);
							 | 
						||
| 
								 | 
							
											if(nrows < rows / 2)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												size = nrows * tipo * sizeof(int);
							 | 
						||
| 
								 | 
							
												reservar(&nres, size);
							 | 
						||
| 
								 | 
							
												cudaMemcpyAsync(nres, res, size, cudaMemcpyDeviceToDevice);
							 | 
						||
| 
								 | 
							
												cudaFree(*ret);
							 | 
						||
| 
								 | 
							
												*ret = nres;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											return nrows;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										case 16:
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											t16 = (s16*)res;
							 | 
						||
| 
								 | 
							
											pt16 = thrust::device_pointer_cast(t16);
							 | 
						||
| 
								 | 
							
											flag = 0;
							 | 
						||
| 
								 | 
							
											while(flag != 1)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												try
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													thrust::sort(pt16, pt16 + rows, o16());
							 | 
						||
| 
								 | 
							
													if(final)
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														re16 = thrust::unique(pt16, pt16 + rows, q16());
							 | 
						||
| 
								 | 
							
														re16 = thrust::unique(pt16, re16, p16());
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													else
							 | 
						||
| 
								 | 
							
														re16 = thrust::unique(pt16, pt16 + rows, p16());
							 | 
						||
| 
								 | 
							
													flag = 1;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												catch(std::bad_alloc &e)
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													limpiar("sort/unique in unir", 0);
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											nrows = thrust::distance(pt16, re16);
							 | 
						||
| 
								 | 
							
											if(nrows < rows / 2)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												size = nrows * tipo * sizeof(int);
							 | 
						||
| 
								 | 
							
												reservar(&nres, size);
							 | 
						||
| 
								 | 
							
												cudaMemcpyAsync(nres, res, size, cudaMemcpyDeviceToDevice);
							 | 
						||
| 
								 | 
							
												cudaFree(*ret);
							 | 
						||
| 
								 | 
							
												*ret = nres;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											return nrows;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										case 17:
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											t17 = (s17*)res;
							 | 
						||
| 
								 | 
							
											pt17 = thrust::device_pointer_cast(t17);
							 | 
						||
| 
								 | 
							
											flag = 0;
							 | 
						||
| 
								 | 
							
											while(flag != 1)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												try
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													thrust::sort(pt17, pt17 + rows, o17());
							 | 
						||
| 
								 | 
							
													if(final)
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														re17 = thrust::unique(pt17, pt17 + rows, q17());
							 | 
						||
| 
								 | 
							
														re17 = thrust::unique(pt17, re17, p17());
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													else
							 | 
						||
| 
								 | 
							
														re17 = thrust::unique(pt17, pt17 + rows, p17());
							 | 
						||
| 
								 | 
							
													flag = 1;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												catch(std::bad_alloc &e)
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													limpiar("sort/unique in unir", 0);
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											nrows = thrust::distance(pt17, re17);
							 | 
						||
| 
								 | 
							
											if(nrows < rows / 2)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												size = nrows * tipo * sizeof(int);
							 | 
						||
| 
								 | 
							
												reservar(&nres, size);
							 | 
						||
| 
								 | 
							
												cudaMemcpyAsync(nres, res, size, cudaMemcpyDeviceToDevice);
							 | 
						||
| 
								 | 
							
												cudaFree(*ret);
							 | 
						||
| 
								 | 
							
												*ret = nres;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											return nrows;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										case 18:
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											t18 = (s18*)res;
							 | 
						||
| 
								 | 
							
											pt18 = thrust::device_pointer_cast(t18);
							 | 
						||
| 
								 | 
							
											flag = 0;
							 | 
						||
| 
								 | 
							
											while(flag != 1)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												try
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													thrust::sort(pt18, pt18 + rows, o18());
							 | 
						||
| 
								 | 
							
													if(final)
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														re18 = thrust::unique(pt18, pt18 + rows, q18());
							 | 
						||
| 
								 | 
							
														re18 = thrust::unique(pt18, re18, p18());
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													else
							 | 
						||
| 
								 | 
							
														re18 = thrust::unique(pt18, pt18 + rows, p18());
							 | 
						||
| 
								 | 
							
													flag = 1;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												catch(std::bad_alloc &e)
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													limpiar("sort/unique in unir", 0);
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											nrows = thrust::distance(pt18, re18);
							 | 
						||
| 
								 | 
							
											if(nrows < rows / 2)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												size = nrows * tipo * sizeof(int);
							 | 
						||
| 
								 | 
							
												reservar(&nres, size);
							 | 
						||
| 
								 | 
							
												cudaMemcpyAsync(nres, res, size, cudaMemcpyDeviceToDevice);
							 | 
						||
| 
								 | 
							
												cudaFree(*ret);
							 | 
						||
| 
								 | 
							
												*ret = nres;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											return nrows;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										case 19:
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											t19 = (s19*)res;
							 | 
						||
| 
								 | 
							
											pt19 = thrust::device_pointer_cast(t19);
							 | 
						||
| 
								 | 
							
											flag = 0;
							 | 
						||
| 
								 | 
							
											while(flag != 1)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												try
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													thrust::sort(pt19, pt19 + rows, o19());
							 | 
						||
| 
								 | 
							
													if(final)
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														re19 = thrust::unique(pt19, pt19 + rows, q19());
							 | 
						||
| 
								 | 
							
														re19 = thrust::unique(pt19, re19, p19());
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													else
							 | 
						||
| 
								 | 
							
														re19 = thrust::unique(pt19, pt19 + rows, p19());
							 | 
						||
| 
								 | 
							
													flag = 1;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												catch(std::bad_alloc &e)
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													limpiar("sort/unique in unir", 0);
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											nrows = thrust::distance(pt19, re19);
							 | 
						||
| 
								 | 
							
											if(nrows < rows / 2)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												size = nrows * tipo * sizeof(int);
							 | 
						||
| 
								 | 
							
												reservar(&nres, size);
							 | 
						||
| 
								 | 
							
												cudaMemcpyAsync(nres, res, size, cudaMemcpyDeviceToDevice);
							 | 
						||
| 
								 | 
							
												cudaFree(*ret);
							 | 
						||
| 
								 | 
							
												*ret = nres;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											return nrows;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										case 20:
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											t20 = (s20*)res;
							 | 
						||
| 
								 | 
							
											pt20 = thrust::device_pointer_cast(t20);
							 | 
						||
| 
								 | 
							
											flag = 0;
							 | 
						||
| 
								 | 
							
											while(flag != 1)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												try
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													thrust::sort(pt20, pt20 + rows, o20());
							 | 
						||
| 
								 | 
							
													if(final)
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														re20 = thrust::unique(pt20, pt20 + rows, q20());
							 | 
						||
| 
								 | 
							
														re20 = thrust::unique(pt20, re20, p20());
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													else
							 | 
						||
| 
								 | 
							
														re20 = thrust::unique(pt20, pt20 + rows, p20());
							 | 
						||
| 
								 | 
							
													flag = 1;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												catch(std::bad_alloc &e)
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													limpiar("sort/unique in unir", 0);
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											nrows = thrust::distance(pt20, re20);
							 | 
						||
| 
								 | 
							
											if(nrows < rows / 2)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												size = nrows * tipo * sizeof(int);
							 | 
						||
| 
								 | 
							
												reservar(&nres, size);
							 | 
						||
| 
								 | 
							
												cudaMemcpyAsync(nres, res, size, cudaMemcpyDeviceToDevice);
							 | 
						||
| 
								 | 
							
												cudaFree(*ret);
							 | 
						||
| 
								 | 
							
												*ret = nres;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											return nrows;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return 0;
							 | 
						||
| 
								 | 
							
								}
							 |