修改了 option 为全局量

This commit is contained in:
YuhangQ 2023-04-18 15:22:11 +08:00
parent 65f4c77a7e
commit a27941f04b
12 changed files with 133 additions and 167 deletions

6
run.sh
View File

@ -13,10 +13,10 @@
# 04157f716c1e9606c6a530657bf8f957-Kakuro-easy-125-ext.xml.hg_4.cnf
DIR=/pub/data/chenzh/data/sat2022
INSTANCE=03bb7baaa45980753a0e7050ae44755d-atco_enc3_opt1_03_53.cnf
INSTANCE=00aefd1fc30c425075166ca051e57218-barman-pfile10-038.sas.ex.15.cnf
# make -j 16 && mpirun --bind-to none -np 9 --allow-run-as-root valgrind ./light -i $DIR/$INSTANCE --share=1 --threads=16 --times=3600
make -j 16 && mpirun --bind-to none -np 9 --allow-run-as-root ./light -i $DIR/$INSTANCE --share=1 --threads=16 --times=3600
make -j 16 && mpirun --bind-to none -np 9 --allow-run-as-root ./light -i ./data/hard1.cnf --share=1 --threads=16 --times=3600
# make -j 16 && mpirun --bind-to none -np 9 --allow-run-as-root ./light -i ./data/hard1.cnf --share=1 --threads=16 --times=3600
#./light -i $DIR/$INSTANCE --share=1 --threads=16 --times=3600

View File

@ -21,48 +21,49 @@ light::~light() {
workers.clear(true);
}
// void light::configure_from_file(const char* file) {
// if (!strcmp(file, "")) {
// configure_name = new vec<char*>[OPT(threads)];
// configure_val = new vec<double>[OPT(threads)];
// return;
// }
// printf("c Get configure file: %s\n", file);
// std::ifstream fin(file);
// char buf[1000];
// fin.getline(buf, 1000);
// char *p = buf + 6;
// int ws, ss, id = 0;
// p = read_int(p, &ws);
// p = read_int(p, &ss);
// printf("%d %d\n", ws, ss);
// opt->set_para("threads", ws);
// configure_name = new vec<char*>[ws];
// configure_val = new vec<double>[ws];
// while (fin.getline(buf, 1000)) {
// p = strtok(buf, " ");
// printf("%s\n", p);
// solver_type.push(0);
// while (p) {
// p = strtok(NULL, " ");
// printf("%s\n", p);
// if (!p) break;
// int l = strlen(p), pos = 0;
// for (int i = 1; i < l; i++)
// if (p[i] == '=') pos = i;
// char *name = new char[pos];
// strncpy(name, p, pos);
// printf("%s\n", name);
// configure_name[id].push(name);
// char *val = p + pos + 1;
// double v = atof(val);
// printf("%.2lf\n", v);
// configure_val[id].push(v);
// }
// printf("out\n");
// id++;
// }
// }
void light::configure_from_file(const char* file) {
if (!strcmp(file, "")) {
configure_name = new vec<char*>[OPT(threads)];
configure_val = new vec<double>[OPT(threads)];
return;
}
assert(false);
// printf("c Get configure file: %s\n", file);
// std::ifstream fin(file);
// char buf[1000];
// fin.getline(buf, 1000);
// char *p = buf + 6;
// int ws, ss, id = 0;
// p = read_int(p, &ws);
// p = read_int(p, &ss);
// printf("%d %d\n", ws, ss);
// opt->set_para("threads", ws);
// configure_name = new vec<char*>[ws];
// configure_val = new vec<double>[ws];
// while (fin.getline(buf, 1000)) {
// p = strtok(buf, " ");
// printf("%s\n", p);
// solver_type.push(0);
// while (p) {
// p = strtok(NULL, " ");
// printf("%s\n", p);
// if (!p) break;
// int l = strlen(p), pos = 0;
// for (int i = 1; i < l; i++)
// if (p[i] == '=') pos = i;
// char *name = new char[pos];
// strncpy(name, p, pos);
// printf("%s\n", name);
// configure_name[id].push(name);
// char *val = p + pos + 1;
// double v = atof(val);
// printf("%.2lf\n", v);
// configure_val[id].push(v);
// }
// printf("out\n");
// id++;
// }
}
void light::arg_parse(int argc, char **argv) {
cmdline::parser parser;
@ -95,4 +96,7 @@ void light::arg_parse(int argc, char **argv) {
filename = new char[file_string.size() + 1];
memcpy(filename, file_string.c_str(), file_string.length());
filename[file_string.length()] = '\0';
configure_from_file(OPT(config).c_str());
}

View File

@ -81,7 +81,7 @@ public:
int solve();
void terminate_workers();
void print_model();
void configure_from_file(const char*);
};
#endif

