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