本文整理汇总了C++中boost::mpi::communicator::iprobe方法的典型用法代码示例。如果您正苦于以下问题:C++ communicator::iprobe方法的具体用法?C++ communicator::iprobe怎么用?C++ communicator::iprobe使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类boost::mpi::communicator
的用法示例。
在下文中一共展示了communicator::iprobe方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: activeRecv
// Prijmuti a zpracovani zpravy behem aktivni prace procesu
// Vraci true, pokud nektery proces poslal info o nalezeni nejlepsiho mozneho
// vysledku = nema smysl dal pracovat
bool activeRecv(stack<string>& workStack) {
string recvMsg;
// Prisla nejaka zprava?
boost::optional<mpi::status> inc = com.iprobe();
// Neprisla, zpatky do prace!
if (!inc) {
return false;
}
mpi::status status = *inc;
// Prisel token, zatim ulozim a dal zpracuji az po dokonceni vlastni prace
if (status.tag() == TOKEN) {
bool isWhiteToken;
//cout << "active: recv token from " << status.source() << endl;
com.recv(status.source(), status.tag(), isWhiteToken);
if (isWhiteToken) {
token = WHITE_TOKEN;
} else {
token = BLACK_TOKEN;
}
}
// Prisel pozadavek o praci
else if (status.tag() == WORK_REQUEST) {
//cout << "active: recv work_req from " << status.source() << endl;
com.recv(status.source(), status.tag());
handleWorkRequest(status.source(), workStack);
}
// Prislo oznameni o nalezeni nejake podsekvence
// Pokud je delsi nez moje nejlepsi nalezena, ulozim si ji
else if (status.tag() == FOUND) {
cout << "active: recv found from " << status.source() << endl;
com.recv(status.source(), status.tag(), recvMsg);
if (recvMsg.length() > myLongest.length()) {
myLongest = recvMsg;
}
}
// Nektery proces uz nasel nejlepsi mozny vysledek
else if (status.tag() == FOUND_BEST) {
cout << "active: recv found best from " << status.source() << endl;
com.recv(status.source(), status.tag(), myLongest);
return true;
}
// Prisla zprava, kterou prave neumim zpracovat, vyzvednu a zahodim
else {
//cout << "active: recv from " << status.source() << endl;
com.recv(status.source(), status.tag());
}
return false;
}
示例2: mccrun_master
MCCResults mccrun_master(
const Options& opts, const Eigen::VectorXd& vpar, unsigned int num_bins,
const set<observables_t>& obs, const mpi::communicator& mpicomm )
{
cout << "========== NEW MONTE CARLO CYCLE ==========" << endl;
cout << ":: Preparing the simulation" << endl;
HubbardModelVMC model = prepare_model( opts, vpar, mpicomm );
vector< unique_ptr<Observable> > obscalc = prepare_obscalcs( obs, opts );
ObservableCache obscache;
unsigned int finished_workers = 0;
unsigned int scheduled_bins = 0;
unsigned int completed_bins = 0;
unsigned int enqueued_bins = num_bins;
// define procedure to query the slaves for new work requests
function<void()> mpiquery_work_requests( [&]() {
while ( boost::optional<mpi::status> status
= mpicomm.iprobe( mpi::any_source, MSGTAG_S_M_REQUEST_BINS ) ) {
// receive the request and hand out new bins to the source
mpicomm.recv( status->source(), MSGTAG_S_M_REQUEST_BINS );
if ( enqueued_bins > 0 ) {
mpicomm.send( status->source(), MSGTAG_M_S_DISPATCHED_BINS, 1 );
scheduled_bins += 1;
enqueued_bins -= 1;
} else {
mpicomm.send( status->source(), MSGTAG_M_S_DISPATCHED_BINS, 0 );
++finished_workers;
}
}
} );
// define procedure to query the slaves for finished work
function<void()> mpiquery_finished_work( [&]() {
while ( boost::optional<mpi::status> status
= mpicomm.iprobe( mpi::any_source, 2 ) ) {
mpicomm.recv( status->source(), 2 );
--scheduled_bins;
++completed_bins;
}
} );
cout << ":: Equilibrating the system" << endl;
for (
unsigned int mcs = 0;
mcs < opts["calc.num-mcs-equil"].as<unsigned int>();
++mcs ) {
// take care of the slaves
mpiquery_finished_work();
mpiquery_work_requests();
// perform a Monte Carlo step
model.mcs();
}
unsigned int completed_bins_master = 0;
cout << ":: Performing Monte Carlo cycle" << endl;
cout << endl;
cout << " Progress:" << endl;
while ( enqueued_bins > 0 ) {
cout << '\r' << " Bin "
<< completed_bins << "/" << num_bins;
cout.flush();
--enqueued_bins;
++scheduled_bins;
for (
unsigned int mcs = 0;
mcs < opts["calc.num-binmcs"].as<unsigned int>();
++mcs ) {
// take care of the slaves
mpiquery_finished_work();
mpiquery_work_requests();
// perform a Monte Carlo step
model.mcs();
// measure observables
for ( const unique_ptr<Observable>& o : obscalc ) {
o->measure( model, obscache );
}
obscache.clear();
}
// tell the observables that a bin has been completed
for ( const unique_ptr<Observable>& o : obscalc ) {
o->completebin();
}
--scheduled_bins;
++completed_bins_master;
++completed_bins;
}
//.........这里部分代码省略.........