View File

@ -11,7 +11,7 @@ void paras::print_change() {
"Name", "Type", "Now", "Default", "Comment");
#define PARA(N, T, S, M, D, L, H, C) \
if (map_int.count(#N)) printf("c %-20s\t %-10s\t %-10d\t %-10s\t %s\n", (#N), (#T), N, (#D), (C)); \
if (!strcmp(#T, "int")) printf("c %-20s\t %-10s\t %-10d\t %-10s\t %s\n", (#N), (#T), N, (#D), (C)); \
else printf("c %-20s\t %-10s\t %-10f\t %-10s\t %s\n", (#N), (#T), N, (#D), (C));
PARAS
#undef PARA

View File

@ -7,20 +7,22 @@
// name, type, short-name,must-need, default ,low, high, comments
#define PARAS \
PARA( DPS , int , '\0' , false , 0 , 0 , 1 , "DPS/NPS") \
PARA( DPS_period , int , '\0' , false , 10000 , 1 , 1e8 , "DPS sharing period") \
PARA( margin , int , '\0' , false , 0 , 0 , 1e3 , "DPS margin") \
PARA( pakis , int , '\0' , false , 1 , 0 , 1 , "Use pakis diversity") \
PARA( reset , int , '\0' , false , 0 , 0 , 1 , "Dynamically reseting") \
PARA( reset_time , int , '\0' , false , 10 , 1 , 1e5 , "Reseting base interval (seconds)") \
PARA( share , int , '\0' , false , 1 , 0 , 1 , "Sharing learnt clauses") \
PARA( share_intv , int , '\0' , false , 500000, 0 , 1e9 , "Sharing interval (microseconds)") \
PARA( share_lits , int , '\0' , false , 1500 , 0 , 1e6 , "Sharing lits (per every #share_intv seconds)") \
PARA( shuffle , int , '\0' , false , 1 , 0 , 1 , "Use random shuffle") \
PARA( simplify , int , '\0' , false , 1 , 0 , 1 , "Use Simplify (only preprocess)") \
PARA( threads , int , '\0' , false , 32 , 1 , 128 , "Thread number") \
PARA( times , double , '\0' , false , 5000 , 0 , 1e8 , "Cutoff time") \
PARA( unique , int , '\0' , false , 1 , 0 , 1 , "Whether perform unique checking when receiving clauses from other nodes")
PARA( DPS , int , '\0' , false , 0 , 0 , 1 , "DPS/NPS") \
PARA( DPS_period , int , '\0' , false , 10000 , 1 , 1e8 , "DPS sharing period") \
PARA( margin , int , '\0' , false , 0 , 0 , 1e3 , "DPS margin") \
PARA( pakis , int , '\0' , false , 1 , 0 , 1 , "Use pakis diversity") \
PARA( reset , int , '\0' , false , 0 , 0 , 1 , "Dynamically reseting") \
PARA( reset_time , int , '\0' , false , 10 , 1 , 1e5 , "Reseting base interval (seconds)") \
PARA( share , int , '\0' , false , 1 , 0 , 1 , "Sharing learnt clauses") \
PARA( share_intv , int , '\0' , false , 500000, 0 , 1e9 , "Sharing interval (microseconds)") \
PARA( share_lits , int , '\0' , false , 1500 , 0 , 1e6 , "Sharing lits (per every #share_intv seconds)") \
PARA( share_method , int , '\0' , false , 1 , 0 , 1 , "0 for Circle Propagate/ 1 for Tree Broadcast") \
PARA( shuffle , int , '\0' , false , 1 , 0 , 1 , "Use random shuffle") \
PARA( simplify , int , '\0' , false , 1 , 0 , 1 , "Use Simplify (only preprocess)") \
PARA( threads , int , '\0' , false , 32 , 1 , 128 , "Thread number") \
PARA( times , double , '\0' , false , 5000 , 0 , 1e8 , "Cutoff time") \
PARA( unique , int , '\0' , false , 1 , 0 , 1 , "Whether perform unique checking when receiving clauses from other nodes")
// name, short-name, must-need, default, comments

View File

@ -1,10 +1,10 @@
#include "../light.hpp"
#include "basesolver.hpp"
#include "light.hpp"
#include "workers/basesolver.hpp"
#include "sharer.hpp"
#include "unordered_map"
#include "clause.hpp"
#include "workers/clause.hpp"
#include <unistd.h>
#include "../distributed/comm_tag.h"
#include "distributed/comm_tag.h"
#include <boost/thread/thread.hpp>
int nums = 0;
@ -16,12 +16,12 @@ std::vector<std::pair<MPI_Request*, int*>> send_data_struct;
MPI_Request receive_request;
int buf[BUF_SIZE];
// int num_received_clauses_by_network = 0;
// int num_skip_clauses_by_network = 0;
int num_received_clauses_by_network = 0;
int num_skip_clauses_by_network = 0;
// // 记录子句是否已经导入过
// 记录子句是否已经导入过
// std::unordered_map<int, bool> clause_imported;
std::unordered_map<int, bool> clause_imported;
void share_clauses_to_next_node(int from, const std::vector<shared_ptr<clause_store>> &cls) {
@ -37,7 +37,6 @@ void share_clauses_to_next_node(int from, const std::vector<shared_ptr<clause_st
// 初始化发送数据
for(int i=0; i<cls.size(); i++) {
//if(clause_imported[cls[i]->hash_code()]) continue;
send_length += (cls[i]->size + 2);
}
@ -48,7 +47,6 @@ void share_clauses_to_next_node(int from, const std::vector<shared_ptr<clause_st
send_buf[index++] = from;
for(int i=0; i<cls.size(); i++) {
// if(clause_imported[cls[i]->hash_code()]) continue;
auto& c = cls[i];
send_buf[index++] = c->size;
send_buf[index++] = c->lbd;
@ -99,7 +97,7 @@ bool receive_clauses_from_last_node(std::vector<shared_ptr<clause_store>> &claus
from = buf[index++];
while(index < count) {
//num_received_clauses_by_network++;
num_received_clauses_by_network++;
shared_ptr<clause_store> cl = std::make_shared<clause_store>(buf[index++]);
@ -108,11 +106,11 @@ bool receive_clauses_from_last_node(std::vector<shared_ptr<clause_store>> &claus
cl->data[i] = buf[index++];
}
// if(clause_imported[cl->hash_code()]) {
if(clause_imported[cl->hash_code()]) {
// num_skip_clauses_by_network++;
// continue;
// }
num_skip_clauses_by_network++;
continue;
}
clauses.push_back(cl);
}
@ -138,9 +136,9 @@ void sharer::clause_sharing_init() {
void sharer::clause_sharing_end() {
printf("c sharing nums: %d\nc sharing time: %.2lf\n", nums, share_time);
// printf("c sharing received_num_by_network: %d\n", num_received_clauses_by_network);
// printf("c sharing skip_num_by_network: %d\n", num_skip_clauses_by_network);
// printf("c sharing unique reduce percentage: %.2f%%\n", (double) num_skip_clauses_by_network / num_received_clauses_by_network * 100);
printf("c sharing received_num_by_network: %d\n", num_received_clauses_by_network);
printf("c sharing skip_num_by_network: %d\n", num_skip_clauses_by_network);
printf("c sharing unique reduce percentage: %.2f%%\n", (double) num_skip_clauses_by_network / num_received_clauses_by_network * 100);
}
void sharer::do_clause_sharing() {
@ -163,9 +161,9 @@ void sharer::do_clause_sharing() {
consumers[j]->import_clauses_from(clauses);
}
// for (int k = 0; k < clauses.size(); k++) {
// clause_imported[clauses[k]->hash_code()] = true;
// }
for (int k = 0; k < clauses.size(); k++) {
clause_imported[clauses[k]->hash_code()] = true;
}
// 传递外部网络传输的子句给下个节点
share_clauses_to_next_node(from, clauses);
@ -177,14 +175,14 @@ void sharer::do_clause_sharing() {
producers[i]->export_clauses_to(cls);
// 删除掉重复的学习子句
// int t_size = cls.size();
// for(int i=0; i<t_size; i++) {
// if(clause_imported[cls[i]->hash_code()]) {
// std::swap(cls[i], cls[t_size-1]);
// t_size--;
// }
// }
// cls.resize(t_size);
int t_size = cls.size();
for(int i=0; i<t_size; i++) {
if(clause_imported[cls[i]->hash_code()]) {
std::swap(cls[i], cls[t_size-1]);
t_size--;
}
}
cls.resize(t_size);
//分享当前节点产生的子句
if(cls.size() > 0) share_clauses_to_next_node(rank, cls);
@ -205,9 +203,9 @@ void sharer::do_clause_sharing() {
if (producers[i]->id == consumers[j]->id) continue;
consumers[j]->import_clauses_from(cls);
}
// for (int k = 0; k < cls.size(); k++) {
// clause_imported[cls[k]->hash_code()] = true;
// }
for (int k = 0; k < cls.size(); k++) {
clause_imported[cls[k]->hash_code()] = true;
}
}
auto clk_ed = std::chrono::high_resolution_clock::now();
@ -215,7 +213,7 @@ void sharer::do_clause_sharing() {
}
int sharer::import_clauses(int id) {
int current_period = producers[id]->get_period() - 1, import_period = current_period - margin;
int current_period = producers[id]->get_period() - 1, import_period = current_period - OPT(margin);
if (import_period < 0) return 0;
basesolver *t = producers[id];
for (int i = 0; i < producers.size(); i++) {
@ -249,13 +247,13 @@ int sharer::sort_clauses(int x) {
for (int i = 0; i < cls.size(); i++) {
int sz = cls[i]->size;
while (sz > bucket[x].size()) bucket[x].push();
if (sz * (bucket[x][sz - 1].size() + 1) <= share_lits)
if (sz * (bucket[x][sz - 1].size() + 1) <= OPT(share_lits))
bucket[x][sz - 1].push_back(cls[i]);
// else
// cls[i]->free_clause();
}
cls.clear();
int space = share_lits;
int space = OPT(share_lits);
for (int i = 0; i < bucket[x].size(); i++) {
int clause_num = space / (i + 1);
// printf("%d %d\n", clause_num, bucket[x][i].size());
@ -274,7 +272,7 @@ int sharer::sort_clauses(int x) {
}
}
}
return (share_lits - space) * 100 / share_lits;
return (OPT(share_lits) - space) * 100 / OPT(share_lits);
}
// void light::share() {

23
src/sharer.hpp Normal file
View File

@ -0,0 +1,23 @@
#ifndef _sharer_hpp_INCLUDED
#define _sharer_hpp_INCLUDED
#include "paras.hpp"
#include <boost/thread.hpp>
#include "utils/vec.hpp"
#include "./workers/clause.hpp"
class basesolver;
class sharer {
public:
vec<std::vector<shared_ptr<clause_store>>> bucket[64];
vec<basesolver *> producers, consumers;
std::vector<shared_ptr<clause_store>> cls;
void do_clause_sharing();
void clause_sharing_init();
void clause_sharing_end();
int sort_clauses(int x);
int import_clauses(int id);
};
#endif

View File

@ -1,6 +1,6 @@
#include "light.hpp"
#include "workers/basekissat.hpp"
#include "workers/sharer.hpp"
#include "sharer.hpp"
#include "paras.hpp"
#include <unistd.h>
#include <chrono>
@ -121,9 +121,6 @@ void light::terminate_workers() {
else
workers[i]->terminate();
}
for (int i = 0; i < sharers.size(); i++) {
sharers[i]->set_terminated();
}
}
void light::parse_input() {
@ -155,7 +152,7 @@ int light::solve() {
// 初始化共享子句类
sharer* s;
if(OPT(share)) {
s = new sharer(0, OPT(share_intv), OPT(share_lits), OPT(DPS));
s = new sharer();
for (int j = 0; j < OPT(threads); j++) {
s->producers.push(workers[j]);
s->consumers.push(workers[j]);

View File

@ -1,5 +1,5 @@
#include "basekissat.hpp"
#include "sharer.hpp"
#include "../sharer.hpp"
#include <thread>
#include <condition_variable>

View File

@ -1,5 +1,5 @@
#include "basesolver.hpp"
#include "sharer.hpp"
#include "../sharer.hpp"
int basesolver::get_period() {
boost::mutex::scoped_lock lock(mtx);
@ -70,11 +70,11 @@ void basesolver::select_clauses() {
for (int i = 0; i < cls.size(); i++) {
int sz = cls[i]->size;
while (sz > bucket.size()) bucket.push();
if (sz * (bucket[sz - 1].size() + 1) <= share->share_lits)
if (sz * (bucket[sz - 1].size() + 1) <= OPT(share_lits))
bucket[sz - 1].push_back(cls[i]);
}
period_clauses *pcls = new period_clauses(period);
int space = share->share_lits;
int space = OPT(share_lits);
for (int i = 0; i < bucket.size(); i++) {
int clause_num = space / (i + 1);
if (!clause_num) break;
@ -92,7 +92,7 @@ void basesolver::select_clauses() {
}
}
}
int percent = (share->share_lits - space) * 100 / share->share_lits;
int percent = (OPT(share_lits) - space) * 100 / OPT(share_lits);
if (percent < 75) broaden_export_limit();
if (percent > 98) restrict_export_limit();
//sort finish

View File

@ -22,6 +22,8 @@ struct clause_store {
}
ll __hash(int B, int MOD) {
std::sort(data, data+size);
ll res = 0;
ll b = 1;

View File

@ -1,60 +0,0 @@
#ifndef _sharer_hpp_INCLUDED
#define _sharer_hpp_INCLUDED
#include "../paras.hpp"
#include <boost/thread.hpp>
#include "../utils/vec.hpp"
#include "clause.hpp"
class basesolver;
class sharer {
public:
int id;
int share_intv, share_lits, dps;
int margin;
mutable boost::mutex mtx;
boost::condition_variable cond;
int terminated;
int waitings;
vec<std::vector<shared_ptr<clause_store>>> bucket[64]; //need to update
vec<basesolver *> producers, consumers;
std::vector<shared_ptr<clause_store>> cls;
sharer(int idx, int intv, int lits, int share_dps = 0) {
share_intv = intv;
share_lits = lits;
dps = share_dps;
id = idx;
waitings = terminated = 0;
}
void do_clause_sharing();
void clause_sharing_init();
void clause_sharing_end();
void set_terminated() {
boost::mutex::scoped_lock lock(mtx);
terminated = 1;
cond.notify_one();
}
bool should_sharing() const {
boost::mutex::scoped_lock lock(mtx);
return waitings == producers.size();
}
void waiting_for_all_ready() {
boost::mutex::scoped_lock lock(mtx);
while (waitings != producers.size() && !terminated) {
cond.wait(lock);
}
}
void sharing_finish() {
boost::mutex::scoped_lock lock(mtx);
waitings = 0;
// printf("c sharing thread finish sharing\n");
cond.notify_all();
}
int sort_clauses(int x);
// void select_clauses(int id);
int import_clauses(int id);
};
#endif