预处理解出不启动worer,到达时间限制自动退出。

This commit is contained in:
YuhangQ 2023-04-04 08:50:55 +00:00
parent 6f4ac3ba7c
commit 9effe67a40
6 changed files with 59 additions and 44 deletions

View File

@ -1,3 +1,3 @@
#!/bin/bash #!/bin/bash
mpirun --host worker1,worker2,worker3 /light -i ./files/class_1_easy_10_0.cnf mpirun --host localhost,worker1,worker2,worker3 /light -i ./files/class_1_easy_10_0.cnf

BIN
light

Binary file not shown.

2
run.sh
View File

@ -1,3 +1,3 @@
#!/bin/bash #!/bin/bash
make -j 16 && mpirun -np 4 --allow-run-as-root ./light -i data/class_1_easy_10_0.cnf --share=1 --threads=4 make -j 16 && mpirun -q -np 4 --allow-run-as-root ./light -i data/class_1_easy_10_0.cnf --share=1 --threads=4 --times=1

View File

@ -3,4 +3,5 @@
const int TERMINATE_TAG = 0; const int TERMINATE_TAG = 0;
const int SOLVED_REPORT_TAG = 1; const int SOLVED_REPORT_TAG = 1;
const int MODEL_REPORT_TAG = 2; const int MODEL_REPORT_TAG = 2;
const int START_TAG = 3;

View File

@ -11,11 +11,33 @@
#include "../paras.hpp" #include "../paras.hpp"
#include "heartbeat.h" #include "heartbeat.h"
preprocess* do_simplify(light* S, std::stringstream &ss) {
auto pre = new preprocess();
void leader_main(light* S, int num_procs, int rank) {
auto clk_st = std::chrono::high_resolution_clock::now();
S->opt->print_change();
printf("c [leader] preprocess(simplify) input data\n");
// 进行化简
auto pre = new preprocess();
char *filename = const_cast<char*>(S->opt->instance.c_str()); char *filename = const_cast<char*>(S->opt->instance.c_str());
pre->do_preprocess(filename); int start = pre->do_preprocess(filename);
// 给每个 worker 发布是否启动计算流程的信息
for(int i=1; i<num_procs; i++) {
MPI_Send(&start, 1, MPI_INT, i, START_TAG, MPI_COMM_WORLD);
}
// preprocess 证明了UNSAT 则不需要启动云计算
if(!start) {
printf("UNSAT!!!!!! by preprocess\n");
return;
}
std::stringstream ss;
ss << "p cnf " << pre->vars << " " << pre->clause.size() << std::endl; ss << "p cnf " << pre->vars << " " << pre->clause.size() << std::endl;
for (int i = 1; i <= pre->clauses; i++) { for (int i = 1; i <= pre->clauses; i++) {
@ -25,18 +47,6 @@ preprocess* do_simplify(light* S, std::stringstream &ss) {
ss << "0" << std::endl; ss << "0" << std::endl;
} }
return pre;
}
void leader_main(light* S, int num_procs, int rank) {
S->opt->print_change();
printf("c [leader] preprocess(simplify) input data\n");
//read file
std::stringstream ss;
preprocess* pre = do_simplify(S, ss);
const auto& str_ref = ss.str(); const auto& str_ref = ss.str();
char* cstr = const_cast<char *>(str_ref.c_str()); char* cstr = const_cast<char *>(str_ref.c_str());
@ -44,6 +54,8 @@ void leader_main(light* S, int num_procs, int rank) {
int cnf_length = str_ref.size(); int cnf_length = str_ref.size();
MPI_Barrier(MPI_COMM_WORLD);
MPI_Bcast(&cnf_length, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(&cnf_length, 1, MPI_INT, 0, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD);
@ -63,8 +75,16 @@ void leader_main(light* S, int num_procs, int rank) {
// waiting for results: // waiting for results:
while(true) { while(true) {
int flag;
// 检测时间是否超限
auto clk_now = std::chrono::high_resolution_clock::now();
int solve_time = std::chrono::duration_cast<std::chrono::seconds>(clk_now - clk_st).count();
if (solve_time >= S->opt->times) {
printf("c [leader] solve time out\n");
break;
}
int flag;
// check if problem solved // check if problem solved
if(MPI_Test(&solved, &flag, &status) == MPI_SUCCESS && flag == 1) { if(MPI_Test(&solved, &flag, &status) == MPI_SUCCESS && flag == 1) {
@ -99,18 +119,4 @@ void leader_main(light* S, int num_procs, int rank) {
break; break;
} }
} }
// printf("[leader] hand out simplified cnf ...\n");
// HeartBeat *hb = new HeartBeat(num_procs);
// printf("[leader] waiting for connection...\n");
// hb->waiting_all();
// for(int i=1; i<=10; i++) {
// printf("[leader] check: %d\n", i);
// hb->update();
// std::this_thread::sleep_for(std::chrono::seconds(1));
// }
} }

View File

@ -11,6 +11,16 @@
void worker_main(light* S, int num_procs, int rank) { void worker_main(light* S, int num_procs, int rank) {
auto clk_st = std::chrono::high_resolution_clock::now();
// 阻塞接收初始化信号
int start;
MPI_Recv(&start, 1, MPI_INT, 0, START_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
if(!start) {
printf("c worker%d has no need to start\n", rank);
return;
}
// 监听 terminate 信号 // 监听 terminate 信号
MPI_Irecv(NULL, 0, MPI_INT, 0, TERMINATE_TAG, MPI_COMM_WORLD, &S->terminal_request); MPI_Irecv(NULL, 0, MPI_INT, 0, TERMINATE_TAG, MPI_COMM_WORLD, &S->terminal_request);
@ -18,6 +28,8 @@ void worker_main(light* S, int num_procs, int rank) {
int cnf_length; int cnf_length;
MPI_Barrier(MPI_COMM_WORLD);
MPI_Bcast(&cnf_length, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(&cnf_length, 1, MPI_INT, 0, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD);
@ -28,17 +40,6 @@ void worker_main(light* S, int num_procs, int rank) {
MPI_Barrier(MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD);
// std::this_thread::sleep_for(std::chrono::seconds(1));
// time_t now = time(NULL);
// MPI_Send(&now, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
// int buf[2];
// MPI_Recv(buf, 2, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
// int next = buf[0], last = buf[1];
// printf("my %d next: %d last: %d\n", rank, next, last);
int res = S->run(); int res = S->run();
MPI_Request solved_request, model_request; MPI_Request solved_request, model_request;
@ -53,6 +54,13 @@ void worker_main(light* S, int num_procs, int rank) {
int flag; int flag;
auto clk_now = std::chrono::high_resolution_clock::now();
int solve_time = std::chrono::duration_cast<std::chrono::seconds>(clk_now - clk_st).count();
if (solve_time >= S->opt->times) {
printf("c [worker%d] solve time out\n", rank);
break;
}
// when getting terminate signal // when getting terminate signal
if(MPI_Test(&S->terminal_request, &flag, MPI_STATUS_IGNORE) == MPI_SUCCESS && flag == 1) { if(MPI_Test(&S->terminal_request, &flag, MPI_STATUS_IGNORE) == MPI_SUCCESS && flag == 1) {