89 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			89 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								#include "pred.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int bpredscpu(int *dop1, int rows, int *bin, int3 numpreds, int **ret)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									int i, x, y, op1, op2;
							 | 
						||
| 
								 | 
							
									int size = 0, rowact, flag = 0;
							 | 
						||
| 
								 | 
							
									int predn = numpreds.x * 3;
							 | 
						||
| 
								 | 
							
									int total = predn + numpreds.z;
							 | 
						||
| 
								 | 
							
									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;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									#pragma omp parallel for private(x,rowact,y,fin,op1,op2) firstprivate(flag,total)
							 | 
						||
| 
								 | 
							
									for(i = 0; i < NUM_T; i++)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										fin = ini[i+1];
							 | 
						||
| 
								 | 
							
										for(x = ini[i]; x < fin; x++)
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											rowact = x * numpreds.y;
							 | 
						||
| 
								 | 
							
											for(y = 0; y < predn; y += 3)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												op1 = bin[y+1];
							 | 
						||
| 
								 | 
							
												if(op1 < 0)
							 | 
						||
| 
								 | 
							
													op1 *= -1;
							 | 
						||
| 
								 | 
							
												else
							 | 
						||
| 
								 | 
							
													op1 = dop1[rowact + op1];
							 | 
						||
| 
								 | 
							
												op2 = bin[y+2];
							 | 
						||
| 
								 | 
							
												if(op2 < 0)
							 | 
						||
| 
								 | 
							
													op2 *= -1;
							 | 
						||
| 
								 | 
							
												else
							 | 
						||
| 
								 | 
							
													op2 = dop1[rowact + op2];
							 | 
						||
| 
								 | 
							
												switch(bin[y])
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													case SBG_EQ: if(op1 != op2)
							 | 
						||
| 
								 | 
							
															flag = 1;
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
													case SBG_GT: if(op1 <= op2)
							 | 
						||
| 
								 | 
							
															flag = 1;
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
													case SBG_LT: if(op1 >= op2)
							 | 
						||
| 
								 | 
							
															flag = 1;
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
													case SBG_GE: if(op1 < op2)
							 | 
						||
| 
								 | 
							
															flag = 1;
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
													case SBG_LE: if(op1 > op2)
							 | 
						||
| 
								 | 
							
															flag = 1;
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
													case SBG_DF: if(op1 == op2)
							 | 
						||
| 
								 | 
							
															flag = 1;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												if(flag)
							 | 
						||
| 
								 | 
							
													break;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											if(flag != 1)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												for(y = predn; y < total; y++)
							 | 
						||
| 
								 | 
							
													vec[i].push_back(dop1[rowact+bin[y]]);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											else
							 | 
						||
| 
								 | 
							
												flag = 0;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									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++)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										memcpy(ptr, vec[x].data(), ini[x] * sizeof(int));
							 | 
						||
| 
								 | 
							
										ptr += ini[x];
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									*ret = fres;
							 | 
						||
| 
								 | 
							
									return size / numpreds.z;
							 | 
						||
| 
								 | 
							
								}
							 |