Example #1
0
int main(int argc, char* argv[]){
    arg_t arg;
    parse_arg(arg, argc, argv);
    
    std::cout << "[INFO ] Creating column ..." << std::endl;
    Column* column = new Column(arg.coltype, arg.nbits, arg.size);
    std::cout << "[INFO ] Creating bit vector ..." << std::endl;
    BitVector* bitvector = new BitVector(column);
    
    std::cout << "[INFO ] Populating column with random values ..." << std::endl;
    auto dice = std::bind(std::uniform_int_distribution<WordUnit>(
                            std::numeric_limits<WordUnit>::min(),
                            std::numeric_limits<WordUnit>::max()),
                            std::default_random_engine(std::time(0)));
    WordUnit mask = (1ULL << arg.nbits) - 1;
    for(size_t i=0; i < arg.size; i++){
        column->SetTuple(i, dice() & mask);
    }
    
    std::cout << "[INFO ] omp_max_threads = " << omp_get_max_threads() << std::endl;
    std::cout << "[INFO ] Executing scan ..." << std::endl;
    HybridTimer t1;
    t1.Start();
    for(size_t r = 0; r < arg.repeat; r++){
        column->Scan(Comparator::kLess,
                    static_cast<WordUnit>(mask*arg.selectivity),
                    bitvector,
                    Bitwise::kSet);
    }
    t1.Stop();
    
    std::cout << "Wall time (sec), CPU cost (cycle/value)" << std::endl;
    std::cout << t1.GetSeconds()/arg.repeat << ", "
                << double(t1.GetNumCycles()/arg.repeat)/arg.size
                << std::endl;
                
    std::cout << "[INFO ] Releasing memory ..." << std::endl;
    delete column;
    delete bitvector;
}