Added CPU vendor enum.

This commit is contained in:
XMRig 2019-12-10 12:49:42 +07:00
parent 6163d27f14
commit 3b4b230cab
No known key found for this signature in database
GPG key ID: 446A53638BE94409
6 changed files with 33 additions and 18 deletions

View file

@ -37,6 +37,12 @@ namespace xmrig {
class ICpuInfo class ICpuInfo
{ {
public: public:
enum Vendor {
VENDOR_UNKNOWN,
VENDOR_INTEL,
VENDOR_AMD
};
virtual ~ICpuInfo() = default; virtual ~ICpuInfo() = default;
# if defined(__x86_64__) || defined(_M_AMD64) || defined (__arm64__) || defined (__aarch64__) # if defined(__x86_64__) || defined(_M_AMD64) || defined (__arm64__) || defined (__aarch64__)
@ -58,6 +64,7 @@ public:
virtual size_t nodes() const = 0; virtual size_t nodes() const = 0;
virtual size_t packages() const = 0; virtual size_t packages() const = 0;
virtual size_t threads() const = 0; virtual size_t threads() const = 0;
virtual Vendor vendor() const = 0;
}; };

View file

@ -103,6 +103,13 @@ xmrig::AdvancedCpuInfo::AdvancedCpuInfo() :
cpu_brand_string(m_brand, data.brand_str); cpu_brand_string(m_brand, data.brand_str);
snprintf(m_backend, sizeof m_backend, "libcpuid/%s", cpuid_lib_version()); snprintf(m_backend, sizeof m_backend, "libcpuid/%s", cpuid_lib_version());
if (data.vendor == ::VENDOR_INTEL) {
m_vendor = VENDOR_INTEL;
}
else if (data.vendor == ::VENDOR_AMD) {
m_vendor = VENDOR_AMD;
}
m_threads = static_cast<size_t>(data.total_logical_cpus); m_threads = static_cast<size_t>(data.total_logical_cpus);
m_packages = std::max<size_t>(threads() / static_cast<size_t>(data.num_logical_cpus), 1); m_packages = std::max<size_t>(threads() / static_cast<size_t>(data.num_logical_cpus), 1);
m_cores = static_cast<size_t>(data.num_cores) * m_packages; m_cores = static_cast<size_t>(data.num_cores) * m_packages;
@ -111,13 +118,13 @@ xmrig::AdvancedCpuInfo::AdvancedCpuInfo() :
const auto l2 = static_cast<size_t>(data.l2_cache); const auto l2 = static_cast<size_t>(data.l2_cache);
// Workaround for AMD CPUs https://github.com/anrieff/libcpuid/issues/97 // Workaround for AMD CPUs https://github.com/anrieff/libcpuid/issues/97
if (data.vendor == VENDOR_AMD && data.ext_family >= 0x15 && data.ext_family < 0x17) { if (m_vendor == VENDOR_AMD && data.ext_family >= 0x15 && data.ext_family < 0x17) {
m_L2 = l2 * (cores() / 2) * m_packages; m_L2 = l2 * (cores() / 2) * m_packages;
m_L2_exclusive = true; m_L2_exclusive = true;
} }
// Workaround for Intel Pentium Dual-Core, Core Duo, Core 2 Duo, Core 2 Quad and their Xeon homologue // Workaround for Intel Pentium Dual-Core, Core Duo, Core 2 Duo, Core 2 Quad and their Xeon homologue
// These processors have L2 cache shared by 2 cores. // These processors have L2 cache shared by 2 cores.
else if (data.vendor == VENDOR_INTEL && data.ext_family == 0x06 && (data.ext_model == 0x0E || data.ext_model == 0x0F || data.ext_model == 0x17)) { else if (m_vendor == VENDOR_INTEL && data.ext_family == 0x06 && (data.ext_model == 0x0E || data.ext_model == 0x0F || data.ext_model == 0x17)) {
size_t l2_count_per_socket = cores() > 1 ? cores() / 2 : 1; size_t l2_count_per_socket = cores() > 1 ? cores() / 2 : 1;
m_L2 = data.l2_cache > 0 ? l2 * l2_count_per_socket * m_packages : 0; m_L2 = data.l2_cache > 0 ? l2 * l2_count_per_socket * m_packages : 0;
} }
@ -131,10 +138,10 @@ xmrig::AdvancedCpuInfo::AdvancedCpuInfo() :
if (data.flags[CPU_FEATURE_AES]) { if (data.flags[CPU_FEATURE_AES]) {
m_aes = true; m_aes = true;
if (data.vendor == VENDOR_AMD) { if (m_vendor == VENDOR_AMD) {
m_assembly = (data.ext_family >= 23) ? Assembly::RYZEN : Assembly::BULLDOZER; m_assembly = (data.ext_family >= 23) ? Assembly::RYZEN : Assembly::BULLDOZER;
} }
else if (data.vendor == VENDOR_INTEL) { else if (m_vendor == VENDOR_INTEL) {
m_assembly = Assembly::INTEL; m_assembly = Assembly::INTEL;
} }
} }

View file

@ -52,6 +52,7 @@ protected:
inline size_t nodes() const override { return 0; } inline size_t nodes() const override { return 0; }
inline size_t packages() const override { return m_packages; } inline size_t packages() const override { return m_packages; }
inline size_t threads() const override { return m_threads; } inline size_t threads() const override { return m_threads; }
inline Vendor vendor() const override { return m_vendor; }
private: private:
Assembly m_assembly; Assembly m_assembly;
@ -66,6 +67,7 @@ private:
size_t m_L3 = 0; size_t m_L3 = 0;
size_t m_packages = 1; size_t m_packages = 1;
size_t m_threads = 0; size_t m_threads = 0;
Vendor m_vendor = VENDOR_UNKNOWN;
}; };

