int main(int argc, char** argv) { auto lib = Omega_h::Library(&argc, &argv); auto world = lib.world(); if (argc != 4) { if (!world->rank()) { std::cout << "usage: " << argv[0] << " in.osh <nparts> out.osh\n"; } return -1; } auto nparts_total = world->size(); auto path_in = argv[1]; auto nparts_out = atoi(argv[2]); auto path_out = argv[3]; auto t0 = Omega_h::now(); if (nparts_out < 1) { if (!world->rank()) { std::cout << "error: invalid output part count " << nparts_out << '\n'; } return -1; } if (nparts_out > nparts_total) { if (!world->rank()) { std::cout << "error: output part count " << nparts_out << " greater than MPI job size " << nparts_total << '\n'; } return -1; } auto nparts_in = Omega_h::binary::read_nparts(path_in); if (nparts_in > nparts_total) { if (!world->rank()) { std::cout << "error: input part count " << nparts_in << " greater than MPI job size " << nparts_total << '\n'; } return -1; } auto is_in = (world->rank() < nparts_in); auto comm_in = world->split(int(is_in), 0); auto is_out = (world->rank() < nparts_out); auto comm_out = world->split(int(is_out), 0); auto mesh = Omega_h::Mesh(&lib); if (is_in) { Omega_h::binary::read_in_comm(path_in, comm_in, &mesh); if (nparts_out < nparts_in) { Omega_h_fail( "partitioning to a smaller part count not yet implemented\n"); } } if (is_in || is_out) mesh.set_comm(comm_out); if (is_out) { if (nparts_out != nparts_in) mesh.balance(); Omega_h::binary::write(path_out, &mesh); } world->barrier(); auto t1 = Omega_h::now(); auto imb = mesh.imbalance(); if (!world->rank()) { std::cout << "repartitioning took " << (t1 - t0) << " seconds\n"; std::cout << "imbalance is " << imb << "\n"; } }
void DSPEngine::work() { SampleFifo* sampleFifo = m_sampleSource->getSampleFifo(); size_t samplesDone = 0; bool positiveOnly = false; while((sampleFifo->fill() > 0) && (m_messageQueue.countPending() == 0) && (samplesDone < m_sampleRate)) { SampleVector::iterator part1begin; SampleVector::iterator part1end; SampleVector::iterator part2begin; SampleVector::iterator part2end; size_t count = sampleFifo->readBegin(sampleFifo->fill(), &part1begin, &part1end, &part2begin, &part2end); // first part of FIFO data if(part1begin != part1end) { // correct stuff if(m_dcOffsetCorrection) dcOffset(part1begin, part1end); if(m_iqImbalanceCorrection) imbalance(part1begin, part1end); // feed data to handlers for(SampleSinks::const_iterator it = m_sampleSinks.begin(); it != m_sampleSinks.end(); it++) (*it)->feed(part1begin, part1end, positiveOnly); } // second part of FIFO data (used when block wraps around) if(part2begin != part2end) { // correct stuff if(m_dcOffsetCorrection) dcOffset(part2begin, part2end); if(m_iqImbalanceCorrection) imbalance(part2begin, part2end); // feed data to handlers for(SampleSinks::const_iterator it = m_sampleSinks.begin(); it != m_sampleSinks.end(); it++) (*it)->feed(part2begin, part2end, positiveOnly); } // adjust FIFO pointers sampleFifo->readCommit(count); samplesDone += count; } }