int main(int argc, char *argv[]) { try { // command line info TCLAP::CmdLine cmd("Agros2D solver", ' ', versionString().toStdString()); TCLAP::SwitchArg logArg("l", "enable-log", "Enable log", false); TCLAP::SwitchArg remoteArg("r", "remote-server", "Run remote server", false); TCLAP::ValueArg<std::string> problemArg("p", "problem", "Solve problem", false, "", "string"); TCLAP::ValueArg<std::string> scriptArg("s", "script", "Solve script", false, "", "string"); TCLAP::ValueArg<std::string> testArg("t", "test", "Run tests", false, "list", "string"); cmd.add(logArg); cmd.add(remoteArg); cmd.add(problemArg); cmd.add(scriptArg); cmd.add(testArg); // parse the argv array. cmd.parse(argc, argv); CleanExit cleanExit; AgrosSolver a(argc, argv); // enable log a.setEnableLog(logArg.getValue()); // run remote server if (remoteArg.getValue()) { a.runRemoteServer(); return a.exec(); } if (!problemArg.getValue().empty()) { if (QFile::exists(QString::fromStdString(problemArg.getValue()))) { QFileInfo info(QString::fromStdString(problemArg.getValue())); if (info.suffix() == "a2d") { a.setFileName(QString::fromStdString(problemArg.getValue())); QTimer::singleShot(0, &a, SLOT(solveProblem())); return a.exec(); } else { std::cout << QObject::tr("Unknown suffix.").toStdString() << std::endl; return 1; } } } else if (!scriptArg.getValue().empty()) { if (QFile::exists(QString::fromStdString(scriptArg.getValue()))) { QFileInfo info(QString::fromStdString(scriptArg.getValue())); if (info.suffix() == "py") { a.setFileName(QString::fromStdString(scriptArg.getValue())); QTimer::singleShot(0, &a, SLOT(runScript())); return a.exec(); } else { std::cout << QObject::tr("Unknown suffix.").toStdString() << std::endl; return 1; } } } else if (!testArg.getValue().empty()) { if (QString::fromStdString(testArg.getValue()) == "list") { QTimer::singleShot(0, &a, SLOT(printTestSuites())); } else { a.setScriptSuite(QString::fromStdString(testArg.getValue())); QTimer::singleShot(0, &a, SLOT(runSuite())); } return a.exec(); } else { return 1; } } catch (TCLAP::ArgException &e) { std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; return 1; } }
int main( int argc, char **argv ) { if( !co::init( argc, argv )) return EXIT_FAILURE; co::ConnectionDescriptionPtr remote; size_t packetSize = 1048576u; // needs to be modulo 8 uint32_t nPackets = 0xFFFFFFFFu; uint32_t waitTime = 0; bool useZeroconf = true; bool useObjects = false; try // command line parsing { TCLAP::CmdLine command( "nodeperf - Collage node-to-node network benchmark tool", ' ', co::Version::getString( )); TCLAP::ValueArg< std::string > remoteArg( "c", "connect", "connect to remote node, implies --disableZeroconf", false, "", "IP[:port][:protocol]", command ); TCLAP::SwitchArg zcArg( "d", "disableZeroconf", "Disable automatic connect using zeroconf", command, false ); TCLAP::SwitchArg objectsArg( "o", "object", "Benchmark object-object instead of node-node communication", command, false ); TCLAP::ValueArg<size_t> sizeArg( "p", "packetSize", "packet size", false, packetSize, "unsigned", command ); TCLAP::ValueArg<size_t> packetsArg( "n", "numPackets", "number of packets to send", false, nPackets, "unsigned", command ); TCLAP::ValueArg<uint32_t> waitArg( "w", "wait", "wait time (ms) between sends", false, 0, "unsigned", command ); command.parse( argc, argv ); if( remoteArg.isSet( )) { remote = new co::ConnectionDescription; remote->port = 4242; remote->fromString( remoteArg.getValue( )); } useZeroconf = !zcArg.isSet(); useObjects = objectsArg.isSet(); if( sizeArg.isSet( )) packetSize = sizeArg.getValue(); if( packetsArg.isSet( )) nPackets = uint32_t( packetsArg.getValue( )); if( waitArg.isSet( )) waitTime = waitArg.getValue(); } catch( TCLAP::ArgException& exception ) { LBERROR << "Command line parse error: " << exception.error() << " for argument " << exception.argId() << std::endl; co::exit(); return EXIT_FAILURE; } // Set up local node co::LocalNodePtr localNode = new PerfNode; if( !localNode->initLocal( argc, argv )) { co::exit(); return EXIT_FAILURE; } localNode->getZeroconf().set( "coNodeperf", co::Version::getString( )); Object object; object.setID( _objectID + localNode->getNodeID( )); LBCHECK( localNode->registerObject( &object )); // run if( remote ) { co::NodePtr node = new PerfNodeProxy; node->addConnectionDescription( remote ); localNode->connect( node ); } else if( useZeroconf ) { co::Zeroconf zeroconf = localNode->getZeroconf(); const co::Strings& instances = localNode->getZeroconf().getInstances(); BOOST_FOREACH( const std::string& instance, instances ) { if( !zeroconf.get( instance, "coNodeperf" ).empty( )) localNode->connect( co::uint128_t( instance )); } } { lunchbox::ScopedFastRead _mutex( nodes_ ); if( nodes_->empty( )) // Add default listener so others can connect to me localNode->addListener( new co::ConnectionDescription ); } co::Nodes nodes; while( true ) { lunchbox::Thread::yield(); lunchbox::ScopedFastRead _mutex( nodes_ ); if( !nodes_->empty( )) break; } Buffer buffer; const size_t bufferElems = packetSize / sizeof( uint64_t ); buffer.resize( bufferElems ); for( size_t i = 0; i < bufferElems; ++i ) buffer[i] = i; const float mBytesSec = buffer.getNumBytes() / 1024.0f / 1024.0f * 1000.0f; lunchbox::Clock clock; size_t sentPackets = 0; clock.reset(); while( nPackets-- ) { { lunchbox::ScopedFastRead _mutex( nodes_ ); if( nodes != *nodes_ ) { for( co::NodesCIter i = nodes_->begin(); i != nodes_->end(); ++i) { co::NodePtr node = *i; co::NodesCIter j = stde::find( nodes, node ); if( j == nodes.end( )) { // new node, map perf object LBASSERT( node->getType() == 0xC0FFEEu ); PerfNodeProxyPtr peer = static_cast< PerfNodeProxy* >( node.get( )); LBCHECK( localNode->mapObject( &peer->object, _objectID + peer->getNodeID( ))); } } nodes = *nodes_; } } if( nodes.empty( )) break; for( co::NodesCIter i = nodes.begin(); i != nodes.end(); ++i ) { co::NodePtr node = *i; if( node->getType() != 0xC0FFEEu ) continue; if( useObjects ) { const size_t j = (object.getID().low() + nPackets) % bufferElems; buffer[ j ] = nPackets; object.send( node, co::CMD_OBJECT_CUSTOM ) << nPackets <<buffer; buffer[ j ] = 0xDEADBEEFu; } else { const size_t j = (node->getNodeID().low() + nPackets) % bufferElems; buffer[ j ] = nPackets; node->send( co::CMD_NODE_CUSTOM ) << nPackets << buffer; buffer[ j ] = 0xDEADBEEFu; } ++sentPackets; if( waitTime > 0 ) lunchbox::sleep( waitTime ); } const float time = clock.getTimef(); if( time > 1000.f ) { const lunchbox::ScopedMutex<> mutex( print_ ); std::cerr << "Send perf: " << mBytesSec / time * sentPackets << "MB/s (" << sentPackets / time * 1000.f << "pps)" << std::endl; sentPackets = 0; clock.reset(); } } const float time = clock.getTimef(); if( time > 1000.f ) { const lunchbox::ScopedMutex<> mutex( print_ ); std::cerr << "Send perf: " << mBytesSec / time * sentPackets << "MB/s (" << sentPackets / time * 1000.f << "pps)" << std::endl; sentPackets = 0; clock.reset(); } localNode->deregisterObject( &object ); LBCHECK( localNode->exitLocal( )); LBCHECK( co::exit( )); return EXIT_SUCCESS; }
int main(int argc, char *argv[]) { try { // command line info TCLAP::CmdLine cmd("Agros2D", ' ', versionString().toStdString()); TCLAP::SwitchArg remoteArg("r", "remote-server", "Run remote server", false); TCLAP::ValueArg<std::string> problemArg("p", "problem", "Open problem", false, "", "string"); TCLAP::ValueArg<std::string> scriptArg("s", "script", "Open script", false, "", "string"); TCLAP::SwitchArg executeArg("x", "execute", "Execute problem or script", false); cmd.add(remoteArg); cmd.add(problemArg); cmd.add(scriptArg); cmd.add(executeArg); // parse the argv array. cmd.parse(argc, argv); CleanExit cleanExit; AgrosApplication a(argc, argv); // setting gui style setGUIStyle(Agros2D::configComputer()->value(Config::Config_GUIStyle).toString()); // language setLocale(Agros2D::configComputer()->value(Config::Config_Locale).toString()); a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit())); // init indicator (ubuntu - unity, windows - overlay icon, macosx - ???) Indicator::init(); MainWindow w; // run remote server if (remoteArg.getValue()) { a.runRemoteServer(); } if (!problemArg.getValue().empty()) { if (QFile::exists(QString::fromStdString(problemArg.getValue()))) { QFileInfo info(QString::fromStdString(problemArg.getValue())); if (info.suffix() == "a2d") { w.setStartupProblemFilename(QString::fromStdString(problemArg.getValue())); if (executeArg.getValue()) w.setStartupExecute(true); } else { std::cout << QObject::tr("Unknown suffix.").toStdString() << std::endl; } } } else if (!scriptArg.getValue().empty()) { if (QFile::exists(QString::fromStdString(scriptArg.getValue()))) { QFileInfo info(QString::fromStdString(scriptArg.getValue())); if (info.suffix() == "py") { w.setStartupScriptFilename(QString::fromStdString(scriptArg.getValue())); if (executeArg.getValue()) w.setStartupExecute(true); } else { std::cout << QObject::tr("Unknown suffix.").toStdString() << std::endl; } } } w.show(); return a.exec(); } catch (TCLAP::ArgException &e) { std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; return 1; } }