View file

@ -151,9 +151,7 @@ static inline bool has_pdpe1gb()
xmrig::BasicCpuInfo::BasicCpuInfo() : xmrig::BasicCpuInfo::BasicCpuInfo() :
m_brand(),
m_threads(std::thread::hardware_concurrency()), m_threads(std::thread::hardware_concurrency()),
m_assembly(Assembly::NONE),
m_aes(has_aes_ni()), m_aes(has_aes_ni()),
m_avx2(has_avx2()), m_avx2(has_avx2()),
m_pdpe1gb(has_pdpe1gb()) m_pdpe1gb(has_pdpe1gb())
@ -172,12 +170,15 @@ xmrig::BasicCpuInfo::BasicCpuInfo() :
memcpy(vendor + 8, &data[2], 4); memcpy(vendor + 8, &data[2], 4);
if (memcmp(vendor, "AuthenticAMD", 12) == 0) { if (memcmp(vendor, "AuthenticAMD", 12) == 0) {
m_vendor = VENDOR_AMD;
cpuid(PROCESSOR_INFO, data); cpuid(PROCESSOR_INFO, data);
const int32_t family = get_masked(data[EAX_Reg], 12, 8) + get_masked(data[EAX_Reg], 28, 20); const int32_t family = get_masked(data[EAX_Reg], 12, 8) + get_masked(data[EAX_Reg], 28, 20);
m_assembly = family >= 23 ? Assembly::RYZEN : Assembly::BULLDOZER; m_assembly = family >= 23 ? Assembly::RYZEN : Assembly::BULLDOZER;
} }
else { else if (memcmp(vendor, "GenuineIntel", 12) == 0) {
m_vendor = VENDOR_INTEL;
m_assembly = Assembly::INTEL; m_assembly = Assembly::INTEL;
} }
} }

View file

@ -52,16 +52,18 @@ protected:
inline size_t nodes() const override { return 0; } inline size_t nodes() const override { return 0; }
inline size_t packages() const override { return 1; } inline size_t packages() const override { return 1; }
inline size_t threads() const override { return m_threads; } inline size_t threads() const override { return m_threads; }
inline Vendor vendor() const override { return m_vendor; }
protected: protected:
char m_brand[64 + 6]; char m_brand[64 + 6]{};
size_t m_threads; size_t m_threads;
private: private:
Assembly m_assembly; Assembly m_assembly = Assembly::NONE;
bool m_aes; bool m_aes = false;
const bool m_avx2; const bool m_avx2 = false;
const bool m_pdpe1gb; const bool m_pdpe1gb = false;
Vendor m_vendor = VENDOR_UNKNOWN;
}; };

View file

@ -22,7 +22,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <string.h> #include <cstring>
#include <thread> #include <thread>
@ -36,11 +36,7 @@
xmrig::BasicCpuInfo::BasicCpuInfo() : xmrig::BasicCpuInfo::BasicCpuInfo() :
m_brand(), m_threads(std::thread::hardware_concurrency())
m_threads(std::thread::hardware_concurrency()),
m_aes(false),
m_avx2(false),
m_pdpe1gb(false)
{ {
# ifdef XMRIG_ARMv8 # ifdef XMRIG_ARMv8
memcpy(m_brand, "ARMv8", 5); memcpy(m_brand, "ARMv8", 5);