WriteTable* StoreCopy::simdprobeCursor(PageCursor* t, int threadid, WriteTable* ret) { if (ret == NULL) { ret = new WriteTable(); ret->init(sout, outputsize); } char tmp[sout->getTupleSize()]; void* tup1; void* tup2; Page* b2; unsigned int curbuc, i; HashTable::Iterator it = hashtable.createIterator(); while (b2 = (atomic ? t->atomicReadNext() : t->readNext())) { i = 0; while (tup2 = b2->getTupleOffset(i++)) { curbuc = _hashfn->hash(s2->asLong(tup2, ja2)); hashtable.placeIterator(it, curbuc); while (tup1 = it.readnext()) { if (sbuild->asLong(tup1,0) != s2->asLong(tup2,ja2) ) { continue; } #if defined(OUTPUT_ASSEMBLE) // copy payload of first tuple to destination if (s1->getTupleSize()) s1->copyTuple(tmp, sbuild->calcOffset(tup1,1)); // copy each column to destination for (unsigned int j=0; j<sel2.size(); ++j) sout->writeData(tmp, // dest s1->columns()+j, // col in output s2->calcOffset(tup2, sel2[j])); // src for this col #if defined(OUTPUT_WRITE_NORMAL) ret->append(tmp); #endif #endif } } } return ret; }
WriteTable* StoreCopy::realprobeCursor(PageCursor* t, int threadid, WriteTable* ret) { if (ret == NULL) { ret = new WriteTable(); ret->init(sout, outputsize); } char tmp[sout->getTupleSize()]; void* tup1; void* tup2; Page* b2; unsigned int curbuc, i; HashTable::Iterator it = hashtable.createIterator(); t->reset(); // added by yipeng to produce output in 1 thread while (b2 = (atomic ? t->atomicReadNext() : t->readNext())) { #ifdef VERBOSE cout << "Working on page " << b2 << endl; cout << "Thread " << threadid << endl; #endif i = 0; while (tup2 = b2->getTupleOffset(i++)) { #ifdef VERBOSE cout << "Joining tuple " << b2 << ":" << setfill('0') << setw(6) << i << " having key " << s2->asLong(tup2, ja2) << endl; #endif curbuc = _hashfn->hash(s2->asLong(tup2, ja2)); #ifdef VERBOSE cout << "\twith bucket " << setfill('0') << setw(6) << curbuc << endl; #endif hashtable.placeIterator(it, curbuc); #ifdef PREFETCH #warning Only works for 16-byte tuples! hashtable.prefetch(_hashfn->hash( *(unsigned long long*)(((char*)tup2)+32) )); hashtable.prefetch(_hashfn->hash( *(unsigned long long*)(((char*)tup2)+64) )); #endif while (tup1 = it.readnext()) { if (sbuild->asLong(tup1,0) != s2->asLong(tup2,ja2) ) { continue; } // copy payload of first tuple to destination if (s1->getTupleSize()) s1->copyTuple(tmp, sbuild->calcOffset(tup1,1)); // copy each column to destination for (unsigned int j=0; j<sel2.size(); ++j) sout->writeData(tmp, // dest s1->columns()+j, // col in output s2->calcOffset(tup2, sel2[j])); // src for this col ret->append(tmp); #ifdef OUTPUT_WRITE_NT ret->nontemporalappend16(tmp); #endif #if defined(OUTPUT_AGGREGATE) aggregator[ (threadid * AGGLEN) + + (sbuild->asLong(tup1,0) & (AGGLEN-1)) ]++; #endif #if !defined(OUTPUT_AGGREGATE) && !defined(OUTPUT_ASSEMBLE) __asm__ __volatile__ ("nop"); #endif } } } return ret; }
WriteTable* StorePointer::realprobeCursor(PageCursor* t, int threadid, WriteTable* ret) { if (ret == NULL) { ret = new WriteTable(); ret->init(sout, outputsize); } char tmp[sout->getTupleSize()]; void* tup1; void* tup2; Page* b2; unsigned int curbuc, i; HashTable::Iterator it = hashtable.createIterator(); while (b2 = (atomic ? t->atomicReadNext() : t->readNext())) { i = 0; while (tup2 = b2->getTupleOffset(i++)) { curbuc = _hashfn->hash(s2->asLong(tup2, ja2)); hashtable.placeIterator(it, curbuc); // need to change to int #ifdef PREFETCH #warning Only works for 16-byte tuples! hashtable.prefetch(_hashfn->hash( *(unsigned long long*)(((char*)tup2)+32) )); hashtable.prefetch(_hashfn->hash( *(unsigned long long*)(((char*)tup2)+64) )); #endif while (tup1 = it.readnext()) { if (sbuild->asLong(tup1,0) != s2->asLong(tup2,ja2) ) { continue; } #if defined(OUTPUT_ASSEMBLE) void* realtup1 = sbuild->asPointer(tup1, 1); // copy each column to destination for (unsigned int j=0; j<sel1.size(); ++j) sout->writeData(tmp, // dest j, // col in output s1->calcOffset(realtup1, sel1[j])); // src for this col for (unsigned int j=0; j<sel2.size(); ++j) sout->writeData(tmp, // dest sel1.size()+j, // col in output s2->calcOffset(tup2, sel2[j])); // src for this col #if defined(OUTPUT_WRITE_NORMAL) ret->append(tmp); #elif defined(OUTPUT_WRITE_NT) ret->nontemporalappend16(tmp); #endif #endif #if defined(OUTPUT_AGGREGATE) aggregator[ (threadid * AGGLEN) + + (sbuild->asLong(tup1,0) & (AGGLEN-1)) ]++; #endif #if !defined(OUTPUT_AGGREGATE) && !defined(OUTPUT_ASSEMBLE) __asm__ __volatile__ ("nop"); #endif } } } return ret; }