1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-30 08:43:09 +00:00

Tidy up benchmark.cpp

Node count is different just becuase now we don't log on
"bench.txt" file anymore so that we avoid some calls to
pretty_pv() that calls Position::do_move().

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2011-04-25 10:46:52 +01:00
parent 05cfb00f26
commit 09d01ee9dc
5 changed files with 74 additions and 72 deletions

View file

@ -17,25 +17,17 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
////
//// Includes
////
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
#include <vector> #include <vector>
#include "position.h"
#include "search.h" #include "search.h"
#include "thread.h"
#include "ucioption.h" #include "ucioption.h"
using namespace std; using namespace std;
//// static const string Defaults[] = {
//// Variables
////
static const string BenchmarkPositions[] = {
"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1",
"r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq -", "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq -",
"8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - -", "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - -",
@ -56,10 +48,6 @@ static const string BenchmarkPositions[] = {
}; };
////
//// Functions
////
/// benchmark() runs a simple benchmark by letting Stockfish analyze a set /// benchmark() runs a simple benchmark by letting Stockfish analyze a set
/// of positions for a given limit each. There are five parameters; the /// of positions for a given limit each. There are five parameters; the
/// transposition table size, the number of search threads that should /// transposition table size, the number of search threads that should
@ -71,84 +59,95 @@ static const string BenchmarkPositions[] = {
void benchmark(int argc, char* argv[]) { void benchmark(int argc, char* argv[]) {
vector<string> positions; vector<string> fenList;
string ttSize, threads, valStr, posFile, valType; SearchLimits limits;
int val, maxTime, maxDepth, maxNodes; int64_t totalNodes;
int time;
ttSize = argc > 2 ? argv[2] : "128"; // Load default positions
threads = argc > 3 ? argv[3] : "1"; for (int i = 0; !Defaults[i].empty(); i++)
valStr = argc > 4 ? argv[4] : "12"; fenList.push_back(Defaults[i]);
posFile = argc > 5 ? argv[5] : "default";
valType = argc > 6 ? argv[6] : "depth"; // Assign default values to missing arguments
string ttSize = argc > 2 ? argv[2] : "128";
string threads = argc > 3 ? argv[3] : "1";
string valStr = argc > 4 ? argv[4] : "12";
string fenFile = argc > 5 ? argv[5] : "default";
string valType = argc > 6 ? argv[6] : "depth";
Options["Hash"].set_value(ttSize); Options["Hash"].set_value(ttSize);
Options["Threads"].set_value(threads); Options["Threads"].set_value(threads);
Options["OwnBook"].set_value("false"); Options["OwnBook"].set_value("false");
Options["Use Search Log"].set_value("true");
Options["Search Log Filename"].set_value("bench.txt");
maxTime = maxDepth = maxNodes = 0; // Search should be limited by nodes, time or depth ?
val = atoi(valStr.c_str()); if (valType == "nodes")
limits.maxNodes = atoi(valStr.c_str());
if (valType == "depth" || valType == "perft")
maxDepth = val;
else if (valType == "time") else if (valType == "time")
maxTime = val * 1000; limits.maxTime = 1000 * atoi(valStr.c_str()); // maxTime is in ms
else else
maxNodes = val; limits.maxDepth = atoi(valStr.c_str());
if (posFile != "default") // Do we need to load positions from a given FEN file ?
if (fenFile != "default")
{ {
ifstream fenFile(posFile.c_str()); string fen;
if (!fenFile.is_open()) ifstream f(fenFile.c_str());
if (f.is_open())
{ {
cerr << "Unable to open positions file " << posFile << endl; fenList.clear();
while (getline(f, fen))
if (!fen.empty())
fenList.push_back(fen);
f.close();
}
else
{
cerr << "Unable to open FEN file " << fenFile << endl;
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
string pos; }
while (fenFile.good())
{
getline(fenFile, pos);
if (!pos.empty())
positions.push_back(pos);
}
fenFile.close();
} else
for (int i = 0; !BenchmarkPositions[i].empty(); i++)
positions.push_back(BenchmarkPositions[i]);
vector<string>::iterator it; // Ok, let's start the benchmark !
int cnt = 1; totalNodes = 0;
int64_t totalNodes = 0; time = get_system_time();
int startTime = get_system_time();
for (it = positions.begin(); it != positions.end(); ++it, ++cnt) for (size_t i = 0; i < fenList.size(); i++)
{ {
Move moves[] = { MOVE_NONE }; Move moves[] = { MOVE_NONE };
Position pos(*it, false, 0); Position pos(fenList[i], false, 0);
cerr << "\nBench position: " << cnt << '/' << positions.size() << endl << endl;
cerr << "\nBench position: " << i + 1 << '/' << fenList.size() << endl;
if (valType == "perft") if (valType == "perft")
{ {
int64_t perftCnt = perft(pos, maxDepth * ONE_PLY); int64_t cnt = perft(pos, limits.maxDepth * ONE_PLY);
cerr << "\nPerft " << maxDepth << " result (nodes searched): " << perftCnt << endl << endl; totalNodes += cnt;
totalNodes += perftCnt;
} else { cerr << "\nPerft " << limits.maxDepth << " nodes counted: " << cnt << endl;
if (!think(pos, SearchLimits(0, 0, 0, maxTime, maxDepth, maxNodes, false, false), moves)) }
else
{
if (!think(pos, limits, moves))
break; break;
totalNodes += pos.nodes_searched(); totalNodes += pos.nodes_searched();
} }
} }
cnt = get_system_time() - startTime; time = get_system_time() - time;
cerr << "==============================="
<< "\nTotal time (ms) : " << cnt
<< "\nNodes searched : " << totalNodes
<< "\nNodes/second : " << (int)(totalNodes/(cnt/1000.0)) << endl << endl;
// Under MS Visual C++ debug window always unconditionally closes cerr << "\n==============================="
// when program exits, this is bad because we want to read results before. << "\nTotal time (ms) : " << time
<< "\nNodes searched : " << totalNodes
<< "\nNodes/second : " << (int)(totalNodes / (time / 1000.0)) << endl << endl;
// MS Visual C++ debug window always unconditionally closes when program
// exits, this is bad because we want to read results before.
#if (defined(WINDOWS) || defined(WIN32) || defined(WIN64)) #if (defined(WINDOWS) || defined(WIN32) || defined(WIN64))
cerr << "Press any key to exit" << endl; cerr << "Press any key to exit" << endl;
cin >> ttSize; cin >> time;
#endif #endif
} }

View file

@ -80,7 +80,7 @@ int main(int argc, char* argv[]) {
else else
cout << "Usage: stockfish bench [hash size = 128] [threads = 1] " cout << "Usage: stockfish bench [hash size = 128] [threads = 1] "
<< "[limit = 12] [fen positions file = default] " << "[limit = 12] [fen positions file = default] "
<< "[depth, time, perft or node limited = depth]" << endl; << "[limited by depth, time, nodes or perft = depth]" << endl;
Threads.exit(); Threads.exit();
return 0; return 0;

View file

@ -414,8 +414,8 @@ bool think(Position& pos, const SearchLimits& limits, Move searchMoves[]) {
else else
NodesBetweenPolls = 30000; NodesBetweenPolls = 30000;
// Look for a book move, only during games, not tests // Look for a book move
if (Limits.useTimeManagement() && Options["OwnBook"].value<bool>()) if (Options["OwnBook"].value<bool>())
{ {
if (Options["Book File"].value<std::string>() != OpeningBook.name()) if (Options["Book File"].value<std::string>() != OpeningBook.name())
OpeningBook.open(Options["Book File"].value<std::string>()); OpeningBook.open(Options["Book File"].value<std::string>());

View file

@ -20,6 +20,8 @@
#if !defined(SEARCH_H_INCLUDED) #if !defined(SEARCH_H_INCLUDED)
#define SEARCH_H_INCLUDED #define SEARCH_H_INCLUDED
#include <cstring>
#include "move.h" #include "move.h"
#include "types.h" #include "types.h"
@ -52,7 +54,8 @@ struct SearchStack {
struct SearchLimits { struct SearchLimits {
SearchLimits() {} SearchLimits() { memset(this, 0, sizeof(SearchLimits)); }
SearchLimits(int t, int i, int mtg, int mt, int md, int mn, bool inf, bool pon) SearchLimits(int t, int i, int mtg, int mt, int md, int mn, bool inf, bool pon)
: time(t), increment(i), movesToGo(mtg), maxTime(mt), maxDepth(md), : time(t), increment(i), movesToGo(mtg), maxTime(mt), maxDepth(md),
maxNodes(mn), infinite(inf), ponder(pon) {} maxNodes(mn), infinite(inf), ponder(pon) {}

View file

@ -203,10 +203,10 @@ namespace {
bool go(Position& pos, UCIParser& up) { bool go(Position& pos, UCIParser& up) {
string token; string token;
int time[] = { 0, 0 }, inc[] = { 0, 0 }; SearchLimits limits;
SearchLimits limits(0, 0, 0, 0, 0, 0, false, false);
Move searchMoves[MAX_MOVES] = { MOVE_NONE }; Move searchMoves[MAX_MOVES] = { MOVE_NONE };
Move* cur = searchMoves; Move* cur = searchMoves;
int time[] = { 0, 0 }, inc[] = { 0, 0 };
while (up >> token) while (up >> token)
{ {