Changeset: 1e2b5d3a6242 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1e2b5d3a6242 Modified Files: monetdb5/modules/mal/mosaic_prefix.c Branch: mosaic Log Message:
Layout diffs (truncated from 391 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 @@ -232,8 +232,9 @@ MOSestimate_prefix(Client cntxt, MOStask break; } w = v+1; - Prefix(bits, mask, val, val2, 32); + 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; @@ -245,125 +246,125 @@ MOSestimate_prefix(Client cntxt, MOStask factor = ( (flt)i * sizeof(int))/ store; } } - #ifdef _DEBUG_MOSAIC_ - mnstr_printf(cntxt->fdout,"#estimate rle "BUNFMT" elm %4.3f factor\n",i,factor); - #endif - return factor; - } +#ifdef _DEBUG_MOSAIC_ + mnstr_printf(cntxt->fdout,"#estimate rle "BUNFMT" elm %4.3f factor\n",i,factor); +#endif + return factor; +} - #define compress() \ - { 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);\ - }\ - } +#define compress() \ +{ 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);\ + }\ +} - 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; +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; - (void) cntxt; - MOSsetTag(blk, MOSAIC_PREFIX); + (void) cntxt; + MOSsetTag(blk, MOSAIC_PREFIX); - size = ATOMsize(task->type); - if( ATOMstorage(task->type == TYPE_str)) - size =task->b->T->width; - if( task->elm >=2 ) - switch(size){ - case 1: - { 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 m; + size = ATOMsize(task->type); + if( ATOMstorage(task->type == TYPE_str)) + size =task->b->T->width; + if( task->elm >=2 ) + switch(size){ + case 1: + { 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 m; - // search first non-identical value - for(i = 0;i < limit;i++, w++) - if( *v != *w ){ - val2 = *w; + // 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, 8); + rbits = 8-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 + 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); } - w = v+1; - Prefix(bits, mask, val, val2, 8); - rbits = 8-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 - 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); - } + } + MOSincCnt(blk,i); + task->src += i; + task->dst += (i * rbits)/8 + (i %8) != 0; + } + break; + case 2: + { 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 m; + + // 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, 16); + rbits = 16-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 + 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); } - MOSincCnt(blk,i); - task->src += i * sizeof(int); - task->dst += (i * rbits)/8 + (i %8) != 0; } - break; - case 2: - { 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 m; - - // 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, 16); - rbits = 16-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 - 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); - } - } - MOSincCnt(blk,i); - task->src += i * sizeof(int); - task->dst += (i * rbits)/8 + (i %8) != 0; - } - break; + 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); @@ -406,7 +407,7 @@ MOSestimate_prefix(Client cntxt, MOStask } } MOSincCnt(blk,i); - task->src += i * sizeof(int); + task->src += i * 4; task->dst += (i * rbits)/8 + (i %8) != 0; } break; @@ -452,7 +453,7 @@ MOSestimate_prefix(Client cntxt, MOStask } } MOSincCnt(blk,i); - task->src += i * sizeof(int); + task->src += i * 8 ; task->dst += (i * rbits)/8 + (i %8) != 0; } } @@ -465,7 +466,7 @@ MOSestimate_prefix(Client cntxt, MOStask { cell = (i * rbits)/32;\ lshift= 32 -((i * rbits) % 32) ;\ if ( lshift >rbits){\ - m1 = (base[cell] & (m <<(lshift-rbits)))>> (lshift-rbits);\ + m1 = (base[cell]>> (lshift-rbits)) & m;\ v = val | m1;\ }else{ \ rshift= 32 - ((i+1) * rbits) % 32;\ @@ -495,17 +496,17 @@ MOSdecompress_prefix(Client cntxt, MOSta bte mask = *dst++, val = *dst++, v; bte m,m1,m2; BUN lim= MOSgetCnt(blk); - rbits = val & (~mask); - for(m=1, i=1; i < (BUN) rbits; i++) - m= (m << 1) | 1; + + m = ~mask; + rbits = val & m; + val = val & mask; base = (unsigned int*) dst; - val = val & mask; //mnstr_printf(cntxt->fdout,"decompress rbits %d mask %o val %d\n",rbits,m,val); for(i = 0; i < lim; i++){ decompress(); ((int*)task->src)[i] = v; } - task->src += i * sizeof(int); + task->src += i; } break; case 2: _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list