511{
513
515
516 for (auto o : overlapsToProcess)
517 {
518 auto stillValid = std::get<3>(o);
520 }
521
522 struct ThreadData {
523 RowsVector rowsVector;
524 MemoryBlock* memoryBlock;
525 };
526
527 mtbb::enumerable_thread_specific<ThreadData> threadData([&](){
528 mtbb::queuing_mutex::scoped_lock myColumnLock(
mColumnMutex);
529 ThreadData data;
530 data.memoryBlock = new MemoryBlock;
532 return data;
533 });
534
535
536
537
538
541 {
542 auto& data = threadData.local();
543 processPreRow(prerow,
544 data.rowsVector,
545 *data.memoryBlock,
546 &feeder);
547 });
548
549
550 for (const auto& data : threadData)
551 {
552 mRows.reserve(
mRows.size() + data.rowsVector.size());
553 std::move(data.rowsVector.begin(),
554 data.rowsVector.end(),
555 std::back_inserter(
mRows));
556 }
557
558
559
560
561
563
564
567
568
569
570
571 for (
int i=numReducersAtFirst ; i <
mReducersTodo.size(); ++i)
573
574
577 {
580 }
581}
mtbb::feeder< PreRow > PreRowFeeder
mtbb::queuing_mutex mColumnMutex
std::vector< MemoryBlock * > mMemoryBlocks
std::vector< PreRow > mOverlapsTodo
void processPreRow(PreRow r, RowsVector &rowsVector, MemoryBlock &memoryBlock, PreRowFeeder *feeder)
MonomialHash mColumnMonomials
void preRowsFromOverlap(const Overlap &o)
std::vector< PreRow > mReducersTodo
MonomialHash mPreviousColumnMonomials
const mpreal ceil(const mpreal &v)
const mpreal log2(const mpreal &x, mp_rnd_t r=mpreal::get_default_rnd())
const mpreal pow(const mpreal &a, const unsigned int b, mp_rnd_t rnd_mode=mpreal::get_default_rnd())
Symbolic description of one row before it is materialised in the matrix: a left * (something) * right...