mirror of
https://github.com/sockspls/badfish
synced 2025-05-02 09:39:36 +00:00
Implement best move voting system for cluster
This implements the cluster version of d96c1c32a2
This commit is contained in:
parent
2559c20c6e
commit
66b2c6b9f1
3 changed files with 35 additions and 22 deletions
|
@ -48,21 +48,8 @@ static MPI_Comm StopComm = MPI_COMM_NULL;
|
||||||
static MPI_Datatype TTEntryDatatype = MPI_DATATYPE_NULL;
|
static MPI_Datatype TTEntryDatatype = MPI_DATATYPE_NULL;
|
||||||
static std::vector<KeyedTTEntry> TTBuff;
|
static std::vector<KeyedTTEntry> TTBuff;
|
||||||
|
|
||||||
static MPI_Op BestMoveOp = MPI_OP_NULL;
|
|
||||||
static MPI_Datatype MIDatatype = MPI_DATATYPE_NULL;
|
static MPI_Datatype MIDatatype = MPI_DATATYPE_NULL;
|
||||||
|
|
||||||
static void BestMove(void* in, void* inout, int* len, MPI_Datatype* datatype) {
|
|
||||||
if (*datatype != MIDatatype)
|
|
||||||
MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE);
|
|
||||||
MoveInfo* l = static_cast<MoveInfo*>(in);
|
|
||||||
MoveInfo* r = static_cast<MoveInfo*>(inout);
|
|
||||||
for (int i=0; i < *len; ++i)
|
|
||||||
{
|
|
||||||
if (l[i].depth >= r[i].depth && l[i].score >= r[i].score)
|
|
||||||
r[i] = l[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void init() {
|
void init() {
|
||||||
int thread_support;
|
int thread_support;
|
||||||
constexpr std::array<int, 7> TTblocklens = {1, 1, 1, 1, 1, 1, 1};
|
constexpr std::array<int, 7> TTblocklens = {1, 1, 1, 1, 1, 1, 1};
|
||||||
|
@ -80,7 +67,8 @@ void init() {
|
||||||
MPI_INT16_T,
|
MPI_INT16_T,
|
||||||
MPI_UINT8_T,
|
MPI_UINT8_T,
|
||||||
MPI_INT8_T};
|
MPI_INT8_T};
|
||||||
const std::array<MPI_Aint, 3> MIdisps = {offsetof(MoveInfo, depth),
|
const std::array<MPI_Aint, 4> MIdisps = {offsetof(MoveInfo, move),
|
||||||
|
offsetof(MoveInfo, depth),
|
||||||
offsetof(MoveInfo, score),
|
offsetof(MoveInfo, score),
|
||||||
offsetof(MoveInfo, rank)};
|
offsetof(MoveInfo, rank)};
|
||||||
|
|
||||||
|
@ -101,9 +89,8 @@ void init() {
|
||||||
&TTEntryDatatype);
|
&TTEntryDatatype);
|
||||||
MPI_Type_commit(&TTEntryDatatype);
|
MPI_Type_commit(&TTEntryDatatype);
|
||||||
|
|
||||||
MPI_Type_create_hindexed_block(3, 1, MIdisps.data(), MPI_INT, &MIDatatype);
|
MPI_Type_create_hindexed_block(4, 1, MIdisps.data(), MPI_INT, &MIDatatype);
|
||||||
MPI_Type_commit(&MIDatatype);
|
MPI_Type_commit(&MIDatatype);
|
||||||
MPI_Op_create(BestMove, false, &BestMoveOp);
|
|
||||||
|
|
||||||
MPI_Comm_dup(MPI_COMM_WORLD, &InputComm);
|
MPI_Comm_dup(MPI_COMM_WORLD, &InputComm);
|
||||||
MPI_Comm_dup(MPI_COMM_WORLD, &TTComm);
|
MPI_Comm_dup(MPI_COMM_WORLD, &TTComm);
|
||||||
|
@ -236,8 +223,32 @@ void save(Thread* thread, TTEntry* tte,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void reduce_moves(MoveInfo& mi) {
|
void pick_moves(MoveInfo& mi) {
|
||||||
MPI_Allreduce(MPI_IN_PLACE, &mi, 1, MIDatatype, BestMoveOp, MoveComm);
|
MoveInfo* pMoveInfo = NULL;
|
||||||
|
if (is_root()) {
|
||||||
|
pMoveInfo = (MoveInfo*)malloc(sizeof(MoveInfo) * size());
|
||||||
|
}
|
||||||
|
MPI_Gather(&mi, 1, MIDatatype, pMoveInfo, 1, MIDatatype, 0, MoveComm);
|
||||||
|
if (is_root()) {
|
||||||
|
std::map<int, int> votes;
|
||||||
|
int minScore = pMoveInfo[0].score;
|
||||||
|
for (int i = 0; i < size(); i++) {
|
||||||
|
minScore = std::min(minScore, pMoveInfo[i].score);
|
||||||
|
votes[pMoveInfo[i].move] = 0;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < size(); i++) {
|
||||||
|
votes[pMoveInfo[i].move] += pMoveInfo[i].score - minScore + pMoveInfo[i].depth;
|
||||||
|
}
|
||||||
|
int bestVote = votes[pMoveInfo[0].move];
|
||||||
|
for (int i = 0; i < size(); i++) {
|
||||||
|
if (votes[pMoveInfo[i].move] > bestVote) {
|
||||||
|
bestVote = votes[pMoveInfo[i].move];
|
||||||
|
mi = pMoveInfo[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(pMoveInfo);
|
||||||
|
}
|
||||||
|
MPI_Bcast(&mi, 1, MIDatatype, 0, MoveComm);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,7 @@ class Thread;
|
||||||
namespace Cluster {
|
namespace Cluster {
|
||||||
|
|
||||||
struct MoveInfo {
|
struct MoveInfo {
|
||||||
|
int move;
|
||||||
int depth;
|
int depth;
|
||||||
int score;
|
int score;
|
||||||
int rank;
|
int rank;
|
||||||
|
@ -70,7 +71,7 @@ int rank();
|
||||||
inline bool is_root() { return rank() == 0; }
|
inline bool is_root() { return rank() == 0; }
|
||||||
void save(Thread* thread, TTEntry* tte,
|
void save(Thread* thread, TTEntry* tte,
|
||||||
Key k, Value v, Bound b, Depth d, Move m, Value ev);
|
Key k, Value v, Bound b, Depth d, Move m, Value ev);
|
||||||
void reduce_moves(MoveInfo& mi);
|
void pick_moves(MoveInfo& mi);
|
||||||
void sync_start();
|
void sync_start();
|
||||||
void sync_stop();
|
void sync_stop();
|
||||||
|
|
||||||
|
@ -89,7 +90,7 @@ inline void save(Thread* thread, TTEntry* tte,
|
||||||
(void)thread;
|
(void)thread;
|
||||||
tte->save(k, v, b, d, m, ev);
|
tte->save(k, v, b, d, m, ev);
|
||||||
}
|
}
|
||||||
inline void reduce_moves(MoveInfo&) { }
|
inline void pick_moves(MoveInfo&) { }
|
||||||
inline void sync_start() { }
|
inline void sync_start() { }
|
||||||
inline void sync_stop() { }
|
inline void sync_stop() { }
|
||||||
|
|
||||||
|
|
|
@ -288,10 +288,11 @@ void MainThread::search() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Cluster::MoveInfo mi{bestThread->completedDepth,
|
Cluster::MoveInfo mi{bestThread->rootMoves[0].pv[0],
|
||||||
|
bestThread->completedDepth,
|
||||||
bestThread->rootMoves[0].score,
|
bestThread->rootMoves[0].score,
|
||||||
Cluster::rank()};
|
Cluster::rank()};
|
||||||
Cluster::reduce_moves(mi);
|
Cluster::pick_moves(mi);
|
||||||
|
|
||||||
previousScore = static_cast<Value>(mi.score);
|
previousScore = static_cast<Value>(mi.score);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue