mirror of
https://github.com/xmrig/xmrig.git
synced 2025-12-08 08:23:34 -05:00
Compare commits
20 Commits
v6.22.1
...
57f8b51d2f
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
57f8b51d2f | ||
|
|
36fdfa2694 | ||
|
|
6cfc02d24f | ||
|
|
16ecb8f085 | ||
|
|
0229c65232 | ||
|
|
4a13a8a75c | ||
|
|
cd2fd9d7a6 | ||
|
|
064cd3ef20 | ||
|
|
e8bbd134f9 | ||
|
|
cf86a1e05c | ||
|
|
f9e990d0f0 | ||
|
|
200f23bba7 | ||
|
|
4234b20e21 | ||
|
|
c5d8b8265b | ||
|
|
77c14c8362 | ||
|
|
8b03750806 | ||
|
|
40949f2767 | ||
|
|
56c447e02a | ||
|
|
21c206f05d | ||
|
|
ead82cdba9 |
@@ -1,3 +1,7 @@
|
|||||||
|
# v6.22.2
|
||||||
|
- [#3569](https://github.com/xmrig/xmrig/pull/3569) Fixed corrupted API output in some rare conditions.
|
||||||
|
- [#3571](https://github.com/xmrig/xmrig/pull/3571) Fixed number of threads on the new Intel Core Ultra CPUs.
|
||||||
|
|
||||||
# v6.22.1
|
# v6.22.1
|
||||||
- [#3531](https://github.com/xmrig/xmrig/pull/3531) Always reset nonce on RandomX dataset change.
|
- [#3531](https://github.com/xmrig/xmrig/pull/3531) Always reset nonce on RandomX dataset change.
|
||||||
- [#3534](https://github.com/xmrig/xmrig/pull/3534) Fixed threads auto-config on Zen5.
|
- [#3534](https://github.com/xmrig/xmrig/pull/3534) Fixed threads auto-config on Zen5.
|
||||||
|
|||||||
@@ -30,10 +30,10 @@
|
|||||||
#include "base/tools/Handle.h"
|
#include "base/tools/Handle.h"
|
||||||
|
|
||||||
|
|
||||||
inline static const char *format(double h, char *buf, size_t size)
|
inline static const char *format(std::pair<bool, double> h, char *buf, size_t size)
|
||||||
{
|
{
|
||||||
if (std::isnormal(h)) {
|
if (h.first) {
|
||||||
snprintf(buf, size, (h < 100.0) ? "%04.2f" : "%03.1f", h);
|
snprintf(buf, size, (h.second < 100.0) ? "%04.2f" : "%03.1f", h.second);
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,15 +80,16 @@ double xmrig::Hashrate::average() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const char *xmrig::Hashrate::format(double h, char *buf, size_t size)
|
const char *xmrig::Hashrate::format(std::pair<bool, double> h, char *buf, size_t size)
|
||||||
{
|
{
|
||||||
return ::format(h, buf, size);
|
return ::format(h, buf, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
rapidjson::Value xmrig::Hashrate::normalize(double d)
|
rapidjson::Value xmrig::Hashrate::normalize(std::pair<bool, double> d)
|
||||||
{
|
{
|
||||||
return Json::normalize(d, false);
|
using namespace rapidjson;
|
||||||
|
return d.first ? Value(floor(d.second * 100.0) / 100.0) : Value(kNullType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -122,11 +123,11 @@ rapidjson::Value xmrig::Hashrate::toJSON(size_t threadId, rapidjson::Document &d
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
double xmrig::Hashrate::hashrate(size_t index, size_t ms) const
|
std::pair<bool, double> xmrig::Hashrate::hashrate(size_t index, size_t ms) const
|
||||||
{
|
{
|
||||||
assert(index < m_threads);
|
assert(index < m_threads);
|
||||||
if (index >= m_threads) {
|
if (index >= m_threads) {
|
||||||
return nan("");
|
return { false, 0.0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t earliestHashCount = 0;
|
uint64_t earliestHashCount = 0;
|
||||||
@@ -157,17 +158,27 @@ double xmrig::Hashrate::hashrate(size_t index, size_t ms) const
|
|||||||
} while (idx != idx_start);
|
} while (idx != idx_start);
|
||||||
|
|
||||||
if (!haveFullSet || earliestStamp == 0 || lastestStamp == 0) {
|
if (!haveFullSet || earliestStamp == 0 || lastestStamp == 0) {
|
||||||
return nan("");
|
return { false, 0.0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lastestStamp - earliestStamp == 0) {
|
if (lastestHashCnt == earliestHashCount) {
|
||||||
return nan("");
|
return { true, 0.0 };
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lastestStamp == earliestStamp) {
|
||||||
|
return { false, 0.0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto hashes = static_cast<double>(lastestHashCnt - earliestHashCount);
|
const auto hashes = static_cast<double>(lastestHashCnt - earliestHashCount);
|
||||||
const auto time = static_cast<double>(lastestStamp - earliestStamp) / 1000.0;
|
const auto time = static_cast<double>(lastestStamp - earliestStamp);
|
||||||
|
|
||||||
return hashes / time;
|
const auto hr = hashes * 1000.0 / time;
|
||||||
|
|
||||||
|
if (!std::isnormal(hr)) {
|
||||||
|
return { false, 0.0 };
|
||||||
|
}
|
||||||
|
|
||||||
|
return { true, hr };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -47,16 +47,16 @@ public:
|
|||||||
Hashrate(size_t threads);
|
Hashrate(size_t threads);
|
||||||
~Hashrate();
|
~Hashrate();
|
||||||
|
|
||||||
inline double calc(size_t ms) const { const double data = hashrate(0U, ms); return std::isnormal(data) ? data : 0.0; }
|
inline std::pair<bool, double> calc(size_t ms) const { return hashrate(0U, ms); }
|
||||||
inline double calc(size_t threadId, size_t ms) const { return hashrate(threadId + 1, ms); }
|
inline std::pair<bool, double> calc(size_t threadId, size_t ms) const { return hashrate(threadId + 1, ms); }
|
||||||
inline size_t threads() const { return m_threads > 0U ? m_threads - 1U : 0U; }
|
inline size_t threads() const { return m_threads > 0U ? m_threads - 1U : 0U; }
|
||||||
inline void add(size_t threadId, uint64_t count, uint64_t timestamp) { addData(threadId + 1U, count, timestamp); }
|
inline void add(size_t threadId, uint64_t count, uint64_t timestamp) { addData(threadId + 1U, count, timestamp); }
|
||||||
inline void add(uint64_t count, uint64_t timestamp) { addData(0U, count, timestamp); }
|
inline void add(uint64_t count, uint64_t timestamp) { addData(0U, count, timestamp); }
|
||||||
|
|
||||||
double average() const;
|
double average() const;
|
||||||
|
|
||||||
static const char *format(double h, char *buf, size_t size);
|
static const char *format(std::pair<bool, double> h, char *buf, size_t size);
|
||||||
static rapidjson::Value normalize(double d);
|
static rapidjson::Value normalize(std::pair<bool, double> d);
|
||||||
|
|
||||||
# ifdef XMRIG_FEATURE_API
|
# ifdef XMRIG_FEATURE_API
|
||||||
rapidjson::Value toJSON(rapidjson::Document &doc) const;
|
rapidjson::Value toJSON(rapidjson::Document &doc) const;
|
||||||
@@ -64,7 +64,7 @@ public:
|
|||||||
# endif
|
# endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
double hashrate(size_t index, size_t ms) const;
|
std::pair<bool, double> hashrate(size_t index, size_t ms) const;
|
||||||
void addData(size_t index, uint64_t count, uint64_t timestamp);
|
void addData(size_t index, uint64_t count, uint64_t timestamp);
|
||||||
|
|
||||||
constexpr static size_t kBucketSize = 2 << 11;
|
constexpr static size_t kBucketSize = 2 << 11;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/* XMRig
|
/* XMRig
|
||||||
* Copyright (c) 2018-2021 SChernykh <https://github.com/SChernykh>
|
* Copyright (c) 2018-2024 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright (c) 2016-2021 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright (c) 2016-2024 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -19,10 +19,8 @@
|
|||||||
#ifndef XMRIG_PCITOPOLOGY_H
|
#ifndef XMRIG_PCITOPOLOGY_H
|
||||||
#define XMRIG_PCITOPOLOGY_H
|
#define XMRIG_PCITOPOLOGY_H
|
||||||
|
|
||||||
|
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
|
||||||
|
|
||||||
#include "base/tools/String.h"
|
#include "base/tools/String.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -33,7 +31,14 @@ class PciTopology
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PciTopology() = default;
|
PciTopology() = default;
|
||||||
PciTopology(uint32_t bus, uint32_t device, uint32_t function) : m_valid(true), m_bus(bus), m_device(device), m_function(function) {}
|
|
||||||
|
template<typename T>
|
||||||
|
inline PciTopology(T bus, T device, T function)
|
||||||
|
: m_valid(true),
|
||||||
|
m_bus(static_cast<uint8_t>(bus)),
|
||||||
|
m_device(static_cast<uint8_t>(device)),
|
||||||
|
m_function(static_cast<uint8_t>(function))
|
||||||
|
{}
|
||||||
|
|
||||||
inline bool isEqual(const PciTopology &other) const { return m_valid == other.m_valid && toUint32() == other.toUint32(); }
|
inline bool isEqual(const PciTopology &other) const { return m_valid == other.m_valid && toUint32() == other.toUint32(); }
|
||||||
inline bool isValid() const { return m_valid; }
|
inline bool isValid() const { return m_valid; }
|
||||||
@@ -70,4 +75,4 @@ private:
|
|||||||
} // namespace xmrig
|
} // namespace xmrig
|
||||||
|
|
||||||
|
|
||||||
#endif /* XMRIG_PCITOPOLOGY_H */
|
#endif // XMRIG_PCITOPOLOGY_H
|
||||||
|
|||||||
@@ -180,11 +180,11 @@ public:
|
|||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
mutex.lock();
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(mutex);
|
||||||
|
|
||||||
pages += status.hugePages();
|
pages += status.hugePages();
|
||||||
|
}
|
||||||
mutex.unlock();
|
|
||||||
|
|
||||||
rapidjson::Value hugepages;
|
rapidjson::Value hugepages;
|
||||||
|
|
||||||
@@ -380,13 +380,13 @@ void xmrig::CpuBackend::setJob(const Job &job)
|
|||||||
|
|
||||||
void xmrig::CpuBackend::start(IWorker *worker, bool ready)
|
void xmrig::CpuBackend::start(IWorker *worker, bool ready)
|
||||||
{
|
{
|
||||||
mutex.lock();
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(mutex);
|
||||||
|
|
||||||
if (d_ptr->status.started(worker, ready)) {
|
if (d_ptr->status.started(worker, ready)) {
|
||||||
d_ptr->status.print();
|
d_ptr->status.print();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
mutex.unlock();
|
|
||||||
|
|
||||||
if (ready) {
|
if (ready) {
|
||||||
worker->start();
|
worker->start();
|
||||||
|
|||||||
@@ -320,11 +320,16 @@ void xmrig::HwlocCpuInfo::processTopLevelCache(hwloc_obj_t cache, const Algorith
|
|||||||
L2 += l2->attr->cache.size;
|
L2 += l2->attr->cache.size;
|
||||||
L2_associativity = l2->attr->cache.associativity;
|
L2_associativity = l2->attr->cache.associativity;
|
||||||
|
|
||||||
if (L3_exclusive && l2->attr->cache.size >= scratchpad) {
|
if (L3_exclusive) {
|
||||||
|
if (vendor() == VENDOR_AMD) {
|
||||||
|
extra += std::min<size_t>(l2->attr->cache.size, scratchpad);
|
||||||
|
}
|
||||||
|
else if (l2->attr->cache.size >= scratchpad) {
|
||||||
extra += scratchpad;
|
extra += scratchpad;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// This code is supposed to run only on Intel CPUs
|
// This code is supposed to run only on Intel CPUs
|
||||||
if ((vendor() == VENDOR_INTEL) && (scratchpad == 2 * oneMiB)) {
|
if ((vendor() == VENDOR_INTEL) && (scratchpad == 2 * oneMiB)) {
|
||||||
@@ -342,7 +347,7 @@ void xmrig::HwlocCpuInfo::processTopLevelCache(hwloc_obj_t cache, const Algorith
|
|||||||
}
|
}
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_RANDOMX
|
# ifdef XMRIG_ALGO_RANDOMX
|
||||||
if ((algorithm.family() == Algorithm::RANDOM_X) && L3_exclusive && (PUs > cores.size()) && (PUs < cores.size() * 2)) {
|
if ((vendor() == VENDOR_INTEL) && (algorithm.family() == Algorithm::RANDOM_X) && L3_exclusive && (PUs < cores.size() * 2)) {
|
||||||
// Use all L3+L2 on latest Intel CPUs with P-cores, E-cores and exclusive L3 cache
|
// Use all L3+L2 on latest Intel CPUs with P-cores, E-cores and exclusive L3 cache
|
||||||
cacheHashes = (L3 + L2) / scratchpad;
|
cacheHashes = (L3 + L2) / scratchpad;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/* XMRig
|
/* XMRig
|
||||||
* Copyright (c) 2018-2021 SChernykh <https://github.com/SChernykh>
|
* Copyright (c) 2018-2024 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright (c) 2016-2021 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright (c) 2016-2024 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -227,7 +227,7 @@ public:
|
|||||||
# endif
|
# endif
|
||||||
|
|
||||||
Log::print("|" CYAN_BOLD("%3zu") " |" CYAN_BOLD("%4u") " |" YELLOW(" %7s") " |" CYAN_BOLD("%10d") " |" CYAN_BOLD("%8d") " |"
|
Log::print("|" CYAN_BOLD("%3zu") " |" CYAN_BOLD("%4u") " |" YELLOW(" %7s") " |" CYAN_BOLD("%10d") " |" CYAN_BOLD("%8d") " |"
|
||||||
CYAN_BOLD("%7d") " |" CYAN_BOLD("%3d") " |" CYAN_BOLD("%4d") " |" CYAN("%7zu") " | " GREEN("%s"),
|
CYAN_BOLD("%7d") " |" CYAN_BOLD("%3d") " |" CYAN_BOLD("%4d") " |" CYAN("%7zu") " | " GREEN_BOLD("%s"),
|
||||||
i,
|
i,
|
||||||
data.thread.index(),
|
data.thread.index(),
|
||||||
data.device.topology().toString().data(),
|
data.device.topology().toString().data(),
|
||||||
@@ -372,15 +372,20 @@ void xmrig::CudaBackend::printHashrate(bool details)
|
|||||||
|
|
||||||
char num[16 * 3] = { 0 };
|
char num[16 * 3] = { 0 };
|
||||||
|
|
||||||
const double hashrate_short = hashrate()->calc(Hashrate::ShortInterval);
|
auto hashrate_short = hashrate()->calc(Hashrate::ShortInterval);
|
||||||
const double hashrate_medium = hashrate()->calc(Hashrate::MediumInterval);
|
auto hashrate_medium = hashrate()->calc(Hashrate::MediumInterval);
|
||||||
const double hashrate_large = hashrate()->calc(Hashrate::LargeInterval);
|
auto hashrate_large = hashrate()->calc(Hashrate::LargeInterval);
|
||||||
|
|
||||||
double scale = 1.0;
|
double scale = 1.0;
|
||||||
const char* h = " H/s";
|
const char* h = " H/s";
|
||||||
|
|
||||||
if ((hashrate_short >= 1e6) || (hashrate_medium >= 1e6) || (hashrate_large >= 1e6)) {
|
if ((hashrate_short.second >= 1e6) || (hashrate_medium.second >= 1e6) || (hashrate_large.second >= 1e6)) {
|
||||||
scale = 1e-6;
|
scale = 1e-6;
|
||||||
|
|
||||||
|
hashrate_short.second *= scale;
|
||||||
|
hashrate_medium.second *= scale;
|
||||||
|
hashrate_large.second *= scale;
|
||||||
|
|
||||||
h = "MH/s";
|
h = "MH/s";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -388,12 +393,20 @@ void xmrig::CudaBackend::printHashrate(bool details)
|
|||||||
|
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
for (const auto& data : d_ptr->threads) {
|
for (const auto& data : d_ptr->threads) {
|
||||||
|
auto h0 = hashrate()->calc(i, Hashrate::ShortInterval);
|
||||||
|
auto h1 = hashrate()->calc(i, Hashrate::MediumInterval);
|
||||||
|
auto h2 = hashrate()->calc(i, Hashrate::LargeInterval);
|
||||||
|
|
||||||
|
h0.second *= scale;
|
||||||
|
h1.second *= scale;
|
||||||
|
h2.second *= scale;
|
||||||
|
|
||||||
Log::print("| %8zu | %8" PRId64 " | %8s | %8s | %8s |" CYAN_BOLD(" #%u") YELLOW(" %s") GREEN(" %s"),
|
Log::print("| %8zu | %8" PRId64 " | %8s | %8s | %8s |" CYAN_BOLD(" #%u") YELLOW(" %s") GREEN(" %s"),
|
||||||
i,
|
i,
|
||||||
data.thread.affinity(),
|
data.thread.affinity(),
|
||||||
Hashrate::format(hashrate()->calc(i, Hashrate::ShortInterval) * scale, num, sizeof num / 3),
|
Hashrate::format(h0, num, sizeof num / 3),
|
||||||
Hashrate::format(hashrate()->calc(i, Hashrate::MediumInterval) * scale, num + 16, sizeof num / 3),
|
Hashrate::format(h1, num + 16, sizeof num / 3),
|
||||||
Hashrate::format(hashrate()->calc(i, Hashrate::LargeInterval) * scale, num + 16 * 2, sizeof num / 3),
|
Hashrate::format(h2, num + 16 * 2, sizeof num / 3),
|
||||||
data.device.index(),
|
data.device.index(),
|
||||||
data.device.topology().toString().data(),
|
data.device.topology().toString().data(),
|
||||||
data.device.name().data()
|
data.device.name().data()
|
||||||
@@ -403,9 +416,9 @@ void xmrig::CudaBackend::printHashrate(bool details)
|
|||||||
}
|
}
|
||||||
|
|
||||||
Log::print(WHITE_BOLD_S "| - | - | %8s | %8s | %8s |",
|
Log::print(WHITE_BOLD_S "| - | - | %8s | %8s | %8s |",
|
||||||
Hashrate::format(hashrate_short * scale, num, sizeof num / 3),
|
Hashrate::format(hashrate_short , num, sizeof num / 3),
|
||||||
Hashrate::format(hashrate_medium * scale, num + 16, sizeof num / 3),
|
Hashrate::format(hashrate_medium, num + 16, sizeof num / 3),
|
||||||
Hashrate::format(hashrate_large * scale, num + 16 * 2, sizeof num / 3)
|
Hashrate::format(hashrate_large , num + 16 * 2, sizeof num / 3)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -452,7 +465,8 @@ void xmrig::CudaBackend::setJob(const Job &job)
|
|||||||
|
|
||||||
void xmrig::CudaBackend::start(IWorker *worker, bool ready)
|
void xmrig::CudaBackend::start(IWorker *worker, bool ready)
|
||||||
{
|
{
|
||||||
mutex.lock();
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(mutex);
|
||||||
|
|
||||||
if (d_ptr->status.started(ready)) {
|
if (d_ptr->status.started(ready)) {
|
||||||
d_ptr->status.print();
|
d_ptr->status.print();
|
||||||
@@ -460,7 +474,7 @@ void xmrig::CudaBackend::start(IWorker *worker, bool ready)
|
|||||||
CudaWorker::ready = true;
|
CudaWorker::ready = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex.unlock();
|
}
|
||||||
|
|
||||||
if (ready) {
|
if (ready) {
|
||||||
worker->start();
|
worker->start();
|
||||||
|
|||||||
@@ -5,8 +5,8 @@
|
|||||||
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
* Copyright 2018-2024 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright 2016-2024 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -22,7 +22,6 @@
|
|||||||
* 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 "backend/cuda/runners/CudaRxRunner.h"
|
#include "backend/cuda/runners/CudaRxRunner.h"
|
||||||
#include "backend/cuda/CudaLaunchData.h"
|
#include "backend/cuda/CudaLaunchData.h"
|
||||||
#include "backend/cuda/wrappers/CudaLib.h"
|
#include "backend/cuda/wrappers/CudaLib.h"
|
||||||
@@ -55,12 +54,21 @@ bool xmrig::CudaRxRunner::run(uint32_t startNonce, uint32_t *rescount, uint32_t
|
|||||||
|
|
||||||
bool xmrig::CudaRxRunner::set(const Job &job, uint8_t *blob)
|
bool xmrig::CudaRxRunner::set(const Job &job, uint8_t *blob)
|
||||||
{
|
{
|
||||||
|
if (!m_datasetHost && (m_seed != job.seed())) {
|
||||||
|
m_seed = job.seed();
|
||||||
|
|
||||||
|
if (m_ready) {
|
||||||
|
const auto *dataset = Rx::dataset(job, 0);
|
||||||
|
callWrapper(CudaLib::rxUpdateDataset(m_ctx, dataset->raw(), dataset->size(false)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const bool rc = CudaBaseRunner::set(job, blob);
|
const bool rc = CudaBaseRunner::set(job, blob);
|
||||||
if (!rc || m_ready) {
|
if (!rc || m_ready) {
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto dataset = Rx::dataset(job, 0);
|
const auto *dataset = Rx::dataset(job, 0);
|
||||||
m_ready = callWrapper(CudaLib::rxPrepare(m_ctx, dataset->raw(), dataset->size(false), m_datasetHost, m_intensity));
|
m_ready = callWrapper(CudaLib::rxPrepare(m_ctx, dataset->raw(), dataset->size(false), m_datasetHost, m_intensity));
|
||||||
|
|
||||||
return m_ready;
|
return m_ready;
|
||||||
|
|||||||
@@ -5,8 +5,8 @@
|
|||||||
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
* Copyright 2018-2024 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright 2016-2024 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "backend/cuda/runners/CudaBaseRunner.h"
|
#include "backend/cuda/runners/CudaBaseRunner.h"
|
||||||
|
#include "base/tools/Buffer.h"
|
||||||
|
|
||||||
|
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
@@ -46,6 +47,7 @@ protected:
|
|||||||
private:
|
private:
|
||||||
bool m_ready = false;
|
bool m_ready = false;
|
||||||
const bool m_datasetHost = false;
|
const bool m_datasetHost = false;
|
||||||
|
Buffer m_seed;
|
||||||
size_t m_intensity = 0;
|
size_t m_intensity = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -5,8 +5,8 @@
|
|||||||
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
* Copyright 2018-2024 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright 2016-2024 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -22,7 +22,6 @@
|
|||||||
* 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 "backend/cuda/wrappers/CudaDevice.h"
|
#include "backend/cuda/wrappers/CudaDevice.h"
|
||||||
#include "3rdparty/rapidjson/document.h"
|
#include "3rdparty/rapidjson/document.h"
|
||||||
#include "backend/cuda/CudaThreads.h"
|
#include "backend/cuda/CudaThreads.h"
|
||||||
@@ -41,7 +40,7 @@
|
|||||||
xmrig::CudaDevice::CudaDevice(uint32_t index, int32_t bfactor, int32_t bsleep) :
|
xmrig::CudaDevice::CudaDevice(uint32_t index, int32_t bfactor, int32_t bsleep) :
|
||||||
m_index(index)
|
m_index(index)
|
||||||
{
|
{
|
||||||
auto ctx = CudaLib::alloc(index, bfactor, bsleep);
|
auto *ctx = CudaLib::alloc(index, bfactor, bsleep);
|
||||||
if (!CudaLib::deviceInfo(ctx, 0, 0, Algorithm::INVALID)) {
|
if (!CudaLib::deviceInfo(ctx, 0, 0, Algorithm::INVALID)) {
|
||||||
CudaLib::release(ctx);
|
CudaLib::release(ctx);
|
||||||
|
|
||||||
@@ -50,7 +49,7 @@ xmrig::CudaDevice::CudaDevice(uint32_t index, int32_t bfactor, int32_t bsleep) :
|
|||||||
|
|
||||||
m_ctx = ctx;
|
m_ctx = ctx;
|
||||||
m_name = CudaLib::deviceName(ctx);
|
m_name = CudaLib::deviceName(ctx);
|
||||||
m_topology = PciTopology(CudaLib::deviceUint(ctx, CudaLib::DevicePciBusID), CudaLib::deviceUint(ctx, CudaLib::DevicePciDeviceID), 0);
|
m_topology = { CudaLib::deviceUint(ctx, CudaLib::DevicePciBusID), CudaLib::deviceUint(ctx, CudaLib::DevicePciDeviceID), 0U };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -19,10 +19,10 @@
|
|||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <uv.h>
|
#include <uv.h>
|
||||||
|
|
||||||
|
|
||||||
#include "backend/cuda/wrappers/CudaLib.h"
|
#include "backend/cuda/wrappers/CudaLib.h"
|
||||||
#include "base/io/Env.h"
|
#include "base/io/Env.h"
|
||||||
#include "base/io/log/Log.h"
|
#include "base/io/log/Log.h"
|
||||||
|
#include "base/io/log/Tags.h"
|
||||||
#include "base/kernel/Process.h"
|
#include "base/kernel/Process.h"
|
||||||
#include "crypto/rx/RxAlgo.h"
|
#include "crypto/rx/RxAlgo.h"
|
||||||
|
|
||||||
@@ -68,6 +68,7 @@ static const char *kPluginVersion = "pluginVersion";
|
|||||||
static const char *kRelease = "release";
|
static const char *kRelease = "release";
|
||||||
static const char *kRxHash = "rxHash";
|
static const char *kRxHash = "rxHash";
|
||||||
static const char *kRxPrepare = "rxPrepare";
|
static const char *kRxPrepare = "rxPrepare";
|
||||||
|
static const char *kRxUpdateDataset = "rxUpdateDataset";
|
||||||
static const char *kSetJob = "setJob";
|
static const char *kSetJob = "setJob";
|
||||||
static const char *kSetJob_v2 = "setJob_v2";
|
static const char *kSetJob_v2 = "setJob_v2";
|
||||||
static const char *kVersion = "version";
|
static const char *kVersion = "version";
|
||||||
@@ -92,6 +93,7 @@ using pluginVersion_t = const char * (*)();
|
|||||||
using release_t = void (*)(nvid_ctx *);
|
using release_t = void (*)(nvid_ctx *);
|
||||||
using rxHash_t = bool (*)(nvid_ctx *, uint32_t, uint64_t, uint32_t *, uint32_t *);
|
using rxHash_t = bool (*)(nvid_ctx *, uint32_t, uint64_t, uint32_t *, uint32_t *);
|
||||||
using rxPrepare_t = bool (*)(nvid_ctx *, const void *, size_t, bool, uint32_t);
|
using rxPrepare_t = bool (*)(nvid_ctx *, const void *, size_t, bool, uint32_t);
|
||||||
|
using rxUpdateDataset_t = bool (*)(nvid_ctx *, const void *, size_t);
|
||||||
using setJob_t = bool (*)(nvid_ctx *, const void *, size_t, uint32_t);
|
using setJob_t = bool (*)(nvid_ctx *, const void *, size_t, uint32_t);
|
||||||
using setJob_v2_t = bool (*)(nvid_ctx *, const void *, size_t, const char *);
|
using setJob_v2_t = bool (*)(nvid_ctx *, const void *, size_t, const char *);
|
||||||
using version_t = uint32_t (*)(Version);
|
using version_t = uint32_t (*)(Version);
|
||||||
@@ -116,6 +118,7 @@ static pluginVersion_t pPluginVersion = nullptr;
|
|||||||
static release_t pRelease = nullptr;
|
static release_t pRelease = nullptr;
|
||||||
static rxHash_t pRxHash = nullptr;
|
static rxHash_t pRxHash = nullptr;
|
||||||
static rxPrepare_t pRxPrepare = nullptr;
|
static rxPrepare_t pRxPrepare = nullptr;
|
||||||
|
static rxUpdateDataset_t pRxUpdateDataset = nullptr;
|
||||||
static setJob_t pSetJob = nullptr;
|
static setJob_t pSetJob = nullptr;
|
||||||
static setJob_v2_t pSetJob_v2 = nullptr;
|
static setJob_v2_t pSetJob_v2 = nullptr;
|
||||||
static version_t pVersion = nullptr;
|
static version_t pVersion = nullptr;
|
||||||
@@ -202,10 +205,26 @@ bool xmrig::CudaLib::rxHash(nvid_ctx *ctx, uint32_t startNonce, uint64_t target,
|
|||||||
|
|
||||||
bool xmrig::CudaLib::rxPrepare(nvid_ctx *ctx, const void *dataset, size_t datasetSize, bool dataset_host, uint32_t batchSize) noexcept
|
bool xmrig::CudaLib::rxPrepare(nvid_ctx *ctx, const void *dataset, size_t datasetSize, bool dataset_host, uint32_t batchSize) noexcept
|
||||||
{
|
{
|
||||||
|
# ifdef XMRIG_ALGO_RANDOMX
|
||||||
|
if (!pRxUpdateDataset) {
|
||||||
|
LOG_WARN("%s" YELLOW_BOLD("CUDA plugin is outdated. Please update to the latest version"), Tags::randomx());
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
return pRxPrepare(ctx, dataset, datasetSize, dataset_host, batchSize);
|
return pRxPrepare(ctx, dataset, datasetSize, dataset_host, batchSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool xmrig::CudaLib::rxUpdateDataset(nvid_ctx *ctx, const void *dataset, size_t datasetSize) noexcept
|
||||||
|
{
|
||||||
|
if (pRxUpdateDataset) {
|
||||||
|
return pRxUpdateDataset(ctx, dataset, datasetSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool xmrig::CudaLib::kawPowHash(nvid_ctx *ctx, uint8_t* job_blob, uint64_t target, uint32_t *rescount, uint32_t *resnonce, uint32_t *skipped_hashes) noexcept
|
bool xmrig::CudaLib::kawPowHash(nvid_ctx *ctx, uint8_t* job_blob, uint64_t target, uint32_t *rescount, uint32_t *resnonce, uint32_t *skipped_hashes) noexcept
|
||||||
{
|
{
|
||||||
return pKawPowHash(ctx, job_blob, target, rescount, resnonce, skipped_hashes);
|
return pKawPowHash(ctx, job_blob, target, rescount, resnonce, skipped_hashes);
|
||||||
@@ -401,5 +420,7 @@ void xmrig::CudaLib::load()
|
|||||||
DLSYM(SetJob_v2);
|
DLSYM(SetJob_v2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uv_dlsym(&cudaLib, kRxUpdateDataset, reinterpret_cast<void**>(&pRxUpdateDataset));
|
||||||
|
|
||||||
pInit();
|
pInit();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/* XMRig
|
/* XMRig
|
||||||
* Copyright (c) 2018-2021 SChernykh <https://github.com/SChernykh>
|
* Copyright (c) 2018-2024 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright (c) 2016-2021 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright (c) 2016-2024 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -71,6 +71,7 @@ public:
|
|||||||
static bool deviceInit(nvid_ctx *ctx) noexcept;
|
static bool deviceInit(nvid_ctx *ctx) noexcept;
|
||||||
static bool rxHash(nvid_ctx *ctx, uint32_t startNonce, uint64_t target, uint32_t *rescount, uint32_t *resnonce) noexcept;
|
static bool rxHash(nvid_ctx *ctx, uint32_t startNonce, uint64_t target, uint32_t *rescount, uint32_t *resnonce) noexcept;
|
||||||
static bool rxPrepare(nvid_ctx *ctx, const void *dataset, size_t datasetSize, bool dataset_host, uint32_t batchSize) noexcept;
|
static bool rxPrepare(nvid_ctx *ctx, const void *dataset, size_t datasetSize, bool dataset_host, uint32_t batchSize) noexcept;
|
||||||
|
static bool rxUpdateDataset(nvid_ctx *ctx, const void *dataset, size_t datasetSize) noexcept;
|
||||||
static bool kawPowHash(nvid_ctx *ctx, uint8_t* job_blob, uint64_t target, uint32_t *rescount, uint32_t *resnonce, uint32_t *skipped_hashes) noexcept;
|
static bool kawPowHash(nvid_ctx *ctx, uint8_t* job_blob, uint64_t target, uint32_t *rescount, uint32_t *resnonce, uint32_t *skipped_hashes) noexcept;
|
||||||
static bool kawPowPrepare(nvid_ctx *ctx, const void* cache, size_t cache_size, const void* dag_precalc, size_t dag_size, uint32_t height, const uint64_t* dag_sizes) noexcept;
|
static bool kawPowPrepare(nvid_ctx *ctx, const void* cache, size_t cache_size, const void* dag_precalc, size_t dag_size, uint32_t height, const uint64_t* dag_sizes) noexcept;
|
||||||
static bool kawPowStopHash(nvid_ctx *ctx) noexcept;
|
static bool kawPowStopHash(nvid_ctx *ctx) noexcept;
|
||||||
|
|||||||
@@ -352,15 +352,20 @@ void xmrig::OclBackend::printHashrate(bool details)
|
|||||||
|
|
||||||
char num[16 * 3] = { 0 };
|
char num[16 * 3] = { 0 };
|
||||||
|
|
||||||
const double hashrate_short = hashrate()->calc(Hashrate::ShortInterval);
|
auto hashrate_short = hashrate()->calc(Hashrate::ShortInterval);
|
||||||
const double hashrate_medium = hashrate()->calc(Hashrate::MediumInterval);
|
auto hashrate_medium = hashrate()->calc(Hashrate::MediumInterval);
|
||||||
const double hashrate_large = hashrate()->calc(Hashrate::LargeInterval);
|
auto hashrate_large = hashrate()->calc(Hashrate::LargeInterval);
|
||||||
|
|
||||||
double scale = 1.0;
|
double scale = 1.0;
|
||||||
const char* h = " H/s";
|
const char* h = " H/s";
|
||||||
|
|
||||||
if ((hashrate_short >= 1e6) || (hashrate_medium >= 1e6) || (hashrate_large >= 1e6)) {
|
if ((hashrate_short.second >= 1e6) || (hashrate_medium.second >= 1e6) || (hashrate_large.second >= 1e6)) {
|
||||||
scale = 1e-6;
|
scale = 1e-6;
|
||||||
|
|
||||||
|
hashrate_short.second *= scale;
|
||||||
|
hashrate_medium.second *= scale;
|
||||||
|
hashrate_large.second *= scale;
|
||||||
|
|
||||||
h = "MH/s";
|
h = "MH/s";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -368,12 +373,16 @@ void xmrig::OclBackend::printHashrate(bool details)
|
|||||||
|
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
for (const auto& data : d_ptr->threads) {
|
for (const auto& data : d_ptr->threads) {
|
||||||
|
auto h0 = hashrate()->calc(i, Hashrate::ShortInterval);
|
||||||
|
auto h1 = hashrate()->calc(i, Hashrate::MediumInterval);
|
||||||
|
auto h2 = hashrate()->calc(i, Hashrate::LargeInterval);
|
||||||
|
|
||||||
Log::print("| %8zu | %8" PRId64 " | %8s | %8s | %8s |" CYAN_BOLD(" #%u") YELLOW(" %s") " %s",
|
Log::print("| %8zu | %8" PRId64 " | %8s | %8s | %8s |" CYAN_BOLD(" #%u") YELLOW(" %s") " %s",
|
||||||
i,
|
i,
|
||||||
data.affinity,
|
data.affinity,
|
||||||
Hashrate::format(hashrate()->calc(i, Hashrate::ShortInterval) * scale, num, sizeof num / 3),
|
Hashrate::format(h0, num, sizeof num / 3),
|
||||||
Hashrate::format(hashrate()->calc(i, Hashrate::MediumInterval) * scale, num + 16, sizeof num / 3),
|
Hashrate::format(h1, num + 16, sizeof num / 3),
|
||||||
Hashrate::format(hashrate()->calc(i, Hashrate::LargeInterval) * scale, num + 16 * 2, sizeof num / 3),
|
Hashrate::format(h2, num + 16 * 2, sizeof num / 3),
|
||||||
data.device.index(),
|
data.device.index(),
|
||||||
data.device.topology().toString().data(),
|
data.device.topology().toString().data(),
|
||||||
data.device.printableName().data()
|
data.device.printableName().data()
|
||||||
@@ -383,9 +392,9 @@ void xmrig::OclBackend::printHashrate(bool details)
|
|||||||
}
|
}
|
||||||
|
|
||||||
Log::print(WHITE_BOLD_S "| - | - | %8s | %8s | %8s |",
|
Log::print(WHITE_BOLD_S "| - | - | %8s | %8s | %8s |",
|
||||||
Hashrate::format(hashrate_short * scale, num, sizeof num / 3),
|
Hashrate::format(hashrate_short , num, sizeof num / 3),
|
||||||
Hashrate::format(hashrate_medium * scale, num + 16, sizeof num / 3),
|
Hashrate::format(hashrate_medium, num + 16, sizeof num / 3),
|
||||||
Hashrate::format(hashrate_large * scale, num + 16 * 2, sizeof num / 3)
|
Hashrate::format(hashrate_large , num + 16 * 2, sizeof num / 3)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -438,15 +447,15 @@ void xmrig::OclBackend::setJob(const Job &job)
|
|||||||
|
|
||||||
void xmrig::OclBackend::start(IWorker *worker, bool ready)
|
void xmrig::OclBackend::start(IWorker *worker, bool ready)
|
||||||
{
|
{
|
||||||
mutex.lock();
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(mutex);
|
||||||
|
|
||||||
if (d_ptr->status.started(ready)) {
|
if (d_ptr->status.started(ready)) {
|
||||||
d_ptr->status.print();
|
d_ptr->status.print();
|
||||||
|
|
||||||
OclWorker::ready = true;
|
OclWorker::ready = true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
mutex.unlock();
|
|
||||||
|
|
||||||
if (ready) {
|
if (ready) {
|
||||||
worker->start();
|
worker->start();
|
||||||
|
|||||||
@@ -5,13 +5,7 @@ if (BUILD_STATIC AND XMRIG_OS_UNIX AND WITH_OPENCL)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (WITH_OPENCL)
|
if (WITH_OPENCL)
|
||||||
add_definitions(/DXMRIG_FEATURE_OPENCL)
|
add_definitions(/DXMRIG_FEATURE_OPENCL /DCL_USE_DEPRECATED_OPENCL_1_2_APIS)
|
||||||
add_definitions(/DCL_USE_DEPRECATED_OPENCL_1_2_APIS)
|
|
||||||
if (XMRIG_OS_APPLE)
|
|
||||||
add_definitions(/DCL_TARGET_OPENCL_VERSION=120)
|
|
||||||
elseif (WITH_OPENCL_VERSION)
|
|
||||||
add_definitions(/DCL_TARGET_OPENCL_VERSION=${WITH_OPENCL_VERSION})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(HEADERS_BACKEND_OPENCL
|
set(HEADERS_BACKEND_OPENCL
|
||||||
src/backend/opencl/cl/OclSource.h
|
src/backend/opencl/cl/OclSource.h
|
||||||
@@ -71,6 +65,13 @@ if (WITH_OPENCL)
|
|||||||
src/backend/opencl/wrappers/OclPlatform.cpp
|
src/backend/opencl/wrappers/OclPlatform.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (XMRIG_OS_APPLE)
|
||||||
|
add_definitions(/DCL_TARGET_OPENCL_VERSION=120)
|
||||||
|
list(APPEND SOURCES_BACKEND_OPENCL src/backend/opencl/wrappers/OclDevice_mac.cpp)
|
||||||
|
elseif (WITH_OPENCL_VERSION)
|
||||||
|
add_definitions(/DCL_TARGET_OPENCL_VERSION=${WITH_OPENCL_VERSION})
|
||||||
|
endif()
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
list(APPEND SOURCES_BACKEND_OPENCL src/backend/opencl/OclCache_win.cpp)
|
list(APPEND SOURCES_BACKEND_OPENCL src/backend/opencl/OclCache_win.cpp)
|
||||||
else()
|
else()
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
/* XMRig
|
/* XMRig
|
||||||
* Copyright (c) 2018-2021 SChernykh <https://github.com/SChernykh>
|
* Copyright (c) 2021 Spudz76 <https://github.com/Spudz76>
|
||||||
* Copyright (c) 2016-2021 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright (c) 2018-2024 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright (c) 2016-2024 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -17,6 +18,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "backend/opencl/wrappers/OclDevice.h"
|
#include "backend/opencl/wrappers/OclDevice.h"
|
||||||
|
#include "3rdparty/fmt/core.h"
|
||||||
#include "3rdparty/rapidjson/document.h"
|
#include "3rdparty/rapidjson/document.h"
|
||||||
#include "backend/opencl/OclGenerator.h"
|
#include "backend/opencl/OclGenerator.h"
|
||||||
#include "backend/opencl/OclThreads.h"
|
#include "backend/opencl/OclThreads.h"
|
||||||
@@ -30,19 +32,21 @@
|
|||||||
|
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
// NOLINTNEXTLINE(modernize-use-using)
|
|
||||||
typedef union
|
|
||||||
{
|
|
||||||
struct { cl_uint type; cl_uint data[5]; } raw;
|
|
||||||
struct { cl_uint type; cl_char unused[17]; cl_char bus; cl_char device; cl_char function; } pcie;
|
|
||||||
} topology_amd;
|
|
||||||
|
|
||||||
|
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
struct topology_amd {
|
||||||
|
cl_uint type;
|
||||||
|
cl_char unused[17];
|
||||||
|
cl_char bus;
|
||||||
|
cl_char device;
|
||||||
|
cl_char function;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
#ifdef XMRIG_ALGO_RANDOMX
|
#ifdef XMRIG_ALGO_RANDOMX
|
||||||
extern bool ocl_generic_rx_generator(const OclDevice &device, const Algorithm &algorithm, OclThreads &threads);
|
extern bool ocl_generic_rx_generator(const OclDevice &device, const Algorithm &algorithm, OclThreads &threads);
|
||||||
#endif
|
#endif
|
||||||
@@ -81,9 +85,11 @@ static OclVendor getPlatformVendorId(const String &vendor, const String &extensi
|
|||||||
return OCL_VENDOR_INTEL;
|
return OCL_VENDOR_INTEL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ifdef XMRIG_OS_APPLE
|
||||||
if (extensions.contains("cl_APPLE_") || vendor.contains("Apple")) {
|
if (extensions.contains("cl_APPLE_") || vendor.contains("Apple")) {
|
||||||
return OCL_VENDOR_APPLE;
|
return OCL_VENDOR_APPLE;
|
||||||
}
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
return OCL_VENDOR_UNKNOWN;
|
return OCL_VENDOR_UNKNOWN;
|
||||||
}
|
}
|
||||||
@@ -103,117 +109,16 @@ static OclVendor getVendorId(const String &vendor)
|
|||||||
return OCL_VENDOR_INTEL;
|
return OCL_VENDOR_INTEL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ifdef XMRIG_OS_APPLE
|
||||||
if (vendor.contains("Apple")) {
|
if (vendor.contains("Apple")) {
|
||||||
return OCL_VENDOR_APPLE;
|
return OCL_VENDOR_APPLE;
|
||||||
}
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
return OCL_VENDOR_UNKNOWN;
|
return OCL_VENDOR_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static OclDevice::Type getType(const String &name, const OclVendor platformVendorId)
|
|
||||||
{
|
|
||||||
if (platformVendorId == OCL_VENDOR_APPLE) {
|
|
||||||
// Apple Platform: uses product names, not gfx# or codenames
|
|
||||||
if (name.contains("AMD Radeon")) {
|
|
||||||
if (name.contains(" 450 ") ||
|
|
||||||
name.contains(" 455 ") ||
|
|
||||||
name.contains(" 460 ")) {
|
|
||||||
return OclDevice::Baffin;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name.contains(" 555 ") || name.contains(" 555X ") ||
|
|
||||||
name.contains(" 560 ") || name.contains(" 560X ") ||
|
|
||||||
name.contains(" 570 ") || name.contains(" 570X ") ||
|
|
||||||
name.contains(" 575 ") || name.contains(" 575X ")) {
|
|
||||||
return OclDevice::Polaris;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name.contains(" 580 ") || name.contains(" 580X ")) {
|
|
||||||
return OclDevice::Ellesmere;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name.contains(" Vega ")) {
|
|
||||||
if (name.contains(" 48 ") ||
|
|
||||||
name.contains(" 56 ") ||
|
|
||||||
name.contains(" 64 ") ||
|
|
||||||
name.contains(" 64X ")) {
|
|
||||||
return OclDevice::Vega_10;
|
|
||||||
}
|
|
||||||
if (name.contains(" 16 ") ||
|
|
||||||
name.contains(" 20 ") ||
|
|
||||||
name.contains(" II ")) {
|
|
||||||
return OclDevice::Vega_20;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name.contains(" 5700 ") || name.contains(" W5700X ")) {
|
|
||||||
return OclDevice::Navi_10;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name.contains(" 5600 ") || name.contains(" 5600M ")) {
|
|
||||||
return OclDevice::Navi_12;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name.contains(" 5300 ") || name.contains(" 5300M ") ||
|
|
||||||
name.contains(" 5500 ") || name.contains(" 5500M ")) {
|
|
||||||
return OclDevice::Navi_14;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name.contains(" W6800 ") || name.contains(" W6900X ")) {
|
|
||||||
return OclDevice::Navi_21;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name == "gfx900" || name == "gfx901") {
|
|
||||||
return OclDevice::Vega_10;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name == "gfx902" || name == "gfx903") {
|
|
||||||
return OclDevice::Raven;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name == "gfx906" || name == "gfx907") {
|
|
||||||
return OclDevice::Vega_20;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name == "gfx1010") {
|
|
||||||
return OclDevice::Navi_10;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name == "gfx1011") {
|
|
||||||
return OclDevice::Navi_12;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name == "gfx1012") {
|
|
||||||
return OclDevice::Navi_14;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name == "gfx1030") {
|
|
||||||
return OclDevice::Navi_21;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name == "gfx804") {
|
|
||||||
return OclDevice::Lexa;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name == "Baffin") {
|
|
||||||
return OclDevice::Baffin;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name.contains("Ellesmere")) {
|
|
||||||
return OclDevice::Ellesmere;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name == "gfx803" || name.contains("polaris")) {
|
|
||||||
return OclDevice::Polaris;
|
|
||||||
}
|
|
||||||
|
|
||||||
return OclDevice::Unknown;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace xmrig
|
} // namespace xmrig
|
||||||
|
|
||||||
|
|
||||||
@@ -231,21 +136,21 @@ xmrig::OclDevice::OclDevice(uint32_t index, cl_device_id id, cl_platform_id plat
|
|||||||
{
|
{
|
||||||
m_vendorId = getVendorId(m_vendor);
|
m_vendorId = getVendorId(m_vendor);
|
||||||
m_platformVendorId = getPlatformVendorId(m_platformVendor, m_extensions);
|
m_platformVendorId = getPlatformVendorId(m_platformVendor, m_extensions);
|
||||||
m_type = getType(m_name, m_platformVendorId);
|
m_type = getType(m_name);
|
||||||
|
|
||||||
if (m_extensions.contains("cl_amd_device_attribute_query")) {
|
if (m_extensions.contains("cl_amd_device_attribute_query")) {
|
||||||
topology_amd topology;
|
topology_amd topology{};
|
||||||
|
if (OclLib::getDeviceInfo(id, CL_DEVICE_TOPOLOGY_AMD, sizeof(topology), &topology) == CL_SUCCESS && topology.type == CL_DEVICE_TOPOLOGY_TYPE_PCIE_AMD) {
|
||||||
if (OclLib::getDeviceInfo(id, CL_DEVICE_TOPOLOGY_AMD, sizeof(topology), &topology, nullptr) == CL_SUCCESS && topology.raw.type == CL_DEVICE_TOPOLOGY_TYPE_PCIE_AMD) {
|
m_topology = { topology.bus, topology.device, topology.function };
|
||||||
m_topology = PciTopology(static_cast<uint32_t>(topology.pcie.bus), static_cast<uint32_t>(topology.pcie.device), static_cast<uint32_t>(topology.pcie.function));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_board = OclLib::getString(id, CL_DEVICE_BOARD_NAME_AMD);
|
m_board = OclLib::getString(id, CL_DEVICE_BOARD_NAME_AMD);
|
||||||
}
|
}
|
||||||
else if (m_extensions.contains("cl_nv_device_attribute_query")) {
|
else if (m_extensions.contains("cl_nv_device_attribute_query")) {
|
||||||
cl_uint bus = 0;
|
cl_uint bus = 0;
|
||||||
if (OclLib::getDeviceInfo(id, CL_DEVICE_PCI_BUS_ID_NV, sizeof (bus), &bus, nullptr) == CL_SUCCESS) {
|
if (OclLib::getDeviceInfo(id, CL_DEVICE_PCI_BUS_ID_NV, sizeof(bus), &bus) == CL_SUCCESS) {
|
||||||
cl_uint slot = OclLib::getUint(id, CL_DEVICE_PCI_SLOT_ID_NV);
|
cl_uint slot = OclLib::getUint(id, CL_DEVICE_PCI_SLOT_ID_NV);
|
||||||
m_topology = PciTopology(bus, (slot >> 3) & 0xff, slot & 7);
|
m_topology = { bus, (slot >> 3) & 0xff, slot & 7 };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -253,17 +158,11 @@ xmrig::OclDevice::OclDevice(uint32_t index, cl_device_id id, cl_platform_id plat
|
|||||||
|
|
||||||
xmrig::String xmrig::OclDevice::printableName() const
|
xmrig::String xmrig::OclDevice::printableName() const
|
||||||
{
|
{
|
||||||
const size_t size = m_board.size() + m_name.size() + 64;
|
|
||||||
char *buf = new char[size]();
|
|
||||||
|
|
||||||
if (m_board.isNull()) {
|
if (m_board.isNull()) {
|
||||||
snprintf(buf, size, GREEN_BOLD("%s"), m_name.data());
|
return fmt::format(GREEN_BOLD("{}"), m_name).c_str();
|
||||||
}
|
|
||||||
else {
|
|
||||||
snprintf(buf, size, GREEN_BOLD("%s") " (" CYAN_BOLD("%s") ")", m_board.data(), m_name.data());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return buf;
|
return fmt::format(GREEN_BOLD("{}") " (" CYAN_BOLD("{}") ")", m_board, m_name).c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -311,3 +210,35 @@ void xmrig::OclDevice::toJSON(rapidjson::Value &out, rapidjson::Document &doc) c
|
|||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef XMRIG_OS_APPLE
|
||||||
|
xmrig::OclDevice::Type xmrig::OclDevice::getType(const String &name)
|
||||||
|
{
|
||||||
|
static std::map<const char *, OclDevice::Type> types = {
|
||||||
|
{ "gfx900", Vega_10 },
|
||||||
|
{ "gfx901", Vega_10 },
|
||||||
|
{ "gfx902", Raven },
|
||||||
|
{ "gfx903", Raven },
|
||||||
|
{ "gfx906", Vega_20 },
|
||||||
|
{ "gfx907", Vega_20 },
|
||||||
|
{ "gfx1010", Navi_10 },
|
||||||
|
{ "gfx1011", Navi_12 },
|
||||||
|
{ "gfx1012", Navi_14 },
|
||||||
|
{ "gfx1030", Navi_21 },
|
||||||
|
{ "gfx804", Lexa },
|
||||||
|
{ "Baffin", Baffin },
|
||||||
|
{ "Ellesmere", Ellesmere },
|
||||||
|
{ "gfx803", Polaris },
|
||||||
|
{ "polaris", Polaris },
|
||||||
|
};
|
||||||
|
|
||||||
|
for (auto &kv : types) {
|
||||||
|
if (name.contains(kv.first)) {
|
||||||
|
return kv.second;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return OclDevice::Unknown;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/* XMRig
|
/* XMRig
|
||||||
* Copyright (c) 2018-2021 SChernykh <https://github.com/SChernykh>
|
* Copyright (c) 2018-2024 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright (c) 2016-2021 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright (c) 2016-2024 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -86,6 +86,8 @@ public:
|
|||||||
# endif
|
# endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
static OclDevice::Type getType(const String &name);
|
||||||
|
|
||||||
cl_device_id m_id = nullptr;
|
cl_device_id m_id = nullptr;
|
||||||
cl_platform_id m_platform = nullptr;
|
cl_platform_id m_platform = nullptr;
|
||||||
const String m_platformVendor;
|
const String m_platformVendor;
|
||||||
|
|||||||
77
src/backend/opencl/wrappers/OclDevice_mac.cpp
Normal file
77
src/backend/opencl/wrappers/OclDevice_mac.cpp
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
/* XMRig
|
||||||
|
* Copyright (c) 2021 Spudz76 <https://github.com/Spudz76>
|
||||||
|
* Copyright (c) 2018-2024 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright (c) 2016-2024 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "backend/opencl/wrappers/OclDevice.h"
|
||||||
|
|
||||||
|
|
||||||
|
xmrig::OclDevice::Type xmrig::OclDevice::getType(const String &name)
|
||||||
|
{
|
||||||
|
// Apple Platform: uses product names, not gfx# or codenames
|
||||||
|
if (name.contains("AMD Radeon")) {
|
||||||
|
if (name.contains(" 450 ") ||
|
||||||
|
name.contains(" 455 ") ||
|
||||||
|
name.contains(" 460 ")) {
|
||||||
|
return Baffin;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name.contains(" 555 ") || name.contains(" 555X ") ||
|
||||||
|
name.contains(" 560 ") || name.contains(" 560X ") ||
|
||||||
|
name.contains(" 570 ") || name.contains(" 570X ") ||
|
||||||
|
name.contains(" 575 ") || name.contains(" 575X ")) {
|
||||||
|
return Polaris;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name.contains(" 580 ") || name.contains(" 580X ")) {
|
||||||
|
return Ellesmere;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name.contains(" Vega ")) {
|
||||||
|
if (name.contains(" 48 ") ||
|
||||||
|
name.contains(" 56 ") ||
|
||||||
|
name.contains(" 64 ") ||
|
||||||
|
name.contains(" 64X ")) {
|
||||||
|
return Vega_10;
|
||||||
|
}
|
||||||
|
if (name.contains(" 16 ") ||
|
||||||
|
name.contains(" 20 ") ||
|
||||||
|
name.contains(" II ")) {
|
||||||
|
return Vega_20;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name.contains(" 5700 ") || name.contains(" W5700X ")) {
|
||||||
|
return Navi_10;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name.contains(" 5600 ") || name.contains(" 5600M ")) {
|
||||||
|
return Navi_12;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name.contains(" 5300 ") || name.contains(" 5300M ") ||
|
||||||
|
name.contains(" 5500 ") || name.contains(" 5500M ")) {
|
||||||
|
return Navi_14;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name.contains(" W6800 ") || name.contains(" W6900X ")) {
|
||||||
|
return Navi_21;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return OclDevice::Unknown;
|
||||||
|
}
|
||||||
@@ -173,7 +173,7 @@ public:
|
|||||||
Value total(kArrayType);
|
Value total(kArrayType);
|
||||||
Value threads(kArrayType);
|
Value threads(kArrayType);
|
||||||
|
|
||||||
double t[3] = { 0.0 };
|
std::pair<bool, double> t[3] = { { true, 0.0 }, { true, 0.0 }, { true, 0.0 } };
|
||||||
|
|
||||||
for (IBackend *backend : backends) {
|
for (IBackend *backend : backends) {
|
||||||
const Hashrate *hr = backend->hashrate();
|
const Hashrate *hr = backend->hashrate();
|
||||||
@@ -181,9 +181,13 @@ public:
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
t[0] += hr->calc(Hashrate::ShortInterval);
|
const auto h0 = hr->calc(Hashrate::ShortInterval);
|
||||||
t[1] += hr->calc(Hashrate::MediumInterval);
|
const auto h1 = hr->calc(Hashrate::MediumInterval);
|
||||||
t[2] += hr->calc(Hashrate::LargeInterval);
|
const auto h2 = hr->calc(Hashrate::LargeInterval);
|
||||||
|
|
||||||
|
if (h0.first) { t[0].second += h0.second; } else { t[0].first = false; }
|
||||||
|
if (h1.first) { t[1].second += h1.second; } else { t[1].first = false; }
|
||||||
|
if (h2.first) { t[2].second += h2.second; } else { t[2].first = false; }
|
||||||
|
|
||||||
if (version > 1) {
|
if (version > 1) {
|
||||||
continue;
|
continue;
|
||||||
@@ -204,7 +208,7 @@ public:
|
|||||||
total.PushBack(Hashrate::normalize(t[2]), allocator);
|
total.PushBack(Hashrate::normalize(t[2]), allocator);
|
||||||
|
|
||||||
hashrate.AddMember("total", total, allocator);
|
hashrate.AddMember("total", total, allocator);
|
||||||
hashrate.AddMember("highest", Hashrate::normalize(maxHashrate[algorithm]), allocator);
|
hashrate.AddMember("highest", Hashrate::normalize({ maxHashrate[algorithm] > 0.0, maxHashrate[algorithm] }), allocator);
|
||||||
|
|
||||||
if (version == 1) {
|
if (version == 1) {
|
||||||
hashrate.AddMember("threads", threads, allocator);
|
hashrate.AddMember("threads", threads, allocator);
|
||||||
@@ -283,7 +287,7 @@ public:
|
|||||||
void printHashrate(bool details)
|
void printHashrate(bool details)
|
||||||
{
|
{
|
||||||
char num[16 * 5] = { 0 };
|
char num[16 * 5] = { 0 };
|
||||||
double speed[3] = { 0.0 };
|
std::pair<bool, double> speed[3] = { { true, 0.0 }, { true, 0.0 }, { true, 0.0 } };
|
||||||
uint32_t count = 0;
|
uint32_t count = 0;
|
||||||
|
|
||||||
double avg_hashrate = 0.0;
|
double avg_hashrate = 0.0;
|
||||||
@@ -293,9 +297,13 @@ public:
|
|||||||
if (hashrate) {
|
if (hashrate) {
|
||||||
++count;
|
++count;
|
||||||
|
|
||||||
speed[0] += hashrate->calc(Hashrate::ShortInterval);
|
const auto h0 = hashrate->calc(Hashrate::ShortInterval);
|
||||||
speed[1] += hashrate->calc(Hashrate::MediumInterval);
|
const auto h1 = hashrate->calc(Hashrate::MediumInterval);
|
||||||
speed[2] += hashrate->calc(Hashrate::LargeInterval);
|
const auto h2 = hashrate->calc(Hashrate::LargeInterval);
|
||||||
|
|
||||||
|
if (h0.first) { speed[0].second += h0.second; } else { speed[0].first = false; }
|
||||||
|
if (h1.first) { speed[1].second += h1.second; } else { speed[1].first = false; }
|
||||||
|
if (h2.first) { speed[2].second += h2.second; } else { speed[2].first = false; }
|
||||||
|
|
||||||
avg_hashrate += hashrate->average();
|
avg_hashrate += hashrate->average();
|
||||||
}
|
}
|
||||||
@@ -312,8 +320,13 @@ public:
|
|||||||
double scale = 1.0;
|
double scale = 1.0;
|
||||||
const char* h = "H/s";
|
const char* h = "H/s";
|
||||||
|
|
||||||
if ((speed[0] >= 1e6) || (speed[1] >= 1e6) || (speed[2] >= 1e6) || (maxHashrate[algorithm] >= 1e6)) {
|
if ((speed[0].second >= 1e6) || (speed[1].second >= 1e6) || (speed[2].second >= 1e6) || (maxHashrate[algorithm] >= 1e6)) {
|
||||||
scale = 1e-6;
|
scale = 1e-6;
|
||||||
|
|
||||||
|
speed[0].second *= scale;
|
||||||
|
speed[1].second *= scale;
|
||||||
|
speed[2].second *= scale;
|
||||||
|
|
||||||
h = "MH/s";
|
h = "MH/s";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -322,16 +335,16 @@ public:
|
|||||||
|
|
||||||
# ifdef XMRIG_ALGO_GHOSTRIDER
|
# ifdef XMRIG_ALGO_GHOSTRIDER
|
||||||
if (algorithm.family() == Algorithm::GHOSTRIDER) {
|
if (algorithm.family() == Algorithm::GHOSTRIDER) {
|
||||||
snprintf(avg_hashrate_buf, sizeof(avg_hashrate_buf), " avg " CYAN_BOLD("%s %s"), Hashrate::format(avg_hashrate * scale, num + 16 * 4, 16), h);
|
snprintf(avg_hashrate_buf, sizeof(avg_hashrate_buf), " avg " CYAN_BOLD("%s %s"), Hashrate::format({ true, avg_hashrate * scale }, num + 16 * 4, 16), h);
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
LOG_INFO("%s " WHITE_BOLD("speed") " 10s/60s/15m " CYAN_BOLD("%s") CYAN(" %s %s ") CYAN_BOLD("%s") " max " CYAN_BOLD("%s %s") "%s",
|
LOG_INFO("%s " WHITE_BOLD("speed") " 10s/60s/15m " CYAN_BOLD("%s") CYAN(" %s %s ") CYAN_BOLD("%s") " max " CYAN_BOLD("%s %s") "%s",
|
||||||
Tags::miner(),
|
Tags::miner(),
|
||||||
Hashrate::format(speed[0] * scale, num, 16),
|
Hashrate::format(speed[0], num, 16),
|
||||||
Hashrate::format(speed[1] * scale, num + 16, 16),
|
Hashrate::format(speed[1], num + 16, 16),
|
||||||
Hashrate::format(speed[2] * scale, num + 16 * 2, 16), h,
|
Hashrate::format(speed[2], num + 16 * 2, 16), h,
|
||||||
Hashrate::format(maxHashrate[algorithm] * scale, num + 16 * 3, 16), h,
|
Hashrate::format({ maxHashrate[algorithm] > 0.0, maxHashrate[algorithm] * scale }, num + 16 * 3, 16), h,
|
||||||
avg_hashrate_buf
|
avg_hashrate_buf
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -556,7 +569,14 @@ void xmrig::Miner::setJob(const Job &job, bool donate)
|
|||||||
|
|
||||||
d_ptr->algorithm = job.algorithm();
|
d_ptr->algorithm = job.algorithm();
|
||||||
|
|
||||||
mutex.lock();
|
# ifdef XMRIG_ALGO_RANDOMX
|
||||||
|
bool ready = false;
|
||||||
|
# else
|
||||||
|
constexpr const bool ready = true;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(mutex);
|
||||||
|
|
||||||
const uint8_t index = donate ? 1 : 0;
|
const uint8_t index = donate ? 1 : 0;
|
||||||
|
|
||||||
@@ -575,14 +595,12 @@ void xmrig::Miner::setJob(const Job &job, bool donate)
|
|||||||
}
|
}
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_RANDOMX
|
# ifdef XMRIG_ALGO_RANDOMX
|
||||||
const bool ready = d_ptr->initRX();
|
ready = d_ptr->initRX();
|
||||||
|
|
||||||
// Always reset nonce on RandomX dataset change
|
// Always reset nonce on RandomX dataset change
|
||||||
if (!ready) {
|
if (!ready) {
|
||||||
d_ptr->reset = true;
|
d_ptr->reset = true;
|
||||||
}
|
}
|
||||||
# else
|
|
||||||
constexpr const bool ready = true;
|
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_GHOSTRIDER
|
# ifdef XMRIG_ALGO_GHOSTRIDER
|
||||||
@@ -591,7 +609,7 @@ void xmrig::Miner::setJob(const Job &job, bool donate)
|
|||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
mutex.unlock();
|
}
|
||||||
|
|
||||||
d_ptr->active = true;
|
d_ptr->active = true;
|
||||||
d_ptr->m_taskbar.setActive(true);
|
d_ptr->m_taskbar.setActive(true);
|
||||||
@@ -646,7 +664,10 @@ void xmrig::Miner::onTimer(const Timer *)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (backend->hashrate()) {
|
if (backend->hashrate()) {
|
||||||
maxHashrate += backend->hashrate()->calc(Hashrate::ShortInterval);
|
const auto h = backend->hashrate()->calc(Hashrate::ShortInterval);
|
||||||
|
if (h.first) {
|
||||||
|
maxHashrate += h.second;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/* XMRig
|
/* XMRig
|
||||||
* Copyright (c) 2018-2019 tevador <tevador@gmail.com>
|
* Copyright (c) 2018-2019 tevador <tevador@gmail.com>
|
||||||
* Copyright (c) 2018-2020 SChernykh <https://github.com/SChernykh>
|
* Copyright (c) 2018-2024 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright (c) 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright (c) 2016-2024 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -17,9 +17,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 "crypto/rx/RxBasicStorage.h"
|
#include "crypto/rx/RxBasicStorage.h"
|
||||||
#include "backend/common/Tags.h"
|
|
||||||
#include "base/io/log/Log.h"
|
#include "base/io/log/Log.h"
|
||||||
#include "base/io/log/Tags.h"
|
#include "base/io/log/Tags.h"
|
||||||
#include "base/tools/Chrono.h"
|
#include "base/tools/Chrono.h"
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
#define APP_ID "xmrig"
|
#define APP_ID "xmrig"
|
||||||
#define APP_NAME "XMRig"
|
#define APP_NAME "XMRig"
|
||||||
#define APP_DESC "XMRig miner"
|
#define APP_DESC "XMRig miner"
|
||||||
#define APP_VERSION "6.22.1"
|
#define APP_VERSION "6.22.3-dev"
|
||||||
#define APP_DOMAIN "xmrig.com"
|
#define APP_DOMAIN "xmrig.com"
|
||||||
#define APP_SITE "www.xmrig.com"
|
#define APP_SITE "www.xmrig.com"
|
||||||
#define APP_COPYRIGHT "Copyright (C) 2016-2024 xmrig.com"
|
#define APP_COPYRIGHT "Copyright (C) 2016-2024 xmrig.com"
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
#define APP_VER_MAJOR 6
|
#define APP_VER_MAJOR 6
|
||||||
#define APP_VER_MINOR 22
|
#define APP_VER_MINOR 22
|
||||||
#define APP_VER_PATCH 1
|
#define APP_VER_PATCH 3
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
# if (_MSC_VER >= 1930)
|
# if (_MSC_VER >= 1930)
|
||||||
|
|||||||
Reference in New Issue
Block a user