Changeset: ed3146037fea for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ed3146037fea
Modified Files:
monetdb5/modules/mal/mosaic_prefix.c
Branch: mosaic
Log Message:
Fix 64 bits prefix
diffs (truncated from 315 to 300 lines):
diff --git a/monetdb5/modules/mal/mosaic_prefix.c
b/monetdb5/modules/mal/mosaic_prefix.c
--- a/monetdb5/modules/mal/mosaic_prefix.c
+++ b/monetdb5/modules/mal/mosaic_prefix.c
@@ -234,13 +234,12 @@ MOSestimate_prefix(Client cntxt, MOStask
w = v+1;
Prefix(bits, mask, val, val2, 64);
val = *v & mask;
- if( bits > 32) return 1.0;
for(i = 0; i < task->elm; w++, i++){
if ( val != (*w & mask) )
break;
}
if ( i > MOSlimit() ) i = MOSlimit();
- bits = i * (32 -bits);
+ bits = i * (64 -bits);
store = bits/8 + ((bits % 8) >0);
store = MosaicBlkSize + 2 * sizeof(int) + wordaligned(
store,int);
factor = ( (flt)i * sizeof(int))/ store;
@@ -252,13 +251,13 @@ MOSestimate_prefix(Client cntxt, MOStask
return factor;
}
-#define compress() \
-{ cell = (i * rbits)/32;\
- lshift= 32 -((i * rbits) % 32) ;\
+#define compress(Bits) \
+{ cell = (i * rbits)/Bits;\
+ lshift= Bits -((i * rbits) % Bits) ;\
if ( lshift > rbits){\
base[cell]= base[cell] | (m << (lshift-rbits));\
}else{ \
- rshift= 32 - ((i+1) * rbits) % 32;\
+ rshift= Bits - ((i+1) * rbits) % Bits;\
base[cell]= base[cell] | (m >> (rbits-lshift));\
base[cell+1]= 0 | (m << rshift);\
}\
@@ -268,8 +267,6 @@ void
MOScompress_prefix(Client cntxt, MOStask task)
{
BUN i ;
- unsigned int *base;
- unsigned int cell, bits, rbits, lshift, rshift;
int size;
MosaicBlk blk = task->blk;
@@ -285,6 +282,8 @@ MOScompress_prefix(Client cntxt, MOStask
{ bte *v = (bte*) task->src, *w= v+1, val = *v, val2 =
*w, mask;
bte *dst = (bte*) (((char*) blk) + MosaicBlkSize);
BUN limit = task->elm > MOSlimit()? MOSlimit():
task->elm;
+ unsigned int *base;
+ unsigned int cell, bits, rbits, lshift, rshift;
unsigned int m;
// search first non-identical value
@@ -304,19 +303,12 @@ MOScompress_prefix(Client cntxt, MOStask
*base = 0;
val = *v & mask; //reference value
+ if( i < limit)
for(w = v, i = 0; i < limit; w++, i++){
if ( val != (*w & mask) )
break;
m = (unsigned int)( *w & (~mask)); // residu
- cell = (i * rbits)/32;
- lshift= 32 -((i * rbits) % 32) ;
- if ( lshift > rbits){
- base[cell]= base[cell] | (m <<
(lshift-rbits));
- }else{
- rshift= 32 - ((i+1) * rbits) % 32;
- base[cell]= base[cell] | (m >>
(rbits-lshift));
- base[cell+1]= 0 | (m << rshift);
- }
+ compress(32);
}
MOSincCnt(blk,i);
task->src += i;
@@ -327,6 +319,8 @@ MOScompress_prefix(Client cntxt, MOStask
{ sht *v = (sht*) task->src, *w= v+1, val = *v, val2 =
*w, mask;
sht *dst = (sht*) (((char*) blk) + MosaicBlkSize);
BUN limit = task->elm > MOSlimit()? MOSlimit():
task->elm;
+ unsigned int *base;
+ unsigned int cell, bits, rbits, lshift, rshift;
unsigned int m;
// search first non-identical value
@@ -346,75 +340,24 @@ MOScompress_prefix(Client cntxt, MOStask
*base = 0;
val = *v & mask; //reference value
+ if( i < limit)
for(w = v, i = 0; i < limit; w++, i++){
if ( val != (*w & mask) )
break;
m = (unsigned int)( *w & (~mask)); // residu
- cell = (i * rbits)/32;
- lshift= 32 -((i * rbits) % 32) ;
- if ( lshift > rbits){
- base[cell]= base[cell] | (m <<
(lshift-rbits));
- }else{
- rshift= 32 - ((i+1) * rbits) % 32;
- base[cell]= base[cell] | (m >>
(rbits-lshift));
- base[cell+1]= 0 | (m << rshift);
- }
+ compress(32);
}
MOSincCnt(blk,i);
task->src += i * 2;
task->dst += (i * rbits)/8 + (i %8) != 0;
}
break;
- case 4:
- { unsigned int *v = (unsigned int*) task->src,
*w= v+1, val = *v, val2 = *w, mask, m;
- unsigned int *dst = (unsigned int*) (((char*)
blk) + MosaicBlkSize);
- BUN limit = task->elm > MOSlimit()? MOSlimit():
task->elm;
-
- // search first non-identical value
- for(i = 0;i < limit;i++, w++)
- if( *v != *w ){
- val2 = *w;
- break;
- }
- w = v+1;
- Prefix(bits, mask, val, val2, 32);
- rbits = 32-bits;
- *dst++ = mask;
- *dst = *v & mask;
- *dst = *dst | rbits; // bits outside mask
- dst++;
- base = (unsigned int*) dst; // start of bit
vector
- *base = 0;
-
- val = *v & mask; //reference value
- //mnstr_printf(cntxt->fdout,"compress %o %o val
%d bits %d, %d mask %o\n",*v,*w,val,bits, rbits,mask);
- for(w = v, i = 0; i < limit; w++, i++){
- if ( val != (*w & mask) )
- break;
- m = *w & (~mask); // residu
- //mnstr_printf(cntxt->fdout,"compress
%d residu %d %o\n",*w,m,m);
- cell = (i * rbits)/32;
- lshift= 32 -((i * rbits) % 32) ;
- if ( lshift > rbits){
- base[cell]= base[cell] | (m <<
(lshift-rbits));
-
//mnstr_printf(cntxt->fdout,"[%d] shift %d rbits %d cell %o\n",cell, lshift,
rbits, base[cell]);
- }else{
- rshift= 32 - ((i+1) * rbits) %
32;
- base[cell]= base[cell] | (m >>
(rbits-lshift));
- base[cell+1]= 0 | (m <<
rshift);
-
//mnstr_printf(cntxt->fdout,"[%d] shift %d %d cell %o %o val %o %o\n", cell,
lshift, rshift,
-
//base[cell],base[cell+1], (m >> (rbits-lshift)), (m <<rshift));
- }
- }
- MOSincCnt(blk,i);
- task->src += i * 4;
- task->dst += (i * rbits)/8 + (i %8) != 0;
- }
- break;
- case 8:
- { lng *v = (lng*) task->src, *w= v+1, val = *v, val2 =
*w, mask, m;
- lng *dst = (lng*) (((char*) blk) + MosaicBlkSize);
+ case 4:
+ { unsigned int *v = (unsigned int*) task->src, *w= v+1,
val = *v, val2 = *w, mask, m;
+ unsigned int *dst = (unsigned int*) (((char*) blk) +
MosaicBlkSize);
BUN limit = task->elm > MOSlimit()? MOSlimit():
task->elm;
+ unsigned int *base;
+ unsigned int cell, bits, rbits, lshift, rshift;
// search first non-identical value
for(i = 0;i < limit;i++, w++)
@@ -434,6 +377,7 @@ MOScompress_prefix(Client cntxt, MOStask
val = *v & mask; //reference value
//mnstr_printf(cntxt->fdout,"compress %o %o val %d bits
%d, %d mask %o\n",*v,*w,val,bits, rbits,mask);
+ if( i < limit)
for(w = v, i = 0; i < limit; w++, i++){
if ( val != (*w & mask) )
break;
@@ -453,6 +397,43 @@ MOScompress_prefix(Client cntxt, MOStask
}
}
MOSincCnt(blk,i);
+ task->src += i * 4;
+ task->dst += (i * rbits)/8 + (i %8) != 0;
+ }
+ break;
+ case 8:
+ { lng *v = (lng*) task->src, *w= v+1, val = *v, val2 =
*w, mask, m;
+ lng *dst = (lng*) (((char*) blk) + MosaicBlkSize);
+ BUN limit = task->elm > MOSlimit()? MOSlimit():
task->elm;
+ unsigned long *base;
+ unsigned long cell, bits, rbits, lshift, rshift;
+
+ // search first non-identical value
+ for(i = 0;i < limit;i++, w++)
+ if( *v != *w ){
+ val2 = *w;
+ break;
+ }
+ w = v+1;
+ Prefix(bits, mask, val, val2, 64);
+ rbits = 64-bits;
+ *dst++ = mask;
+ *dst = *v & mask;
+ *dst = *dst | rbits; // bits outside mask
+ dst++;
+ base = (unsigned long*) dst; // start of bit vector
+ *base = 0;
+
+ val = *v & mask; //reference value
+ //mnstr_printf(cntxt->fdout,"compress %o %o val %d bits
%d, %d mask %o\n",*v,*w,val,bits, rbits,mask);
+ if( i < limit)
+ for(w = v, i = 0; i < limit; w++, i++){
+ if ( val != (*w & mask) )
+ break;
+ m = *w & (~mask); // residu
+ compress(64);
+ }
+ MOSincCnt(blk,i);
task->src += i * 8 ;
task->dst += (i * rbits)/8 + (i %8) != 0;
}
@@ -462,14 +443,14 @@ MOScompress_prefix(Client cntxt, MOStask
#endif
}
-#define decompress()\
-{ cell = (i * rbits)/32;\
- lshift= 32 -((i * rbits) % 32) ;\
+#define decompress(Bits)\
+{ cell = (i * rbits)/Bits;\
+ lshift= Bits -((i * rbits) % Bits) ;\
if ( lshift >rbits){\
m1 = (base[cell]>> (lshift-rbits)) & m;\
v = val | m1;\
}else{ \
- rshift= 32 - ((i+1) * rbits) % 32;\
+ rshift= Bits - ((i+1) * rbits) % Bits;\
m1 =(base[cell] & (m >> (rbits-lshift)));\
m2 = base[cell+1] >>rshift;\
v= val | (m1 <<(rbits-lshift)) | m2;\
@@ -481,11 +462,8 @@ MOSdecompress_prefix(Client cntxt, MOSta
{
MosaicBlk blk = ((MosaicBlk) task->blk);
BUN i;
- unsigned int *base;
- unsigned int cell, rbits, lshift, rshift;
int size;
(void) cntxt;
- (void) rshift;
size = ATOMsize(task->type);
if( ATOMstorage(task->type == TYPE_str))
@@ -496,6 +474,8 @@ MOSdecompress_prefix(Client cntxt, MOSta
bte mask = *dst++, val = *dst++, v;
bte m,m1,m2;
BUN lim= MOSgetCnt(blk);
+ unsigned int *base;
+ unsigned int cell, rbits, lshift, rshift;
m = ~mask;
rbits = val & m;
@@ -503,7 +483,7 @@ MOSdecompress_prefix(Client cntxt, MOSta
base = (unsigned int*) dst;
//mnstr_printf(cntxt->fdout,"decompress rbits %d mask
%o val %d\n",rbits,m,val);
for(i = 0; i < lim; i++){
- decompress();
+ decompress(32);
((int*)task->src)[i] = v;
}
task->src += i;
@@ -514,6 +494,8 @@ MOSdecompress_prefix(Client cntxt, MOSta
sht mask = *dst++, val = *dst++, v;
sht m,m1,m2;
BUN lim= MOSgetCnt(blk);
+ unsigned int *base;
+ unsigned int cell, rbits, lshift, rshift;
m = ~mask;
rbits = val & m;
@@ -521,7 +503,7 @@ MOSdecompress_prefix(Client cntxt, MOSta
base = (unsigned int*) dst;
//mnstr_printf(cntxt->fdout,"decompress rbits %d mask
%o val %d\n",rbits,m,val);
for(i = 0; i < lim; i++){
- decompress();
+ decompress(32);
((int*)task->src)[i] = v;
}
task->src += i * 2;
@@ -532,6 +514,8 @@ MOSdecompress_prefix(Client cntxt, MOSta
unsigned int mask = *dst++, val = *dst++, v;
unsigned int m,m1,m2;
BUN lim= MOSgetCnt(blk);
+ unsigned int *base;
+ unsigned int cell, rbits, lshift, rshift;
m = ~mask;
rbits = val & m;
@@ -562,14 +546,16 @@ MOSdecompress_prefix(Client cntxt, MOSta
lng mask = *dst++, val = *dst++, v;
lng m,m1,m2;
BUN lim= MOSgetCnt(blk);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list