/*
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
- Copyright (C) 2008-2009 Marco Costalba
+ Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
Stockfish is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
# include <sys/time.h>
# include <sys/types.h>
# include <unistd.h>
+# if defined(__hpux)
+# include <sys/pstat.h>
+# endif
#else
#endif
+#if !defined(NO_PREFETCH)
+# include <xmmintrin.h>
+#endif
+
#include <cassert>
#include <cstdio>
#include <iomanip>
#include "bitcount.h"
#include "misc.h"
+#include "thread.h"
using namespace std;
//// Variables
////
-bool Chess960;
-
uint64_t dbg_cnt0 = 0;
uint64_t dbg_cnt1 = 0;
const string engine_name() {
- const string cpu64(CpuHas64BitPath ? " 64bit" : "");
+ const string cpu64(CpuIs64Bit ? " 64bit" : "");
if (!EngineVersion.empty())
- return AppName+ " " + EngineVersion + cpu64;
+ return AppName + " " + EngineVersion + cpu64;
string date(__DATE__); // From compiler, format is "Sep 21 2008"
string months("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec");
# if defined(_SC_NPROCESSORS_ONLN)
int cpu_count() {
- return Min(sysconf(_SC_NPROCESSORS_ONLN), 8);
+ return Min(sysconf(_SC_NPROCESSORS_ONLN), MAX_THREADS);
+}
+# elif defined(__hpux)
+int cpu_count() {
+ struct pst_dynamic psd;
+ if (pstat_getdynamic(&psd, sizeof(psd), (size_t)1, 0) == -1)
+ return 1;
+
+ return Min(psd.psd_proc_cnt, MAX_THREADS);
}
# else
int cpu_count() {
int cpu_count() {
SYSTEM_INFO s;
GetSystemInfo(&s);
- return Min(s.dwNumberOfProcessors, 8);
+ return Min(s.dwNumberOfProcessors, MAX_THREADS);
}
#endif
return 0;
}
}
+
+#endif
+
+/// prefetch() preloads the given address in L1/L2 cache. This is a non
+/// blocking function and do not stalls the CPU waiting for data to be
+/// loaded from RAM, that can be very slow.
+#if defined(NO_PREFETCH)
+void prefetch(char*) {}
+#else
+
+void prefetch(char* addr) {
+
+#if defined(__INTEL_COMPILER) || defined(__ICL)
+ // This hack prevents prefetches to be optimized away by
+ // Intel compiler. Both MSVC and gcc seems not affected.
+ __asm__ ("");
+#endif
+
+ _mm_prefetch(addr, _MM_HINT_T2);
+ _mm_prefetch(addr+64, _MM_HINT_T2); // 64 bytes ahead
+}
+
#endif
+