本文整理汇总了C++中mpi::Intracomm::Barrier方法的典型用法代码示例。如果您正苦于以下问题:C++ Intracomm::Barrier方法的具体用法?C++ Intracomm::Barrier怎么用?C++ Intracomm::Barrier使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类mpi::Intracomm
的用法示例。
在下文中一共展示了Intracomm::Barrier方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: worker_process
void worker_process(const MPI::Intracomm &comm_world, const int manager_rank, const int rank, const Mat& Q, const vector<float> &lut) {
char flag = MANAGER_READY;
int inputSize;
int outputSize;
int maskSize;
char *input;
char *output;
char *mask;
comm_world.Barrier();
uint64_t t0, t1;
printf("worker %d ready\n", rank);
while (flag != MANAGER_FINISHED && flag != MANAGER_ERROR) {
t0 = cci::common::event::timestampInUS();
// tell the manager - ready
comm_world.Send(&WORKER_READY, 1, MPI::CHAR, manager_rank, TAG_CONTROL);
// printf("worker %d signal ready\n", rank);
// get the manager status
comm_world.Recv(&flag, 1, MPI::CHAR, manager_rank, TAG_CONTROL);
// printf("worker %d received manager status %d\n", rank, flag);
if (flag == MANAGER_READY) {
// get data from manager
comm_world.Recv(&inputSize, 1, MPI::INT, manager_rank, TAG_METADATA);
comm_world.Recv(&maskSize, 1, MPI::INT, manager_rank, TAG_METADATA);
comm_world.Recv(&outputSize, 1, MPI::INT, manager_rank, TAG_METADATA);
// allocate the buffers
input = new char[inputSize];
mask = new char[maskSize];
output = new char[outputSize];
memset(input, 0, inputSize * sizeof(char));
memset(mask, 0, maskSize * sizeof(char));
memset(output, 0, outputSize * sizeof(char));
// get the file names
comm_world.Recv(input, inputSize, MPI::CHAR, manager_rank, TAG_DATA);
comm_world.Recv(mask, maskSize, MPI::CHAR, manager_rank, TAG_DATA);
comm_world.Recv(output, outputSize, MPI::CHAR, manager_rank, TAG_DATA);
t0 = cci::common::event::timestampInUS();
// printf("comm time for worker %d is %lu us\n", rank, t1 -t0);
//printf("worker %d processing \"%s\"\n", rank, mask);
// now do some work
compute(input, mask, output, Q, lut);
t1 = cci::common::event::timestampInUS();
// printf("worker %d processed \"%s\" + \"%s\" -> \"%s\" in %lu us\n", rank, input, mask, output, t1 - t0);
printf("worker %d processed \"%s\" in %lu us\n", rank, mask, t1 - t0);
// clean up
delete [] input;
delete [] mask;
delete [] output;
}
}
}
示例2: fit_steepest_descent
//.........这里部分代码省略.........
param_vals[1] -= gamma_const * (herrinv[2] * derr1 + herrinv[3] * derr2);
delete[] herrinv;
delete[] herr;
} // for
// compute the error surface
std::vector<std::vector<real_t> >::iterator mean_iter = params.begin();
std::vector<std::vector<real_t> >::iterator sd_iter = mean_iter + 1;
std::vector<real_t> err_surface;
for(std::vector<real_t>::iterator curr_mean = (*mean_iter).begin();
curr_mean != (*mean_iter).end(); ++ curr_mean) {
for(std::vector<real_t>::iterator curr_sd = (*sd_iter).begin();
curr_sd != (*sd_iter).end(); ++ curr_sd) {
(*shape_param).second.mean(*curr_mean);
(*shape_param).second.deviation(*curr_sd);
if(!run_gisaxs(alpha_i, alphai, phi, tilt, data, world_comm)) {
if(mpi_rank == 0)
std::cerr << "error: could not finish successfully" << std::endl;
return false;
} // if
for(unsigned int iy = 0; iy < nqy_; ++ iy) {
// assuming nqz_ == 1 ...
temp_zcuts[iy] = data[nqx_ * iy];
} // for
delete[] data; data = NULL;
real_t curr_err = compute_cut_fit_error(temp_zcuts, ref_z_cut, qdeltay);
err_surface.push_back(*curr_mean);
err_surface.push_back(*curr_sd);
err_surface.push_back(curr_err);
} // for
} // for
// write data to files
// define output filename
std::stringstream alphai_b, phi_b, tilt_b;
std::string alphai_s, phi_s, tilt_s;
alphai_b << alpha_i; alphai_s = alphai_b.str();
phi_b << phi; phi_s = phi_b.str();
tilt_b << tilt; tilt_s = tilt_b.str();
std::string param_error_file(HiGInput::instance().param_pathprefix() +
"/" + HiGInput::instance().runname() +
"/param_error_ai=" + alphai_s + "_rot=" + phi_s +
"_tilt=" + tilt_s + ".dat");
std::string z_cut_file(HiGInput::instance().param_pathprefix() +
"/" + HiGInput::instance().runname() +
"/z_cut_ai=" + alphai_s + "_rot=" + phi_s +
"_tilt=" + tilt_s + ".dat");
std::string err_surf_file(HiGInput::instance().param_pathprefix() +
"/" + HiGInput::instance().runname() +
"/err_surf_ai=" + alphai_s + "_rot=" + phi_s +
"_tilt=" + tilt_s + ".dat");
// write param_error_data
std::ofstream param_error_f(param_error_file.c_str());
for(std::vector<real_t>::iterator pei = param_error_data.begin();
pei != param_error_data.end(); pei += 4) {
param_error_f << *pei << "\t" << *(pei + 1) << "\t" << *(pei + 2) << "\t"
<< *(pei + 3) << std::endl;
} // for
param_error_f.close();
// write ref_z_cut and z_cuts
std::ofstream zcut_f(z_cut_file.c_str());
for(unsigned int yy = 0; yy < nqy_; ++ yy) {
zcut_f << ref_z_cut[yy] << "\t";
} // for
zcut_f << std::endl;
for(unsigned int i = 0; i < max_iter; ++ i) {
for(unsigned int yy = 0; yy < nqy_; ++ yy) {
zcut_f << z_cuts[i * nqy_ + yy] << "\t";
} // for
zcut_f << std::endl;
} // for
zcut_f.close();
// write error surface
std::ofstream err_surf_f(err_surf_file.c_str());
for(std::vector<real_t>::iterator surfi = err_surface.begin();
surfi != err_surface.end(); surfi += 3) {
err_surf_f << *surfi << "\t" << *(surfi + 1) << "\t" << *(surfi + 2) << std::endl;
} // for
err_surf_f.close();
(*shape_param).second.mean(22.0);
(*shape_param).second.deviation(7.0);
param_error_data.clear();
delete[] temp_zcuts;
delete[] z_cuts;
delete[] ref_z_cut;
std::cout << "parameter values: " << param_vals[0] << ", " << param_vals[1]
<< " [error: " << err << "]" << std::endl;
// synchronize all procs after each run
world_comm.Barrier();
} // for tilt
} // for phi
} // for alphai
return true;
} // HipGISAXS::fit_all_gisaxs()
示例3: manager_process
void manager_process(const MPI::Intracomm &comm_world, const int manager_rank, const int worker_size, std::string &maskName, std::string &imgDir, std::string &outDir, bool overwrite) {
// first get the list of files to process
std::vector<std::string> filenames;
std::vector<std::string> seg_output;
std::vector<std::string> features_output;
uint64_t t1, t0;
t0 = cci::common::event::timestampInUS();
getFiles(maskName, imgDir, outDir, filenames, seg_output, features_output, overwrite);
t1 = cci::common::event::timestampInUS();
printf("Manager ready at %d, file read took %lu us\n", manager_rank, t1 - t0);
comm_world.Barrier();
// now start the loop to listen for messages
int curr = 0;
int total = filenames.size();
MPI::Status status;
int worker_id;
char ready;
char *input;
char *mask;
char *output;
int inputlen;
int masklen;
int outputlen;
while (curr < total) {
usleep(1000);
if (comm_world.Iprobe(MPI_ANY_SOURCE, TAG_CONTROL, status)) {
/* where is it coming from */
worker_id=status.Get_source();
comm_world.Recv(&ready, 1, MPI::CHAR, worker_id, TAG_CONTROL);
// printf("manager received request from worker %d\n",worker_id);
if (worker_id == manager_rank) continue;
if(ready == WORKER_READY) {
// tell worker that manager is ready
comm_world.Send(&MANAGER_READY, 1, MPI::CHAR, worker_id, TAG_CONTROL);
// printf("manager signal transfer\n");
/* send real data */
inputlen = filenames[curr].size() + 1; // add one to create the zero-terminated string
masklen = seg_output[curr].size() + 1;
outputlen = features_output[curr].size() + 1;
input = new char[inputlen];
memset(input, 0, sizeof(char) * inputlen);
strncpy(input, filenames[curr].c_str(), inputlen);
mask = new char[masklen];
memset(mask, 0, sizeof(char) * masklen);
strncpy(mask, seg_output[curr].c_str(), masklen);
output = new char[outputlen];
memset(output, 0, sizeof(char) * outputlen);
strncpy(output, features_output[curr].c_str(), outputlen);
comm_world.Send(&inputlen, 1, MPI::INT, worker_id, TAG_METADATA);
comm_world.Send(&masklen, 1, MPI::INT, worker_id, TAG_METADATA);
comm_world.Send(&outputlen, 1, MPI::INT, worker_id, TAG_METADATA);
// now send the actual string data
comm_world.Send(input, inputlen, MPI::CHAR, worker_id, TAG_DATA);
comm_world.Send(mask, masklen, MPI::CHAR, worker_id, TAG_DATA);
comm_world.Send(output, outputlen, MPI::CHAR, worker_id, TAG_DATA);
curr++;
delete [] input;
delete [] mask;
delete [] output;
}
if (curr % 100 == 1) {
printf("[ MANAGER STATUS ] %d tasks remaining.\n", total - curr);
}
}
}
/* tell everyone to quit */
int active_workers = worker_size;
while (active_workers > 0) {
usleep(1000);
if (comm_world.Iprobe(MPI_ANY_SOURCE, TAG_CONTROL, status)) {
/* where is it coming from */
worker_id=status.Get_source();
comm_world.Recv(&ready, 1, MPI::CHAR, worker_id, TAG_CONTROL);
// printf("manager received request from worker %d\n",worker_id);
if (worker_id == manager_rank) continue;
if(ready == WORKER_READY) {
comm_world.Send(&MANAGER_FINISHED, 1, MPI::CHAR, worker_id, TAG_CONTROL);
// printf("manager signal finished\n");
--active_workers;
}
}
}
}