mirror of
https://github.com/xmrig/xmrig.git
synced 2025-04-13 02:01:54 +00:00
Compare commits
56 commits
Author | SHA1 | Date | |
---|---|---|---|
|
f9e990d0f0 | ||
|
200f23bba7 | ||
|
4234b20e21 | ||
|
c5d8b8265b | ||
|
77c14c8362 | ||
|
8b03750806 | ||
|
40949f2767 | ||
|
56c447e02a | ||
|
21c206f05d | ||
|
ee65b3d159 | ||
|
1f75d198d8 | ||
|
5cf2422766 | ||
|
a32f9b5b04 | ||
|
8a4792f638 | ||
|
e32731b60b | ||
|
e1ae367084 | ||
|
bc1c8358c4 | ||
|
e0af8f0c6b | ||
|
29f9c8cf4c | ||
|
26f4936f6f | ||
|
a411ee3565 | ||
|
01bd0d48a1 | ||
|
20d555668b | ||
|
56baec762f | ||
|
17a52fb418 | ||
|
7e4caa8929 | ||
|
ef14d55aa5 | ||
|
5776fdcc20 | ||
|
fe0f69031b | ||
|
e682f89298 | ||
|
544c393f78 | ||
|
9da6ea07bd | ||
|
62bcd6e5dc | ||
|
c5f98fc5c7 | ||
|
ecb3ec0317 | ||
|
3dfeed475f | ||
|
98c775703e | ||
|
8da49f2650 | ||
|
4570187459 | ||
|
748365d6e3 | ||
|
dd7e0e520d | ||
|
ef6fb728b5 | ||
|
92ffcd34d6 | ||
|
b108845627 | ||
|
046b2a17d3 | ||
|
5342f25fbf | ||
|
5f6bcfe949 | ||
|
ecef382326 | ||
|
86f5db19d2 | ||
|
b4a47d6ed0 | ||
|
f5095247e8 | ||
|
2bb07fe633 | ||
|
a7be8cb80c | ||
|
2ce16df423 | ||
|
5eaa6c152e | ||
|
6972f727c1 |
81 changed files with 5476 additions and 4672 deletions
CHANGELOG.mdversion.h
doc
scripts
src
3rdparty/hwloc
App.cppApp_unix.cppbackend
base
crypto
io/json
kernel
net/stratum
core
crypto
ghostrider
randomx
rx
19
CHANGELOG.md
19
CHANGELOG.md
|
@ -1,3 +1,22 @@
|
|||
# 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
|
||||
- [#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.
|
||||
- [#3535](https://github.com/xmrig/xmrig/pull/3535) RandomX: tweaks for Zen5.
|
||||
- [#3539](https://github.com/xmrig/xmrig/pull/3539) Added Zen5 to `randomx_boost.sh`.
|
||||
- [#3540](https://github.com/xmrig/xmrig/pull/3540) Detect AMD engineering samples in `randomx_boost.sh`.
|
||||
|
||||
# v6.22.0
|
||||
- [#2411](https://github.com/xmrig/xmrig/pull/2411) Added support for [Yada](https://yadacoin.io/) (`rx/yada` algorithm).
|
||||
- [#3492](https://github.com/xmrig/xmrig/pull/3492) Fixed `--background` option on Unix systems.
|
||||
- [#3518](https://github.com/xmrig/xmrig/pull/3518) Possible fix for corrupted API output in rare cases.
|
||||
- [#3522](https://github.com/xmrig/xmrig/pull/3522) Removed `rx/keva` algorithm.
|
||||
- [#3525](https://github.com/xmrig/xmrig/pull/3525) Added Zen5 detection.
|
||||
- [#3528](https://github.com/xmrig/xmrig/pull/3528) Added `rx/yada` OpenCL support.
|
||||
|
||||
# v6.21.3
|
||||
- [#3462](https://github.com/xmrig/xmrig/pull/3462) RandomX: correct memcpy size for JIT initialization.
|
||||
|
||||
|
|
|
@ -13,7 +13,6 @@ Option `coin` useful for pools without [algorithm negotiation](https://xmrig.com
|
|||
| Name | Memory | Version | Description | Notes |
|
||||
|------|--------|---------|-------------|-------|
|
||||
| `kawpow` | - | 6.0.0+ | KawPow (Ravencoin) | GPU only |
|
||||
| `rx/keva` | 1 MB | 5.9.0+ | RandomKEVA (RandomX variant for Keva). | |
|
||||
| `astrobwt` | 20 MB | 5.8.0+ | AstroBWT (Dero). | |
|
||||
| `cn-pico/tlo` | 256 KB | 5.5.0+ | CryptoNight-Pico (Talleo). | |
|
||||
| `rx/sfx` | 2 MB | 5.4.0+ | RandomSFX (RandomX variant for Safex). | |
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
#!/bin/sh -e
|
||||
|
||||
HWLOC_VERSION_MAJOR="2"
|
||||
HWLOC_VERSION_MINOR="10"
|
||||
HWLOC_VERSION_PATCH="0"
|
||||
HWLOC_VERSION_MINOR="11"
|
||||
HWLOC_VERSION_PATCH="2"
|
||||
|
||||
HWLOC_VERSION="${HWLOC_VERSION_MAJOR}.${HWLOC_VERSION_MINOR}.${HWLOC_VERSION_PATCH}"
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#!/bin/sh -e
|
||||
|
||||
OPENSSL_VERSION="1.1.1s"
|
||||
OPENSSL_VERSION="1.1.1u"
|
||||
|
||||
mkdir -p deps
|
||||
mkdir -p deps/include
|
||||
|
@ -8,7 +8,7 @@ mkdir -p deps/lib
|
|||
|
||||
mkdir -p build && cd build
|
||||
|
||||
wget https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz -O openssl-${OPENSSL_VERSION}.tar.gz
|
||||
wget https://openssl.org/source/old/1.1.1/openssl-${OPENSSL_VERSION}.tar.gz -O openssl-${OPENSSL_VERSION}.tar.gz
|
||||
tar -xzf openssl-${OPENSSL_VERSION}.tar.gz
|
||||
|
||||
cd openssl-${OPENSSL_VERSION}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#!/bin/sh -e
|
||||
|
||||
OPENSSL_VERSION="3.0.13"
|
||||
OPENSSL_VERSION="3.0.15"
|
||||
|
||||
mkdir -p deps
|
||||
mkdir -p deps/include
|
||||
|
@ -8,7 +8,7 @@ mkdir -p deps/lib
|
|||
|
||||
mkdir -p build && cd build
|
||||
|
||||
wget https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz -O openssl-${OPENSSL_VERSION}.tar.gz
|
||||
wget https://github.com/openssl/openssl/releases/download/openssl-${OPENSSL_VERSION}/openssl-${OPENSSL_VERSION}.tar.gz -O openssl-${OPENSSL_VERSION}.tar.gz
|
||||
tar -xzf openssl-${OPENSSL_VERSION}.tar.gz
|
||||
|
||||
cd openssl-${OPENSSL_VERSION}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#!/bin/sh -e
|
||||
|
||||
UV_VERSION="1.48.0"
|
||||
UV_VERSION="1.49.2"
|
||||
|
||||
mkdir -p deps
|
||||
mkdir -p deps/include
|
||||
|
|
|
@ -50,7 +50,6 @@ function rx()
|
|||
'randomx_constants_monero.h',
|
||||
'randomx_constants_wow.h',
|
||||
'randomx_constants_arqma.h',
|
||||
'randomx_constants_keva.h',
|
||||
'randomx_constants_graft.h',
|
||||
'aes.cl',
|
||||
'blake2b.cl',
|
||||
|
|
|
@ -8,7 +8,7 @@ else
|
|||
modprobe msr allow_writes=on
|
||||
fi
|
||||
|
||||
if grep -E 'AMD Ryzen|AMD EPYC' /proc/cpuinfo > /dev/null;
|
||||
if grep -E 'AMD Ryzen|AMD EPYC|AuthenticAMD' /proc/cpuinfo > /dev/null;
|
||||
then
|
||||
if grep "cpu family[[:space:]]\{1,\}:[[:space:]]25" /proc/cpuinfo > /dev/null;
|
||||
then
|
||||
|
@ -28,6 +28,14 @@ if grep -E 'AMD Ryzen|AMD EPYC' /proc/cpuinfo > /dev/null;
|
|||
wrmsr -a 0xc001102b 0x2000cc10
|
||||
echo "MSR register values for Zen3 applied"
|
||||
fi
|
||||
elif grep "cpu family[[:space:]]\{1,\}:[[:space:]]26" /proc/cpuinfo > /dev/null;
|
||||
then
|
||||
echo "Detected Zen5 CPU"
|
||||
wrmsr -a 0xc0011020 0x4400000000000
|
||||
wrmsr -a 0xc0011021 0x4000000000040
|
||||
wrmsr -a 0xc0011022 0x8680000401570000
|
||||
wrmsr -a 0xc001102b 0x2040cc10
|
||||
echo "MSR register values for Zen5 applied"
|
||||
else
|
||||
echo "Detected Zen1/Zen2 CPU"
|
||||
wrmsr -a 0xc0011020 0
|
||||
|
|
67
src/3rdparty/hwloc/NEWS
vendored
67
src/3rdparty/hwloc/NEWS
vendored
|
@ -1,5 +1,5 @@
|
|||
Copyright © 2009 CNRS
|
||||
Copyright © 2009-2023 Inria. All rights reserved.
|
||||
Copyright © 2009-2024 Inria. All rights reserved.
|
||||
Copyright © 2009-2013 Université Bordeaux
|
||||
Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
||||
Copyright © 2020 Hewlett Packard Enterprise. All rights reserved.
|
||||
|
@ -17,6 +17,71 @@ bug fixes (and other actions) for each version of hwloc since version
|
|||
0.9.
|
||||
|
||||
|
||||
Version 2.11.2
|
||||
--------------
|
||||
* Add missing CPU info attrs on aarch64 on Linux.
|
||||
* Use ACPI CPPC on Linux to get better information about cpukinds,
|
||||
at least on AMD CPUs.
|
||||
* Fix crash when manipulating cpukinds after topology
|
||||
duplication, thanks to Hadrien Grasland for the report.
|
||||
* Fix missing input target checks in memattr functions,
|
||||
thanks to Hadrien Grasland for the report.
|
||||
* Fix a memory leak when ignoring NUMA distances on FreeBSD.
|
||||
* Fix build failure on old Linux distributions without accessat().
|
||||
* Fix non-Windows importing of XML topologies and CPUID dumps exported
|
||||
on Windows.
|
||||
* hwloc-calc --cpuset-output-format systemd-dbus-api now allows
|
||||
to generate AllowedCPUs information for systemd slices.
|
||||
See the hwloc-calc manpage for examples. Thanks to Pierre Neyron.
|
||||
* Some fixes in manpage EXAMPLES and split them into subsections.
|
||||
|
||||
|
||||
Version 2.11.1
|
||||
--------------
|
||||
* Fix bash completions, thanks Tavis Rudd.
|
||||
|
||||
|
||||
Version 2.11.0
|
||||
--------------
|
||||
* API
|
||||
+ Add HWLOC_MEMBIND_WEIGHTED_INTERLEAVE memory binding policy on
|
||||
Linux 6.9+. Thanks to Honggyu Kim for the patch.
|
||||
- weighted_interleave_membind is added to membind support bits.
|
||||
- The "weighted" policy is added to the hwloc-bind tool.
|
||||
+ Add hwloc_obj_set_subtype(). Thanks to Hadrien Grasland for the report.
|
||||
* GPU support
|
||||
+ Don't hide the GPU NUMA node on NVIDIA Grace Hopper.
|
||||
+ Get Intel GPU OpenCL device locality.
|
||||
+ Add bandwidths between subdevices in the LevelZero XeLinkBandwidth
|
||||
matrix.
|
||||
+ Fix PCI Gen4+ link speed of NVIDIA GPU obtained from NVML,
|
||||
thanks to Akram Sbaih for the report.
|
||||
* Windows support
|
||||
+ Fix Windows support when UNICODE is enabled, several hwloc features
|
||||
were missing, thanks to Martin for the report.
|
||||
+ Fix the enabling of CUDA in Windows CMake build,
|
||||
Thanks to Moritz Kreutzer for the patch.
|
||||
+ Fix CUDA/OpenCL test source path in Windows CMake.
|
||||
* Tools
|
||||
+ Option --best-memattr may now return multiple nodes. Additional
|
||||
configuration flags may be given to tweak its behavior.
|
||||
+ hwloc-info has a new --get-attr option to get a single attribute.
|
||||
+ hwloc-info now supports "levels", "support" and "topology"
|
||||
special keywords for backward compatibility for hwloc 3.0.
|
||||
+ The --taskset command-line option is superseded by the new
|
||||
--cpuset-output-format which also allows to export as list.
|
||||
+ hwloc-calc may now import bitmasks described as a list of bits
|
||||
with the new "--cpuset-input-format list".
|
||||
* Misc
|
||||
+ The MemoryTiersNr info attribute in the root object now says how many
|
||||
memory tiers were built. Thanks to Antoine Morvan for the report.
|
||||
+ Fix the management of infinite cpusets in the bitmap printf/sscanf
|
||||
API as well as in command-line tools.
|
||||
+ Add section "Compiling software on top of hwloc's C API" in the
|
||||
documentation with examples for GNU Make and CMake,
|
||||
thanks to Florent Pruvost for the help.
|
||||
|
||||
|
||||
Version 2.10.0
|
||||
--------------
|
||||
* Heterogeneous Memory core improvements
|
||||
|
|
10
src/3rdparty/hwloc/README
vendored
10
src/3rdparty/hwloc/README
vendored
|
@ -418,14 +418,8 @@ return 0;
|
|||
}
|
||||
|
||||
hwloc provides a pkg-config executable to obtain relevant compiler and linker
|
||||
flags. For example, it can be used thusly to compile applications that utilize
|
||||
the hwloc library (assuming GNU Make):
|
||||
|
||||
CFLAGS += $(shell pkg-config --cflags hwloc)
|
||||
LDLIBS += $(shell pkg-config --libs hwloc)
|
||||
|
||||
hwloc-hello: hwloc-hello.c
|
||||
$(CC) hwloc-hello.c $(CFLAGS) -o hwloc-hello $(LDLIBS)
|
||||
flags. See Compiling software on top of hwloc's C API for details on building
|
||||
program on top of hwloc's API using GNU Make or CMake.
|
||||
|
||||
On a machine 2 processor packages -- each package of which has two processing
|
||||
cores -- the output from running hwloc-hello could be something like the
|
||||
|
|
8
src/3rdparty/hwloc/VERSION
vendored
8
src/3rdparty/hwloc/VERSION
vendored
|
@ -8,8 +8,8 @@
|
|||
# Please update HWLOC_VERSION* in contrib/windows/hwloc_config.h too.
|
||||
|
||||
major=2
|
||||
minor=10
|
||||
release=0
|
||||
minor=11
|
||||
release=2
|
||||
|
||||
# greek is used for alpha or beta release tags. If it is non-empty,
|
||||
# it will be appended to the version number. It does not have to be
|
||||
|
@ -22,7 +22,7 @@ greek=
|
|||
|
||||
# The date when this release was created
|
||||
|
||||
date="Dec 04, 2023"
|
||||
date="Sep 26, 2024"
|
||||
|
||||
# If snapshot=1, then use the value from snapshot_version as the
|
||||
# entire hwloc version (i.e., ignore major, minor, release, and
|
||||
|
@ -41,6 +41,6 @@ snapshot_version=${major}.${minor}.${release}${greek}-git
|
|||
# 2. Version numbers are described in the Libtool current:revision:age
|
||||
# format.
|
||||
|
||||
libhwloc_so_version=22:0:7
|
||||
libhwloc_so_version=23:1:8
|
||||
|
||||
# Please also update the <TargetName> lines in contrib/windows/libhwloc.vcxproj
|
||||
|
|
481
src/3rdparty/hwloc/include/hwloc.h
vendored
481
src/3rdparty/hwloc/include/hwloc.h
vendored
File diff suppressed because it is too large
Load diff
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Copyright © 2009 CNRS
|
||||
* Copyright © 2009-2023 Inria. All rights reserved.
|
||||
* Copyright © 2009-2024 Inria. All rights reserved.
|
||||
* Copyright © 2009-2012 Université Bordeaux
|
||||
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
|
@ -11,10 +11,10 @@
|
|||
#ifndef HWLOC_CONFIG_H
|
||||
#define HWLOC_CONFIG_H
|
||||
|
||||
#define HWLOC_VERSION "2.10.0"
|
||||
#define HWLOC_VERSION "2.11.2"
|
||||
#define HWLOC_VERSION_MAJOR 2
|
||||
#define HWLOC_VERSION_MINOR 10
|
||||
#define HWLOC_VERSION_RELEASE 0
|
||||
#define HWLOC_VERSION_MINOR 11
|
||||
#define HWLOC_VERSION_RELEASE 2
|
||||
#define HWLOC_VERSION_GREEK ""
|
||||
|
||||
#define __hwloc_restrict
|
||||
|
|
24
src/3rdparty/hwloc/include/hwloc/distances.h
vendored
24
src/3rdparty/hwloc/include/hwloc/distances.h
vendored
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright © 2010-2023 Inria. All rights reserved.
|
||||
* Copyright © 2010-2024 Inria. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
*/
|
||||
|
||||
|
@ -28,18 +28,18 @@ extern "C" {
|
|||
|
||||
/** \brief Matrix of distances between a set of objects.
|
||||
*
|
||||
* This matrix often contains latencies between NUMA nodes
|
||||
* The most common matrix contains latencies between NUMA nodes
|
||||
* (as reported in the System Locality Distance Information Table (SLIT)
|
||||
* in the ACPI specification), which may or may not be physically accurate.
|
||||
* It corresponds to the latency for accessing the memory of one node
|
||||
* from a core in another node.
|
||||
* The corresponding kind is ::HWLOC_DISTANCES_KIND_FROM_OS | ::HWLOC_DISTANCES_KIND_FROM_USER.
|
||||
* The corresponding kind is ::HWLOC_DISTANCES_KIND_MEANS_LATENCY | ::HWLOC_DISTANCES_KIND_FROM_USER.
|
||||
* The name of this distances structure is "NUMALatency".
|
||||
* Others distance structures include and "XGMIBandwidth", "XGMIHops",
|
||||
* "XeLinkBandwidth" and "NVLinkBandwidth".
|
||||
*
|
||||
* The matrix may also contain bandwidths between random sets of objects,
|
||||
* possibly provided by the user, as specified in the \p kind attribute.
|
||||
* Others common distance structures include and "XGMIBandwidth", "XGMIHops",
|
||||
* "XeLinkBandwidth" and "NVLinkBandwidth".
|
||||
*
|
||||
* Pointers \p objs and \p values should not be replaced, reallocated, freed, etc.
|
||||
* However callers are allowed to modify \p kind as well as the contents
|
||||
|
@ -70,11 +70,10 @@ struct hwloc_distances_s {
|
|||
* The \p kind attribute of struct hwloc_distances_s is a OR'ed set
|
||||
* of kinds.
|
||||
*
|
||||
* A kind of format HWLOC_DISTANCES_KIND_FROM_* specifies where the
|
||||
* distance information comes from, if known.
|
||||
*
|
||||
* A kind of format HWLOC_DISTANCES_KIND_MEANS_* specifies whether
|
||||
* values are latencies or bandwidths, if applicable.
|
||||
* Each distance matrix may have only one kind among HWLOC_DISTANCES_KIND_FROM_*
|
||||
* specifying where distance information comes from,
|
||||
* and one kind among HWLOC_DISTANCES_KIND_MEANS_* specifying
|
||||
* whether values are latencies or bandwidths.
|
||||
*/
|
||||
enum hwloc_distances_kind_e {
|
||||
/** \brief These distances were obtained from the operating system or hardware.
|
||||
|
@ -357,6 +356,8 @@ typedef void * hwloc_distances_add_handle_t;
|
|||
* Otherwise, it will be copied internally and may later be freed by the caller.
|
||||
*
|
||||
* \p kind specifies the kind of distance as a OR'ed set of ::hwloc_distances_kind_e.
|
||||
* Only one kind of meaning and one kind of provenance may be given if appropriate
|
||||
* (e.g. ::HWLOC_DISTANCES_KIND_MEANS_BANDWIDTH and ::HWLOC_DISTANCES_KIND_FROM_USER).
|
||||
* Kind ::HWLOC_DISTANCES_KIND_HETEROGENEOUS_TYPES will be automatically set
|
||||
* according to objects having different types in hwloc_distances_add_values().
|
||||
*
|
||||
|
@ -403,7 +404,8 @@ HWLOC_DECLSPEC int hwloc_distances_add_values(hwloc_topology_t topology,
|
|||
/** \brief Flags for adding a new distances to a topology. */
|
||||
enum hwloc_distances_add_flag_e {
|
||||
/** \brief Try to group objects based on the newly provided distance information.
|
||||
* This is ignored for distances between objects of different types.
|
||||
* Grouping is only performed when the distances structure contains latencies,
|
||||
* and when all objects are of the same type.
|
||||
* \hideinitializer
|
||||
*/
|
||||
HWLOC_DISTANCES_ADD_FLAG_GROUP = (1UL<<0),
|
||||
|
|
12
src/3rdparty/hwloc/include/hwloc/helper.h
vendored
12
src/3rdparty/hwloc/include/hwloc/helper.h
vendored
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Copyright © 2009 CNRS
|
||||
* Copyright © 2009-2023 Inria. All rights reserved.
|
||||
* Copyright © 2009-2024 Inria. All rights reserved.
|
||||
* Copyright © 2009-2012 Université Bordeaux
|
||||
* Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
|
@ -946,6 +946,14 @@ enum hwloc_distrib_flags_e {
|
|||
*
|
||||
* \return 0 on success, -1 on error.
|
||||
*
|
||||
* \note On hybrid CPUs (or asymmetric platforms), distribution may be suboptimal
|
||||
* since the number of cores or PUs inside packages or below caches may vary
|
||||
* (the top-down recursive partitioning ignores these numbers until reaching their levels).
|
||||
* Hence it is recommended to distribute only inside a single homogeneous domain.
|
||||
* For instance on a CPU with energy-efficient E-cores and high-performance P-cores,
|
||||
* one should distribute separately N tasks on E-cores and M tasks on P-cores
|
||||
* instead of trying to distribute directly M+N tasks on the entire CPUs.
|
||||
*
|
||||
* \note This function requires the \p roots objects to have a CPU set.
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
|
@ -960,7 +968,7 @@ hwloc_distrib(hwloc_topology_t topology,
|
|||
unsigned given, givenweight;
|
||||
hwloc_cpuset_t *cpusetp = set;
|
||||
|
||||
if (flags & ~HWLOC_DISTRIB_FLAG_REVERSE) {
|
||||
if (!n || (flags & ~HWLOC_DISTRIB_FLAG_REVERSE)) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
|
248
src/3rdparty/hwloc/include/hwloc/memattrs.h
vendored
248
src/3rdparty/hwloc/include/hwloc/memattrs.h
vendored
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright © 2019-2023 Inria. All rights reserved.
|
||||
* Copyright © 2019-2024 Inria. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
*/
|
||||
|
||||
|
@ -69,7 +69,10 @@ extern "C" {
|
|||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Memory node attributes. */
|
||||
/** \brief Predefined memory attribute IDs.
|
||||
* See ::hwloc_memattr_id_t for the generic definition of IDs
|
||||
* for predefined or custom attributes.
|
||||
*/
|
||||
enum hwloc_memattr_id_e {
|
||||
/** \brief
|
||||
* The \"Capacity\" is returned in bytes (local_memory attribute in objects).
|
||||
|
@ -78,6 +81,8 @@ enum hwloc_memattr_id_e {
|
|||
*
|
||||
* No initiator is involved when looking at this attribute.
|
||||
* The corresponding attribute flags are ::HWLOC_MEMATTR_FLAG_HIGHER_FIRST.
|
||||
*
|
||||
* Capacity values may not be modified using hwloc_memattr_set_value().
|
||||
* \hideinitializer
|
||||
*/
|
||||
HWLOC_MEMATTR_ID_CAPACITY = 0,
|
||||
|
@ -93,6 +98,8 @@ enum hwloc_memattr_id_e {
|
|||
*
|
||||
* No initiator is involved when looking at this attribute.
|
||||
* The corresponding attribute flags are ::HWLOC_MEMATTR_FLAG_HIGHER_FIRST.
|
||||
|
||||
* Locality values may not be modified using hwloc_memattr_set_value().
|
||||
* \hideinitializer
|
||||
*/
|
||||
HWLOC_MEMATTR_ID_LOCALITY = 1,
|
||||
|
@ -173,11 +180,19 @@ enum hwloc_memattr_id_e {
|
|||
|
||||
/* TODO persistence? */
|
||||
|
||||
HWLOC_MEMATTR_ID_MAX /**< \private Sentinel value */
|
||||
HWLOC_MEMATTR_ID_MAX /**< \private
|
||||
* Sentinel value for predefined attributes.
|
||||
* Dynamically registered custom attributes start here.
|
||||
*/
|
||||
};
|
||||
|
||||
/** \brief A memory attribute identifier.
|
||||
* May be either one of ::hwloc_memattr_id_e or a new id returned by hwloc_memattr_register().
|
||||
*
|
||||
* hwloc predefines some commonly-used attributes in ::hwloc_memattr_id_e.
|
||||
* One may then dynamically register custom ones with hwloc_memattr_register(),
|
||||
* they will be assigned IDs immediately after the predefined ones.
|
||||
* See \ref hwlocality_memattrs_manage for more information about
|
||||
* existing attribute IDs.
|
||||
*/
|
||||
typedef unsigned hwloc_memattr_id_t;
|
||||
|
||||
|
@ -283,6 +298,10 @@ hwloc_get_local_numanode_objs(hwloc_topology_t topology,
|
|||
* (it does not have the flag ::HWLOC_MEMATTR_FLAG_NEED_INITIATOR),
|
||||
* location \p initiator is ignored and may be \c NULL.
|
||||
*
|
||||
* \p target_node cannot be \c NULL. If \p attribute is ::HWLOC_MEMATTR_ID_CAPACITY,
|
||||
* \p target_node must be a NUMA node. If it is ::HWLOC_MEMATTR_ID_LOCALITY,
|
||||
* \p target_node must have a CPU set.
|
||||
*
|
||||
* \p flags must be \c 0 for now.
|
||||
*
|
||||
* \return 0 on success.
|
||||
|
@ -352,6 +371,8 @@ hwloc_memattr_get_best_target(hwloc_topology_t topology,
|
|||
* The returned initiator should not be modified or freed,
|
||||
* it belongs to the topology.
|
||||
*
|
||||
* \p target_node cannot be \c NULL.
|
||||
*
|
||||
* \p flags must be \c 0 for now.
|
||||
*
|
||||
* \return 0 on success.
|
||||
|
@ -362,100 +383,10 @@ hwloc_memattr_get_best_target(hwloc_topology_t topology,
|
|||
HWLOC_DECLSPEC int
|
||||
hwloc_memattr_get_best_initiator(hwloc_topology_t topology,
|
||||
hwloc_memattr_id_t attribute,
|
||||
hwloc_obj_t target,
|
||||
hwloc_obj_t target_node,
|
||||
unsigned long flags,
|
||||
struct hwloc_location *best_initiator, hwloc_uint64_t *value);
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
/** \defgroup hwlocality_memattrs_manage Managing memory attributes
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Return the name of a memory attribute.
|
||||
*
|
||||
* \return 0 on success.
|
||||
* \return -1 with errno set to \c EINVAL if the attribute does not exist.
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_memattr_get_name(hwloc_topology_t topology,
|
||||
hwloc_memattr_id_t attribute,
|
||||
const char **name);
|
||||
|
||||
/** \brief Return the flags of the given attribute.
|
||||
*
|
||||
* Flags are a OR'ed set of ::hwloc_memattr_flag_e.
|
||||
*
|
||||
* \return 0 on success.
|
||||
* \return -1 with errno set to \c EINVAL if the attribute does not exist.
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_memattr_get_flags(hwloc_topology_t topology,
|
||||
hwloc_memattr_id_t attribute,
|
||||
unsigned long *flags);
|
||||
|
||||
/** \brief Memory attribute flags.
|
||||
* Given to hwloc_memattr_register() and returned by hwloc_memattr_get_flags().
|
||||
*/
|
||||
enum hwloc_memattr_flag_e {
|
||||
/** \brief The best nodes for this memory attribute are those with the higher values.
|
||||
* For instance Bandwidth.
|
||||
*/
|
||||
HWLOC_MEMATTR_FLAG_HIGHER_FIRST = (1UL<<0),
|
||||
/** \brief The best nodes for this memory attribute are those with the lower values.
|
||||
* For instance Latency.
|
||||
*/
|
||||
HWLOC_MEMATTR_FLAG_LOWER_FIRST = (1UL<<1),
|
||||
/** \brief The value returned for this memory attribute depends on the given initiator.
|
||||
* For instance Bandwidth and Latency, but not Capacity.
|
||||
*/
|
||||
HWLOC_MEMATTR_FLAG_NEED_INITIATOR = (1UL<<2)
|
||||
};
|
||||
|
||||
/** \brief Register a new memory attribute.
|
||||
*
|
||||
* Add a specific memory attribute that is not defined in ::hwloc_memattr_id_e.
|
||||
* Flags are a OR'ed set of ::hwloc_memattr_flag_e. It must contain at least
|
||||
* one of ::HWLOC_MEMATTR_FLAG_HIGHER_FIRST or ::HWLOC_MEMATTR_FLAG_LOWER_FIRST.
|
||||
*
|
||||
* \return 0 on success.
|
||||
* \return -1 with errno set to \c EBUSY if another attribute already uses this name.
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_memattr_register(hwloc_topology_t topology,
|
||||
const char *name,
|
||||
unsigned long flags,
|
||||
hwloc_memattr_id_t *id);
|
||||
|
||||
/** \brief Set an attribute value for a specific target NUMA node.
|
||||
*
|
||||
* If the attribute does not relate to a specific initiator
|
||||
* (it does not have the flag ::HWLOC_MEMATTR_FLAG_NEED_INITIATOR),
|
||||
* location \p initiator is ignored and may be \c NULL.
|
||||
*
|
||||
* The initiator will be copied into the topology,
|
||||
* the caller should free anything allocated to store the initiator,
|
||||
* for instance the cpuset.
|
||||
*
|
||||
* \p flags must be \c 0 for now.
|
||||
*
|
||||
* \note The initiator \p initiator should be of type ::HWLOC_LOCATION_TYPE_CPUSET
|
||||
* when referring to accesses performed by CPU cores.
|
||||
* ::HWLOC_LOCATION_TYPE_OBJECT is currently unused internally by hwloc,
|
||||
* but users may for instance use it to provide custom information about
|
||||
* host memory accesses performed by GPUs.
|
||||
*
|
||||
* \return 0 on success or -1 on error.
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_memattr_set_value(hwloc_topology_t topology,
|
||||
hwloc_memattr_id_t attribute,
|
||||
hwloc_obj_t target_node,
|
||||
struct hwloc_location *initiator,
|
||||
unsigned long flags,
|
||||
hwloc_uint64_t value);
|
||||
|
||||
/** \brief Return the target NUMA nodes that have some values for a given attribute.
|
||||
*
|
||||
* Return targets for the given attribute in the \p targets array
|
||||
|
@ -519,6 +450,8 @@ hwloc_memattr_get_targets(hwloc_topology_t topology,
|
|||
* The returned initiators should not be modified or freed,
|
||||
* they belong to the topology.
|
||||
*
|
||||
* \p target_node cannot be \c NULL.
|
||||
*
|
||||
* \p flags must be \c 0 for now.
|
||||
*
|
||||
* If the attribute does not relate to a specific initiator
|
||||
|
@ -538,6 +471,131 @@ hwloc_memattr_get_initiators(hwloc_topology_t topology,
|
|||
hwloc_obj_t target_node,
|
||||
unsigned long flags,
|
||||
unsigned *nr, struct hwloc_location *initiators, hwloc_uint64_t *values);
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
/** \defgroup hwlocality_memattrs_manage Managing memory attributes
|
||||
*
|
||||
* Memory attribues are identified by an ID (::hwloc_memattr_id_t)
|
||||
* and a name. hwloc_memattr_get_name() and hwloc_memattr_get_by_name()
|
||||
* convert between them (or return error if the attribute does not exist).
|
||||
*
|
||||
* The set of valid ::hwloc_memattr_id_t is a contigous set starting at \c 0.
|
||||
* It first contains predefined attributes, as listed
|
||||
* in ::hwloc_memattr_id_e (from \c 0 to \c HWLOC_MEMATTR_ID_MAX-1).
|
||||
* Then custom attributes may be dynamically registered with
|
||||
* hwloc_memattr_register(). They will get the following IDs
|
||||
* (\c HWLOC_MEMATTR_ID_MAX for the first one, etc.).
|
||||
*
|
||||
* To iterate over all valid attributes
|
||||
* (either predefined or dynamically registered custom ones),
|
||||
* one may iterate over IDs starting from \c 0 until hwloc_memattr_get_name()
|
||||
* or hwloc_memattr_get_flags() returns an error.
|
||||
*
|
||||
* The values for an existing attribute or for custom dynamically registered ones
|
||||
* may be set or modified with hwloc_memattr_set_value().
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Return the name of a memory attribute.
|
||||
*
|
||||
* The output pointer \p name cannot be \c NULL.
|
||||
*
|
||||
* \return 0 on success.
|
||||
* \return -1 with errno set to \c EINVAL if the attribute does not exist.
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_memattr_get_name(hwloc_topology_t topology,
|
||||
hwloc_memattr_id_t attribute,
|
||||
const char **name);
|
||||
|
||||
/** \brief Return the flags of the given attribute.
|
||||
*
|
||||
* Flags are a OR'ed set of ::hwloc_memattr_flag_e.
|
||||
*
|
||||
* The output pointer \p flags cannot be \c NULL.
|
||||
*
|
||||
* \return 0 on success.
|
||||
* \return -1 with errno set to \c EINVAL if the attribute does not exist.
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_memattr_get_flags(hwloc_topology_t topology,
|
||||
hwloc_memattr_id_t attribute,
|
||||
unsigned long *flags);
|
||||
|
||||
/** \brief Memory attribute flags.
|
||||
* Given to hwloc_memattr_register() and returned by hwloc_memattr_get_flags().
|
||||
*/
|
||||
enum hwloc_memattr_flag_e {
|
||||
/** \brief The best nodes for this memory attribute are those with the higher values.
|
||||
* For instance Bandwidth.
|
||||
*/
|
||||
HWLOC_MEMATTR_FLAG_HIGHER_FIRST = (1UL<<0),
|
||||
/** \brief The best nodes for this memory attribute are those with the lower values.
|
||||
* For instance Latency.
|
||||
*/
|
||||
HWLOC_MEMATTR_FLAG_LOWER_FIRST = (1UL<<1),
|
||||
/** \brief The value returned for this memory attribute depends on the given initiator.
|
||||
* For instance Bandwidth and Latency, but not Capacity.
|
||||
*/
|
||||
HWLOC_MEMATTR_FLAG_NEED_INITIATOR = (1UL<<2)
|
||||
};
|
||||
|
||||
/** \brief Register a new memory attribute.
|
||||
*
|
||||
* Add a new custom memory attribute.
|
||||
* Flags are a OR'ed set of ::hwloc_memattr_flag_e. It must contain one of
|
||||
* ::HWLOC_MEMATTR_FLAG_HIGHER_FIRST or ::HWLOC_MEMATTR_FLAG_LOWER_FIRST but not both.
|
||||
*
|
||||
* The new attribute \p id is immediately after the last existing attribute ID
|
||||
* (which is either the ID of the last registered attribute if any,
|
||||
* or the ID of the last predefined attribute in ::hwloc_memattr_id_e).
|
||||
*
|
||||
* \return 0 on success.
|
||||
* \return -1 with errno set to \c EINVAL if an invalid set of flags is given.
|
||||
* \return -1 with errno set to \c EBUSY if another attribute already uses this name.
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_memattr_register(hwloc_topology_t topology,
|
||||
const char *name,
|
||||
unsigned long flags,
|
||||
hwloc_memattr_id_t *id);
|
||||
|
||||
/** \brief Set an attribute value for a specific target NUMA node.
|
||||
*
|
||||
* If the attribute does not relate to a specific initiator
|
||||
* (it does not have the flag ::HWLOC_MEMATTR_FLAG_NEED_INITIATOR),
|
||||
* location \p initiator is ignored and may be \c NULL.
|
||||
*
|
||||
* The initiator will be copied into the topology,
|
||||
* the caller should free anything allocated to store the initiator,
|
||||
* for instance the cpuset.
|
||||
*
|
||||
* \p target_node cannot be \c NULL.
|
||||
*
|
||||
* \p attribute cannot be ::HWLOC_MEMATTR_FLAG_ID_CAPACITY or
|
||||
* ::HWLOC_MEMATTR_FLAG_ID_LOCALITY.
|
||||
*
|
||||
* \p flags must be \c 0 for now.
|
||||
*
|
||||
* \note The initiator \p initiator should be of type ::HWLOC_LOCATION_TYPE_CPUSET
|
||||
* when referring to accesses performed by CPU cores.
|
||||
* ::HWLOC_LOCATION_TYPE_OBJECT is currently unused internally by hwloc,
|
||||
* but users may for instance use it to provide custom information about
|
||||
* host memory accesses performed by GPUs.
|
||||
*
|
||||
* \return 0 on success or -1 on error.
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_memattr_set_value(hwloc_topology_t topology,
|
||||
hwloc_memattr_id_t attribute,
|
||||
hwloc_obj_t target_node,
|
||||
struct hwloc_location *initiator,
|
||||
unsigned long flags,
|
||||
hwloc_uint64_t value);
|
||||
|
||||
/** @} */
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
19
src/3rdparty/hwloc/include/hwloc/opencl.h
vendored
19
src/3rdparty/hwloc/include/hwloc/opencl.h
vendored
|
@ -41,6 +41,15 @@ extern "C" {
|
|||
*/
|
||||
/* Copyright (c) 2008-2018 The Khronos Group Inc. */
|
||||
|
||||
/* needs "cl_khr_pci_bus_info" device extension, but not strictly required for clGetDeviceInfo() */
|
||||
typedef struct {
|
||||
cl_uint pci_domain;
|
||||
cl_uint pci_bus;
|
||||
cl_uint pci_device;
|
||||
cl_uint pci_function;
|
||||
} hwloc_cl_device_pci_bus_info_khr;
|
||||
#define HWLOC_CL_DEVICE_PCI_BUS_INFO_KHR 0x410F
|
||||
|
||||
/* needs "cl_amd_device_attribute_query" device extension, but not strictly required for clGetDeviceInfo() */
|
||||
#define HWLOC_CL_DEVICE_TOPOLOGY_AMD 0x4037
|
||||
typedef union {
|
||||
|
@ -78,9 +87,19 @@ hwloc_opencl_get_device_pci_busid(cl_device_id device,
|
|||
unsigned *domain, unsigned *bus, unsigned *dev, unsigned *func)
|
||||
{
|
||||
hwloc_cl_device_topology_amd amdtopo;
|
||||
hwloc_cl_device_pci_bus_info_khr khrbusinfo;
|
||||
cl_uint nvbus, nvslot, nvdomain;
|
||||
cl_int clret;
|
||||
|
||||
clret = clGetDeviceInfo(device, HWLOC_CL_DEVICE_PCI_BUS_INFO_KHR, sizeof(khrbusinfo), &khrbusinfo, NULL);
|
||||
if (CL_SUCCESS == clret) {
|
||||
*domain = (unsigned) khrbusinfo.pci_domain;
|
||||
*bus = (unsigned) khrbusinfo.pci_bus;
|
||||
*dev = (unsigned) khrbusinfo.pci_device;
|
||||
*func = (unsigned) khrbusinfo.pci_function;
|
||||
return 0;
|
||||
}
|
||||
|
||||
clret = clGetDeviceInfo(device, HWLOC_CL_DEVICE_TOPOLOGY_AMD, sizeof(amdtopo), &amdtopo, NULL);
|
||||
if (CL_SUCCESS == clret
|
||||
&& HWLOC_CL_DEVICE_TOPOLOGY_TYPE_PCIE_AMD == amdtopo.raw.type) {
|
||||
|
|
15
src/3rdparty/hwloc/include/hwloc/plugins.h
vendored
15
src/3rdparty/hwloc/include/hwloc/plugins.h
vendored
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright © 2013-2022 Inria. All rights reserved.
|
||||
* Copyright © 2013-2024 Inria. All rights reserved.
|
||||
* Copyright © 2016 Cisco Systems, Inc. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
*/
|
||||
|
@ -645,6 +645,19 @@ HWLOC_DECLSPEC struct hwloc_obj * hwloc_pci_find_parent_by_busid(struct hwloc_to
|
|||
*/
|
||||
HWLOC_DECLSPEC struct hwloc_obj * hwloc_pci_find_by_busid(struct hwloc_topology *topology, unsigned domain, unsigned bus, unsigned dev, unsigned func);
|
||||
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
|
||||
|
||||
/** \defgroup hwlocality_components_distances Components and Plugins: distances
|
||||
*
|
||||
* \note These structures and functions may change when ::HWLOC_COMPONENT_ABI is modified.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Handle to a new distances structure during its addition to the topology. */
|
||||
typedef void * hwloc_backend_distances_add_handle_t;
|
||||
|
||||
|
|
7
src/3rdparty/hwloc/include/hwloc/rename.h
vendored
7
src/3rdparty/hwloc/include/hwloc/rename.h
vendored
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright © 2010-2022 Inria. All rights reserved.
|
||||
* Copyright © 2010-2024 Inria. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
*/
|
||||
|
||||
|
@ -210,6 +210,7 @@ extern "C" {
|
|||
|
||||
#define hwloc_obj_get_info_by_name HWLOC_NAME(obj_get_info_by_name)
|
||||
#define hwloc_obj_add_info HWLOC_NAME(obj_add_info)
|
||||
#define hwloc_obj_set_subtype HWLOC_NAME(obj_set_subtype)
|
||||
|
||||
#define HWLOC_CPUBIND_PROCESS HWLOC_NAME_CAPS(CPUBIND_PROCESS)
|
||||
#define HWLOC_CPUBIND_THREAD HWLOC_NAME_CAPS(CPUBIND_THREAD)
|
||||
|
@ -232,6 +233,7 @@ extern "C" {
|
|||
#define HWLOC_MEMBIND_FIRSTTOUCH HWLOC_NAME_CAPS(MEMBIND_FIRSTTOUCH)
|
||||
#define HWLOC_MEMBIND_BIND HWLOC_NAME_CAPS(MEMBIND_BIND)
|
||||
#define HWLOC_MEMBIND_INTERLEAVE HWLOC_NAME_CAPS(MEMBIND_INTERLEAVE)
|
||||
#define HWLOC_MEMBIND_WEIGHTED_INTERLEAVE HWLOC_NAME_CAPS(MEMBIND_WEIGHTED_INTERLEAVE)
|
||||
#define HWLOC_MEMBIND_NEXTTOUCH HWLOC_NAME_CAPS(MEMBIND_NEXTTOUCH)
|
||||
#define HWLOC_MEMBIND_MIXED HWLOC_NAME_CAPS(MEMBIND_MIXED)
|
||||
|
||||
|
@ -560,6 +562,7 @@ extern "C" {
|
|||
|
||||
/* opencl.h */
|
||||
|
||||
#define hwloc_cl_device_pci_bus_info_khr HWLOC_NAME(cl_device_pci_bus_info_khr)
|
||||
#define hwloc_cl_device_topology_amd HWLOC_NAME(cl_device_topology_amd)
|
||||
#define hwloc_opencl_get_device_pci_busid HWLOC_NAME(opencl_get_device_pci_ids)
|
||||
#define hwloc_opencl_get_device_cpuset HWLOC_NAME(opencl_get_device_cpuset)
|
||||
|
@ -715,6 +718,8 @@ extern "C" {
|
|||
#define hwloc__obj_type_is_dcache HWLOC_NAME(_obj_type_is_dcache)
|
||||
#define hwloc__obj_type_is_icache HWLOC_NAME(_obj_type_is_icache)
|
||||
|
||||
#define hwloc__pci_link_speed HWLOC_NAME(_pci_link_speed)
|
||||
|
||||
/* private/cpuid-x86.h */
|
||||
|
||||
#define hwloc_have_x86_cpuid HWLOC_NAME(have_x86_cpuid)
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Copyright © 2009, 2011, 2012 CNRS. All rights reserved.
|
||||
* Copyright © 2009-2021 Inria. All rights reserved.
|
||||
* Copyright © 2009-2020 Inria. All rights reserved.
|
||||
* Copyright © 2009, 2011, 2012, 2015 Université Bordeaux. All rights reserved.
|
||||
* Copyright © 2009-2020 Cisco Systems, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
|
@ -17,6 +17,10 @@
|
|||
|
||||
#define HWLOC_HAVE_MSVC_CPUIDEX 1
|
||||
|
||||
/* #undef HAVE_MKSTEMP */
|
||||
|
||||
#define HWLOC_HAVE_X86_CPUID 1
|
||||
|
||||
/* Define to 1 if the system has the type `CACHE_DESCRIPTOR'. */
|
||||
#define HAVE_CACHE_DESCRIPTOR 0
|
||||
|
||||
|
@ -128,8 +132,7 @@
|
|||
#define HAVE_DECL__SC_PAGE_SIZE 0
|
||||
|
||||
/* Define to 1 if you have the <dirent.h> header file. */
|
||||
/* #define HAVE_DIRENT_H 1 */
|
||||
#undef HAVE_DIRENT_H
|
||||
/* #undef HAVE_DIRENT_H */
|
||||
|
||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
||||
/* #undef HAVE_DLFCN_H */
|
||||
|
@ -282,7 +285,7 @@
|
|||
#define HAVE_STRING_H 1
|
||||
|
||||
/* Define to 1 if you have the `strncasecmp' function. */
|
||||
#define HAVE_STRNCASECMP 1
|
||||
/* #undef HAVE_STRNCASECMP */
|
||||
|
||||
/* Define to '1' if sysctl is present and usable */
|
||||
/* #undef HAVE_SYSCTL */
|
||||
|
@ -323,8 +326,7 @@
|
|||
/* #undef HAVE_UNAME */
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
/* #define HAVE_UNISTD_H 1 */
|
||||
#undef HAVE_UNISTD_H
|
||||
/* #undef HAVE_UNISTD_H */
|
||||
|
||||
/* Define to 1 if you have the `uselocale' function. */
|
||||
/* #undef HAVE_USELOCALE */
|
||||
|
@ -659,7 +661,7 @@
|
|||
#define hwloc_pid_t HANDLE
|
||||
|
||||
/* Define this to either strncasecmp or strncmp */
|
||||
#define hwloc_strncasecmp strncasecmp
|
||||
/* #undef hwloc_strncasecmp */
|
||||
|
||||
/* Define this to the thread ID type */
|
||||
#define hwloc_thread_t HANDLE
|
||||
|
|
22
src/3rdparty/hwloc/include/private/cpuid-x86.h
vendored
22
src/3rdparty/hwloc/include/private/cpuid-x86.h
vendored
|
@ -11,6 +11,22 @@
|
|||
#ifndef HWLOC_PRIVATE_CPUID_X86_H
|
||||
#define HWLOC_PRIVATE_CPUID_X86_H
|
||||
|
||||
/* A macro for annotating memory as uninitialized when building with MSAN
|
||||
* (and otherwise having no effect). See below for why this is used with
|
||||
* our custom assembly.
|
||||
*/
|
||||
#ifdef __has_feature
|
||||
#define HWLOC_HAS_FEATURE(name) __has_feature(name)
|
||||
#else
|
||||
#define HWLOC_HAS_FEATURE(name) 0
|
||||
#endif
|
||||
#if HWLOC_HAS_FEATURE(memory_sanitizer) || defined(MEMORY_SANITIZER)
|
||||
#include <sanitizer/msan_interface.h>
|
||||
#define HWLOC_ANNOTATE_MEMORY_IS_INITIALIZED(ptr, len) __msan_unpoison(ptr, len)
|
||||
#else
|
||||
#define HWLOC_ANNOTATE_MEMORY_IS_INITIALIZED(ptr, len)
|
||||
#endif
|
||||
|
||||
#if (defined HWLOC_X86_32_ARCH) && (!defined HWLOC_HAVE_MSVC_CPUIDEX)
|
||||
static __hwloc_inline int hwloc_have_x86_cpuid(void)
|
||||
{
|
||||
|
@ -71,12 +87,18 @@ static __hwloc_inline void hwloc_x86_cpuid(unsigned *eax, unsigned *ebx, unsigne
|
|||
"movl %k2,%1\n\t"
|
||||
: "+a" (*eax), "=m" (*ebx), "=&r"(sav_rbx),
|
||||
"+c" (*ecx), "=&d" (*edx));
|
||||
/* MSAN does not recognize the effect of the above assembly on the memory operand
|
||||
* (`"=m"(*ebx)`). This may get improved in MSAN at some point in the future, e.g.
|
||||
* see https://github.com/llvm/llvm-project/pull/77393. */
|
||||
HWLOC_ANNOTATE_MEMORY_IS_INITIALIZED(ebx, sizeof *ebx);
|
||||
#elif defined(HWLOC_X86_32_ARCH)
|
||||
__asm__(
|
||||
"mov %%ebx,%1\n\t"
|
||||
"cpuid\n\t"
|
||||
"xchg %%ebx,%1\n\t"
|
||||
: "+a" (*eax), "=&SD" (*ebx), "+c" (*ecx), "=&d" (*edx));
|
||||
/* See above. */
|
||||
HWLOC_ANNOTATE_MEMORY_IS_INITIALIZED(ebx, sizeof *ebx);
|
||||
#else
|
||||
#error unknown architecture
|
||||
#endif
|
||||
|
|
33
src/3rdparty/hwloc/include/private/misc.h
vendored
33
src/3rdparty/hwloc/include/private/misc.h
vendored
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Copyright © 2009 CNRS
|
||||
* Copyright © 2009-2019 Inria. All rights reserved.
|
||||
* Copyright © 2009-2024 Inria. All rights reserved.
|
||||
* Copyright © 2009-2012 Université Bordeaux
|
||||
* Copyright © 2011 Cisco Systems, Inc. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
|
@ -573,4 +573,35 @@ typedef SSIZE_T ssize_t;
|
|||
# endif
|
||||
#endif
|
||||
|
||||
static __inline float
|
||||
hwloc__pci_link_speed(unsigned generation, unsigned lanes)
|
||||
{
|
||||
float lanespeed;
|
||||
/*
|
||||
* These are single-direction bandwidths only.
|
||||
*
|
||||
* Gen1 used NRZ with 8/10 encoding.
|
||||
* PCIe Gen1 = 2.5GT/s signal-rate per lane x 8/10 = 0.25GB/s data-rate per lane
|
||||
* PCIe Gen2 = 5 GT/s signal-rate per lane x 8/10 = 0.5 GB/s data-rate per lane
|
||||
* Gen3 switched to NRZ with 128/130 encoding.
|
||||
* PCIe Gen3 = 8 GT/s signal-rate per lane x 128/130 = 1 GB/s data-rate per lane
|
||||
* PCIe Gen4 = 16 GT/s signal-rate per lane x 128/130 = 2 GB/s data-rate per lane
|
||||
* PCIe Gen5 = 32 GT/s signal-rate per lane x 128/130 = 4 GB/s data-rate per lane
|
||||
* Gen6 switched to PAM with with 242/256 FLIT (242B payload protected by 8B CRC + 6B FEC).
|
||||
* PCIe Gen6 = 64 GT/s signal-rate per lane x 242/256 = 8 GB/s data-rate per lane
|
||||
* PCIe Gen7 = 128GT/s signal-rate per lane x 242/256 = 16 GB/s data-rate per lane
|
||||
*/
|
||||
|
||||
/* lanespeed in Gbit/s */
|
||||
if (generation <= 2)
|
||||
lanespeed = 2.5f * generation * 0.8f;
|
||||
else if (generation <= 5)
|
||||
lanespeed = 8.0f * (1<<(generation-3)) * 128/130;
|
||||
else
|
||||
lanespeed = 8.0f * (1<<(generation-3)) * 242/256; /* assume Gen8 will be 256 GT/s and so on */
|
||||
|
||||
/* linkspeed in GB/s */
|
||||
return lanespeed * lanes / 8;
|
||||
}
|
||||
|
||||
#endif /* HWLOC_PRIVATE_MISC_H */
|
||||
|
|
3
src/3rdparty/hwloc/src/bind.c
vendored
3
src/3rdparty/hwloc/src/bind.c
vendored
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Copyright © 2009 CNRS
|
||||
* Copyright © 2009-2020 Inria. All rights reserved.
|
||||
* Copyright © 2009-2024 Inria. All rights reserved.
|
||||
* Copyright © 2009-2010, 2012 Université Bordeaux
|
||||
* Copyright © 2011-2015 Cisco Systems, Inc. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
|
@ -287,6 +287,7 @@ static __hwloc_inline int hwloc__check_membind_policy(hwloc_membind_policy_t pol
|
|||
|| policy == HWLOC_MEMBIND_FIRSTTOUCH
|
||||
|| policy == HWLOC_MEMBIND_BIND
|
||||
|| policy == HWLOC_MEMBIND_INTERLEAVE
|
||||
|| policy == HWLOC_MEMBIND_WEIGHTED_INTERLEAVE
|
||||
|| policy == HWLOC_MEMBIND_NEXTTOUCH)
|
||||
return 0;
|
||||
return -1;
|
||||
|
|
59
src/3rdparty/hwloc/src/bitmap.c
vendored
59
src/3rdparty/hwloc/src/bitmap.c
vendored
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Copyright © 2009 CNRS
|
||||
* Copyright © 2009-2020 Inria. All rights reserved.
|
||||
* Copyright © 2009-2024 Inria. All rights reserved.
|
||||
* Copyright © 2009-2011 Université Bordeaux
|
||||
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
|
@ -245,6 +245,7 @@ int hwloc_bitmap_copy(struct hwloc_bitmap_s * dst, const struct hwloc_bitmap_s *
|
|||
/* Strings always use 32bit groups */
|
||||
#define HWLOC_PRIxSUBBITMAP "%08lx"
|
||||
#define HWLOC_BITMAP_SUBSTRING_SIZE 32
|
||||
#define HWLOC_BITMAP_SUBSTRING_FULL_VALUE 0xFFFFFFFFUL
|
||||
#define HWLOC_BITMAP_SUBSTRING_LENGTH (HWLOC_BITMAP_SUBSTRING_SIZE/4)
|
||||
#define HWLOC_BITMAP_STRING_PER_LONG (HWLOC_BITS_PER_LONG/HWLOC_BITMAP_SUBSTRING_SIZE)
|
||||
|
||||
|
@ -261,6 +262,7 @@ int hwloc_bitmap_snprintf(char * __hwloc_restrict buf, size_t buflen, const stru
|
|||
const unsigned long accum_mask = ~0UL;
|
||||
#else /* HWLOC_BITS_PER_LONG != HWLOC_BITMAP_SUBSTRING_SIZE */
|
||||
const unsigned long accum_mask = ((1UL << HWLOC_BITMAP_SUBSTRING_SIZE) - 1) << (HWLOC_BITS_PER_LONG - HWLOC_BITMAP_SUBSTRING_SIZE);
|
||||
int merge_with_infinite_prefix = 0;
|
||||
#endif /* HWLOC_BITS_PER_LONG != HWLOC_BITMAP_SUBSTRING_SIZE */
|
||||
|
||||
HWLOC__BITMAP_CHECK(set);
|
||||
|
@ -279,6 +281,9 @@ int hwloc_bitmap_snprintf(char * __hwloc_restrict buf, size_t buflen, const stru
|
|||
res = size>0 ? (int)size - 1 : 0;
|
||||
tmp += res;
|
||||
size -= res;
|
||||
#if HWLOC_BITS_PER_LONG > HWLOC_BITMAP_SUBSTRING_SIZE
|
||||
merge_with_infinite_prefix = 1;
|
||||
#endif
|
||||
}
|
||||
|
||||
i=(int) set->ulongs_count-1;
|
||||
|
@ -294,16 +299,24 @@ int hwloc_bitmap_snprintf(char * __hwloc_restrict buf, size_t buflen, const stru
|
|||
}
|
||||
|
||||
while (i>=0 || accumed) {
|
||||
unsigned long value;
|
||||
|
||||
/* Refill accumulator */
|
||||
if (!accumed) {
|
||||
accum = set->ulongs[i--];
|
||||
accumed = HWLOC_BITS_PER_LONG;
|
||||
}
|
||||
value = (accum & accum_mask) >> (HWLOC_BITS_PER_LONG - HWLOC_BITMAP_SUBSTRING_SIZE);
|
||||
|
||||
if (accum & accum_mask) {
|
||||
#if HWLOC_BITS_PER_LONG > HWLOC_BITMAP_SUBSTRING_SIZE
|
||||
if (merge_with_infinite_prefix && value == HWLOC_BITMAP_SUBSTRING_FULL_VALUE) {
|
||||
/* first full subbitmap merged with infinite prefix */
|
||||
res = 0;
|
||||
} else
|
||||
#endif
|
||||
if (value) {
|
||||
/* print the whole subset if not empty */
|
||||
res = hwloc_snprintf(tmp, size, needcomma ? ",0x" HWLOC_PRIxSUBBITMAP : "0x" HWLOC_PRIxSUBBITMAP,
|
||||
(accum & accum_mask) >> (HWLOC_BITS_PER_LONG - HWLOC_BITMAP_SUBSTRING_SIZE));
|
||||
res = hwloc_snprintf(tmp, size, needcomma ? ",0x" HWLOC_PRIxSUBBITMAP : "0x" HWLOC_PRIxSUBBITMAP, value);
|
||||
needcomma = 1;
|
||||
} else if (i == -1 && accumed == HWLOC_BITMAP_SUBSTRING_SIZE) {
|
||||
/* print a single 0 to mark the last subset */
|
||||
|
@ -323,6 +336,7 @@ int hwloc_bitmap_snprintf(char * __hwloc_restrict buf, size_t buflen, const stru
|
|||
#else
|
||||
accum <<= HWLOC_BITMAP_SUBSTRING_SIZE;
|
||||
accumed -= HWLOC_BITMAP_SUBSTRING_SIZE;
|
||||
merge_with_infinite_prefix = 0;
|
||||
#endif
|
||||
|
||||
if (res >= size)
|
||||
|
@ -362,7 +376,8 @@ int hwloc_bitmap_sscanf(struct hwloc_bitmap_s *set, const char * __hwloc_restric
|
|||
{
|
||||
const char * current = string;
|
||||
unsigned long accum = 0;
|
||||
int count=0;
|
||||
int count = 0;
|
||||
int ulongcount;
|
||||
int infinite = 0;
|
||||
|
||||
/* count how many substrings there are */
|
||||
|
@ -383,9 +398,20 @@ int hwloc_bitmap_sscanf(struct hwloc_bitmap_s *set, const char * __hwloc_restric
|
|||
count--;
|
||||
}
|
||||
|
||||
if (hwloc_bitmap_reset_by_ulongs(set, (count + HWLOC_BITMAP_STRING_PER_LONG - 1) / HWLOC_BITMAP_STRING_PER_LONG) < 0)
|
||||
ulongcount = (count + HWLOC_BITMAP_STRING_PER_LONG - 1) / HWLOC_BITMAP_STRING_PER_LONG;
|
||||
if (hwloc_bitmap_reset_by_ulongs(set, ulongcount) < 0)
|
||||
return -1;
|
||||
set->infinite = 0;
|
||||
|
||||
set->infinite = 0; /* will be updated later */
|
||||
|
||||
#if HWLOC_BITS_PER_LONG != HWLOC_BITMAP_SUBSTRING_SIZE
|
||||
if (infinite && (count % HWLOC_BITMAP_STRING_PER_LONG) != 0) {
|
||||
/* accumulate substrings of the first ulong that are hidden in the infinite prefix */
|
||||
int i;
|
||||
for(i = (count % HWLOC_BITMAP_STRING_PER_LONG); i < HWLOC_BITMAP_STRING_PER_LONG; i++)
|
||||
accum |= (HWLOC_BITMAP_SUBSTRING_FULL_VALUE << (i*HWLOC_BITMAP_SUBSTRING_SIZE));
|
||||
}
|
||||
#endif
|
||||
|
||||
while (*current != '\0') {
|
||||
unsigned long val;
|
||||
|
@ -544,6 +570,9 @@ int hwloc_bitmap_taskset_snprintf(char * __hwloc_restrict buf, size_t buflen, co
|
|||
ssize_t size = buflen;
|
||||
char *tmp = buf;
|
||||
int res, ret = 0;
|
||||
#if HWLOC_BITS_PER_LONG == 64
|
||||
int merge_with_infinite_prefix = 0;
|
||||
#endif
|
||||
int started = 0;
|
||||
int i;
|
||||
|
||||
|
@ -563,6 +592,9 @@ int hwloc_bitmap_taskset_snprintf(char * __hwloc_restrict buf, size_t buflen, co
|
|||
res = size>0 ? (int)size - 1 : 0;
|
||||
tmp += res;
|
||||
size -= res;
|
||||
#if HWLOC_BITS_PER_LONG == 64
|
||||
merge_with_infinite_prefix = 1;
|
||||
#endif
|
||||
}
|
||||
|
||||
i=set->ulongs_count-1;
|
||||
|
@ -582,7 +614,11 @@ int hwloc_bitmap_taskset_snprintf(char * __hwloc_restrict buf, size_t buflen, co
|
|||
if (started) {
|
||||
/* print the whole subset */
|
||||
#if HWLOC_BITS_PER_LONG == 64
|
||||
res = hwloc_snprintf(tmp, size, "%016lx", val);
|
||||
if (merge_with_infinite_prefix && (val & 0xffffffff00000000UL) == 0xffffffff00000000UL) {
|
||||
res = hwloc_snprintf(tmp, size, "%08lx", val & 0xffffffffUL);
|
||||
} else {
|
||||
res = hwloc_snprintf(tmp, size, "%016lx", val);
|
||||
}
|
||||
#else
|
||||
res = hwloc_snprintf(tmp, size, "%08lx", val);
|
||||
#endif
|
||||
|
@ -599,6 +635,9 @@ int hwloc_bitmap_taskset_snprintf(char * __hwloc_restrict buf, size_t buflen, co
|
|||
res = size>0 ? (int)size - 1 : 0;
|
||||
tmp += res;
|
||||
size -= res;
|
||||
#if HWLOC_BITS_PER_LONG == 64
|
||||
merge_with_infinite_prefix = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* if didn't display anything, display 0x0 */
|
||||
|
@ -679,6 +718,10 @@ int hwloc_bitmap_taskset_sscanf(struct hwloc_bitmap_s *set, const char * __hwloc
|
|||
goto failed;
|
||||
|
||||
set->ulongs[count-1] = val;
|
||||
if (infinite && tmpchars != HWLOC_BITS_PER_LONG/4) {
|
||||
/* infinite prefix with partial substring, fill remaining bits */
|
||||
set->ulongs[count-1] |= (~0ULL)<<(4*tmpchars);
|
||||
}
|
||||
|
||||
current += tmpchars;
|
||||
chars -= tmpchars;
|
||||
|
|
3
src/3rdparty/hwloc/src/cpukinds.c
vendored
3
src/3rdparty/hwloc/src/cpukinds.c
vendored
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright © 2020-2022 Inria. All rights reserved.
|
||||
* Copyright © 2020-2024 Inria. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
*/
|
||||
|
||||
|
@ -50,6 +50,7 @@ hwloc_internal_cpukinds_dup(hwloc_topology_t new, hwloc_topology_t old)
|
|||
return -1;
|
||||
new->cpukinds = kinds;
|
||||
new->nr_cpukinds = old->nr_cpukinds;
|
||||
new->nr_cpukinds_allocated = old->nr_cpukinds;
|
||||
memcpy(kinds, old->cpukinds, old->nr_cpukinds * sizeof(*kinds));
|
||||
|
||||
for(i=0;i<old->nr_cpukinds; i++) {
|
||||
|
|
6
src/3rdparty/hwloc/src/distances.c
vendored
6
src/3rdparty/hwloc/src/distances.c
vendored
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright © 2010-2022 Inria. All rights reserved.
|
||||
* Copyright © 2010-2024 Inria. All rights reserved.
|
||||
* Copyright © 2011-2012 Université Bordeaux
|
||||
* Copyright © 2011 Cisco Systems, Inc. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
|
@ -624,8 +624,8 @@ void * hwloc_distances_add_create(hwloc_topology_t topology,
|
|||
return NULL;
|
||||
}
|
||||
if ((kind & ~HWLOC_DISTANCES_KIND_ALL)
|
||||
|| hwloc_weight_long(kind & HWLOC_DISTANCES_KIND_FROM_ALL) != 1
|
||||
|| hwloc_weight_long(kind & HWLOC_DISTANCES_KIND_MEANS_ALL) != 1) {
|
||||
|| hwloc_weight_long(kind & HWLOC_DISTANCES_KIND_FROM_ALL) > 1
|
||||
|| hwloc_weight_long(kind & HWLOC_DISTANCES_KIND_MEANS_ALL) > 1) {
|
||||
errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
|
|
50
src/3rdparty/hwloc/src/memattrs.c
vendored
50
src/3rdparty/hwloc/src/memattrs.c
vendored
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright © 2020-2023 Inria. All rights reserved.
|
||||
* Copyright © 2020-2024 Inria. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
*/
|
||||
|
||||
|
@ -14,13 +14,26 @@
|
|||
*/
|
||||
|
||||
static __hwloc_inline
|
||||
hwloc_uint64_t hwloc__memattr_get_convenience_value(hwloc_memattr_id_t id,
|
||||
hwloc_obj_t node)
|
||||
int hwloc__memattr_get_convenience_value(hwloc_memattr_id_t id,
|
||||
hwloc_obj_t node,
|
||||
hwloc_uint64_t *valuep)
|
||||
{
|
||||
if (id == HWLOC_MEMATTR_ID_CAPACITY)
|
||||
return node->attr->numanode.local_memory;
|
||||
else if (id == HWLOC_MEMATTR_ID_LOCALITY)
|
||||
return hwloc_bitmap_weight(node->cpuset);
|
||||
if (id == HWLOC_MEMATTR_ID_CAPACITY) {
|
||||
if (node->type != HWLOC_OBJ_NUMANODE) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
*valuep = node->attr->numanode.local_memory;
|
||||
return 0;
|
||||
}
|
||||
else if (id == HWLOC_MEMATTR_ID_LOCALITY) {
|
||||
if (!node->cpuset) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
*valuep = hwloc_bitmap_weight(node->cpuset);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
assert(0);
|
||||
return 0; /* shut up the compiler */
|
||||
|
@ -622,7 +635,7 @@ hwloc_memattr_get_targets(hwloc_topology_t topology,
|
|||
if (found<max) {
|
||||
targets[found] = node;
|
||||
if (values)
|
||||
values[found] = hwloc__memattr_get_convenience_value(id, node);
|
||||
hwloc__memattr_get_convenience_value(id, node, &values[found]);
|
||||
}
|
||||
found++;
|
||||
}
|
||||
|
@ -748,7 +761,7 @@ hwloc_memattr_get_initiators(hwloc_topology_t topology,
|
|||
struct hwloc_internal_memattr_target_s *imtg;
|
||||
unsigned i, max;
|
||||
|
||||
if (flags) {
|
||||
if (flags || !target_node) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
@ -810,7 +823,7 @@ hwloc_memattr_get_value(hwloc_topology_t topology,
|
|||
struct hwloc_internal_memattr_s *imattr;
|
||||
struct hwloc_internal_memattr_target_s *imtg;
|
||||
|
||||
if (flags) {
|
||||
if (flags || !target_node) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
@ -823,8 +836,7 @@ hwloc_memattr_get_value(hwloc_topology_t topology,
|
|||
|
||||
if (imattr->iflags & HWLOC_IMATTR_FLAG_CONVENIENCE) {
|
||||
/* convenience attributes */
|
||||
*valuep = hwloc__memattr_get_convenience_value(id, target_node);
|
||||
return 0;
|
||||
return hwloc__memattr_get_convenience_value(id, target_node, valuep);
|
||||
}
|
||||
|
||||
/* normal attributes */
|
||||
|
@ -936,7 +948,7 @@ hwloc_memattr_set_value(hwloc_topology_t topology,
|
|||
{
|
||||
struct hwloc_internal_location_s iloc, *ilocp;
|
||||
|
||||
if (flags) {
|
||||
if (flags || !target_node) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
@ -1007,10 +1019,10 @@ hwloc_memattr_get_best_target(hwloc_topology_t topology,
|
|||
/* convenience attributes */
|
||||
for(j=0; ; j++) {
|
||||
hwloc_obj_t node = hwloc_get_obj_by_type(topology, HWLOC_OBJ_NUMANODE, j);
|
||||
hwloc_uint64_t value;
|
||||
hwloc_uint64_t value = 0;
|
||||
if (!node)
|
||||
break;
|
||||
value = hwloc__memattr_get_convenience_value(id, node);
|
||||
hwloc__memattr_get_convenience_value(id, node, &value);
|
||||
hwloc__update_best_target(&best, &best_value, &found,
|
||||
node, value,
|
||||
imattr->flags & HWLOC_MEMATTR_FLAG_HIGHER_FIRST);
|
||||
|
@ -1093,7 +1105,7 @@ hwloc_memattr_get_best_initiator(hwloc_topology_t topology,
|
|||
int found;
|
||||
unsigned i;
|
||||
|
||||
if (flags) {
|
||||
if (flags || !target_node) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
@ -1806,6 +1818,12 @@ hwloc__apply_memory_tiers_subtypes(hwloc_topology_t topology,
|
|||
}
|
||||
}
|
||||
}
|
||||
if (nr_tiers > 1) {
|
||||
hwloc_obj_t root = hwloc_get_root_obj(topology);
|
||||
char tmp[20];
|
||||
snprintf(tmp, sizeof(tmp), "%u", nr_tiers);
|
||||
hwloc__add_info_nodup(&root->infos, &root->infos_count, "MemoryTiersNr", tmp, 1);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
|
|
28
src/3rdparty/hwloc/src/pci-common.c
vendored
28
src/3rdparty/hwloc/src/pci-common.c
vendored
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright © 2009-2022 Inria. All rights reserved.
|
||||
* Copyright © 2009-2024 Inria. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
*/
|
||||
|
||||
|
@ -886,36 +886,12 @@ hwloc_pcidisc_find_linkspeed(const unsigned char *config,
|
|||
unsigned offset, float *linkspeed)
|
||||
{
|
||||
unsigned linksta, speed, width;
|
||||
float lanespeed;
|
||||
|
||||
memcpy(&linksta, &config[offset + HWLOC_PCI_EXP_LNKSTA], 4);
|
||||
speed = linksta & HWLOC_PCI_EXP_LNKSTA_SPEED; /* PCIe generation */
|
||||
width = (linksta & HWLOC_PCI_EXP_LNKSTA_WIDTH) >> 4; /* how many lanes */
|
||||
/*
|
||||
* These are single-direction bandwidths only.
|
||||
*
|
||||
* Gen1 used NRZ with 8/10 encoding.
|
||||
* PCIe Gen1 = 2.5GT/s signal-rate per lane x 8/10 = 0.25GB/s data-rate per lane
|
||||
* PCIe Gen2 = 5 GT/s signal-rate per lane x 8/10 = 0.5 GB/s data-rate per lane
|
||||
* Gen3 switched to NRZ with 128/130 encoding.
|
||||
* PCIe Gen3 = 8 GT/s signal-rate per lane x 128/130 = 1 GB/s data-rate per lane
|
||||
* PCIe Gen4 = 16 GT/s signal-rate per lane x 128/130 = 2 GB/s data-rate per lane
|
||||
* PCIe Gen5 = 32 GT/s signal-rate per lane x 128/130 = 4 GB/s data-rate per lane
|
||||
* Gen6 switched to PAM with with 242/256 FLIT (242B payload protected by 8B CRC + 6B FEC).
|
||||
* PCIe Gen6 = 64 GT/s signal-rate per lane x 242/256 = 8 GB/s data-rate per lane
|
||||
* PCIe Gen7 = 128GT/s signal-rate per lane x 242/256 = 16 GB/s data-rate per lane
|
||||
*/
|
||||
|
||||
/* lanespeed in Gbit/s */
|
||||
if (speed <= 2)
|
||||
lanespeed = 2.5f * speed * 0.8f;
|
||||
else if (speed <= 5)
|
||||
lanespeed = 8.0f * (1<<(speed-3)) * 128/130;
|
||||
else
|
||||
lanespeed = 8.0f * (1<<(speed-3)) * 242/256; /* assume Gen8 will be 256 GT/s and so on */
|
||||
|
||||
/* linkspeed in GB/s */
|
||||
*linkspeed = lanespeed * width / 8;
|
||||
*linkspeed = hwloc__pci_link_speed(speed, width);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
8
src/3rdparty/hwloc/src/topology-windows.c
vendored
8
src/3rdparty/hwloc/src/topology-windows.c
vendored
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Copyright © 2009 CNRS
|
||||
* Copyright © 2009-2023 Inria. All rights reserved.
|
||||
* Copyright © 2009-2024 Inria. All rights reserved.
|
||||
* Copyright © 2009-2012, 2020 Université Bordeaux
|
||||
* Copyright © 2011 Cisco Systems, Inc. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
|
@ -220,7 +220,7 @@ static void hwloc_win_get_function_ptrs(void)
|
|||
#pragma GCC diagnostic ignored "-Wcast-function-type"
|
||||
#endif
|
||||
|
||||
kernel32 = LoadLibrary("kernel32.dll");
|
||||
kernel32 = LoadLibrary(TEXT("kernel32.dll"));
|
||||
if (kernel32) {
|
||||
GetActiveProcessorGroupCountProc =
|
||||
(PFN_GETACTIVEPROCESSORGROUPCOUNT) GetProcAddress(kernel32, "GetActiveProcessorGroupCount");
|
||||
|
@ -249,12 +249,12 @@ static void hwloc_win_get_function_ptrs(void)
|
|||
}
|
||||
|
||||
if (!QueryWorkingSetExProc) {
|
||||
HMODULE psapi = LoadLibrary("psapi.dll");
|
||||
HMODULE psapi = LoadLibrary(TEXT("psapi.dll"));
|
||||
if (psapi)
|
||||
QueryWorkingSetExProc = (PFN_QUERYWORKINGSETEX) GetProcAddress(psapi, "QueryWorkingSetEx");
|
||||
}
|
||||
|
||||
ntdll = GetModuleHandle("ntdll");
|
||||
ntdll = GetModuleHandle(TEXT("ntdll"));
|
||||
RtlGetVersionProc = (PFN_RTLGETVERSION) GetProcAddress(ntdll, "RtlGetVersion");
|
||||
|
||||
#if HWLOC_HAVE_GCC_W_CAST_FUNCTION_TYPE
|
||||
|
|
43
src/3rdparty/hwloc/src/topology-x86.c
vendored
43
src/3rdparty/hwloc/src/topology-x86.c
vendored
|
@ -1,11 +1,11 @@
|
|||
/*
|
||||
* Copyright © 2010-2023 Inria. All rights reserved.
|
||||
* Copyright © 2010-2024 Inria. All rights reserved.
|
||||
* Copyright © 2010-2013 Université Bordeaux
|
||||
* Copyright © 2010-2011 Cisco Systems, Inc. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
*
|
||||
*
|
||||
* This backend is only used when the operating system does not export
|
||||
* This backend is mostly used when the operating system does not export
|
||||
* the necessary hardware topology information to user-space applications.
|
||||
* Currently, FreeBSD and NetBSD only add PUs and then fallback to this
|
||||
* backend for CPU/Cache discovery.
|
||||
|
@ -15,6 +15,7 @@
|
|||
* on various architectures, without having to use this x86-specific code.
|
||||
* But this backend is still used after them to annotate some objects with
|
||||
* additional details (CPU info in Package, Inclusiveness in Caches).
|
||||
* It may also be enabled manually to work-around bugs in native OS discovery.
|
||||
*/
|
||||
|
||||
#include "private/autogen/config.h"
|
||||
|
@ -487,7 +488,7 @@ static void read_amd_cores_legacy(struct procinfo *infos, struct cpuiddump *src_
|
|||
}
|
||||
|
||||
/* AMD unit/node from CPUID 0x8000001e leaf (topoext) */
|
||||
static void read_amd_cores_topoext(struct hwloc_x86_backend_data_s *data, struct procinfo *infos, unsigned long flags, struct cpuiddump *src_cpuiddump)
|
||||
static void read_amd_cores_topoext(struct hwloc_x86_backend_data_s *data, struct procinfo *infos, unsigned long flags __hwloc_attribute_unused, struct cpuiddump *src_cpuiddump)
|
||||
{
|
||||
unsigned apic_id, nodes_per_proc = 0;
|
||||
unsigned eax, ebx, ecx, edx;
|
||||
|
@ -496,7 +497,6 @@ static void read_amd_cores_topoext(struct hwloc_x86_backend_data_s *data, struct
|
|||
cpuid_or_from_dump(&eax, &ebx, &ecx, &edx, src_cpuiddump);
|
||||
infos->apicid = apic_id = eax;
|
||||
|
||||
if (flags & HWLOC_X86_DISC_FLAG_TOPOEXT_NUMANODES) {
|
||||
if (infos->cpufamilynumber == 0x16) {
|
||||
/* ecx is reserved */
|
||||
infos->ids[NODE] = 0;
|
||||
|
@ -511,7 +511,6 @@ static void read_amd_cores_topoext(struct hwloc_x86_backend_data_s *data, struct
|
|||
|| (infos->cpufamilynumber == 0x19 && nodes_per_proc > 1)) {
|
||||
hwloc_debug("warning: undefined nodes_per_proc value %u, assuming it means %u\n", nodes_per_proc, nodes_per_proc);
|
||||
}
|
||||
}
|
||||
|
||||
if (infos->cpufamilynumber <= 0x16) { /* topoext appeared in 0x15 and compute-units were only used in 0x15 and 0x16 */
|
||||
unsigned cores_per_unit;
|
||||
|
@ -533,9 +532,9 @@ static void read_amd_cores_topoext(struct hwloc_x86_backend_data_s *data, struct
|
|||
}
|
||||
|
||||
/* Intel core/thread or even die/module/tile from CPUID 0x0b or 0x1f leaves (v1 and v2 extended topology enumeration)
|
||||
* or AMD complex/ccd from CPUID 0x80000026 (extended CPU topology)
|
||||
* or AMD core/thread or even complex/ccd from CPUID 0x0b or 0x80000026 (extended CPU topology)
|
||||
*/
|
||||
static void read_extended_topo(struct hwloc_x86_backend_data_s *data, struct procinfo *infos, unsigned leaf, enum cpuid_type cpuid_type, struct cpuiddump *src_cpuiddump)
|
||||
static void read_extended_topo(struct hwloc_x86_backend_data_s *data, struct procinfo *infos, unsigned leaf, enum cpuid_type cpuid_type __hwloc_attribute_unused, struct cpuiddump *src_cpuiddump)
|
||||
{
|
||||
unsigned level, apic_nextshift, apic_type, apic_id = 0, apic_shift = 0, id;
|
||||
unsigned threadid __hwloc_attribute_unused = 0; /* shut-up compiler */
|
||||
|
@ -547,20 +546,15 @@ static void read_extended_topo(struct hwloc_x86_backend_data_s *data, struct pro
|
|||
eax = leaf;
|
||||
cpuid_or_from_dump(&eax, &ebx, &ecx, &edx, src_cpuiddump);
|
||||
/* Intel specifies that the 0x0b/0x1f loop should stop when we get "invalid domain" (0 in ecx[8:15])
|
||||
* (if so, we also get 0 in eax/ebx for invalid subleaves).
|
||||
* (if so, we also get 0 in eax/ebx for invalid subleaves). Zhaoxin implements this too.
|
||||
* However AMD rather says that the 0x80000026/0x0b loop should stop when we get "no thread at this level" (0 in ebx[0:15]).
|
||||
* Zhaoxin follows the Intel specs but also returns "no thread at this level" for the last *valid* level (at least on KH-4000).
|
||||
* From the Linux kernel code, it's very likely that AMD also returns "invalid domain"
|
||||
* (because detect_extended_topology() uses that for all x86 CPUs)
|
||||
* but keep with the official doc until AMD can clarify that (see #593).
|
||||
*
|
||||
* Linux kernel <= 6.8 used "invalid domain" for both Intel and AMD (in detect_extended_topology())
|
||||
* but x86 discovery revamp in 6.9 now properly checks both Intel and AMD conditions (in topo_subleaf()).
|
||||
* So let's assume we are allowed to break-out once one of the Intel+AMD conditions is met.
|
||||
*/
|
||||
if (cpuid_type == amd) {
|
||||
if (!(ebx & 0xffff))
|
||||
break;
|
||||
} else {
|
||||
if (!(ecx & 0xff00))
|
||||
break;
|
||||
}
|
||||
if (!(ebx & 0xffff) || !(ecx & 0xff00))
|
||||
break;
|
||||
apic_packageshift = eax & 0x1f;
|
||||
}
|
||||
|
||||
|
@ -572,13 +566,8 @@ static void read_extended_topo(struct hwloc_x86_backend_data_s *data, struct pro
|
|||
ecx = level;
|
||||
eax = leaf;
|
||||
cpuid_or_from_dump(&eax, &ebx, &ecx, &edx, src_cpuiddump);
|
||||
if (cpuid_type == amd) {
|
||||
if (!(ebx & 0xffff))
|
||||
break;
|
||||
} else {
|
||||
if (!(ecx & 0xff00))
|
||||
break;
|
||||
}
|
||||
if (!(ebx & 0xffff) || !(ecx & 0xff00))
|
||||
break;
|
||||
apic_nextshift = eax & 0x1f;
|
||||
apic_type = (ecx & 0xff00) >> 8;
|
||||
apic_id = edx;
|
||||
|
@ -1825,7 +1814,7 @@ hwloc_x86_check_cpuiddump_input(const char *src_cpuiddump_path, hwloc_bitmap_t s
|
|||
goto out_with_path;
|
||||
}
|
||||
fclose(file);
|
||||
if (strcmp(line, "Architecture: x86\n")) {
|
||||
if (strncmp(line, "Architecture: x86", 17)) {
|
||||
fprintf(stderr, "hwloc/x86: Found non-x86 dumped cpuid summary in %s: %s\n", path, line);
|
||||
goto out_with_path;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Copyright © 2009 CNRS
|
||||
* Copyright © 2009-2020 Inria. All rights reserved.
|
||||
* Copyright © 2009-2024 Inria. All rights reserved.
|
||||
* Copyright © 2009-2011 Université Bordeaux
|
||||
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
|
@ -41,7 +41,7 @@ typedef struct hwloc__nolibxml_import_state_data_s {
|
|||
static char *
|
||||
hwloc__nolibxml_import_ignore_spaces(char *buffer)
|
||||
{
|
||||
return buffer + strspn(buffer, " \t\n");
|
||||
return buffer + strspn(buffer, " \t\n\r");
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
16
src/3rdparty/hwloc/src/topology-xml.c
vendored
16
src/3rdparty/hwloc/src/topology-xml.c
vendored
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Copyright © 2009 CNRS
|
||||
* Copyright © 2009-2023 Inria. All rights reserved.
|
||||
* Copyright © 2009-2024 Inria. All rights reserved.
|
||||
* Copyright © 2009-2011, 2020 Université Bordeaux
|
||||
* Copyright © 2009-2018 Cisco Systems, Inc. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
|
@ -872,6 +872,10 @@ hwloc__xml_import_object(hwloc_topology_t topology,
|
|||
/* deal with possible future type */
|
||||
obj->type = HWLOC_OBJ_GROUP;
|
||||
obj->attr->group.kind = HWLOC_GROUP_KIND_INTEL_MODULE;
|
||||
} else if (!strcasecmp(attrvalue, "Cluster")) {
|
||||
/* deal with possible future type */
|
||||
obj->type = HWLOC_OBJ_GROUP;
|
||||
obj->attr->group.kind = HWLOC_GROUP_KIND_LINUX_CLUSTER;
|
||||
} else if (!strcasecmp(attrvalue, "MemCache")) {
|
||||
/* ignore possible future type */
|
||||
obj->type = _HWLOC_OBJ_FUTURE;
|
||||
|
@ -1344,7 +1348,7 @@ hwloc__xml_v2import_support(hwloc_topology_t topology,
|
|||
HWLOC_BUILD_ASSERT(sizeof(struct hwloc_topology_support) == 4*sizeof(void*));
|
||||
HWLOC_BUILD_ASSERT(sizeof(struct hwloc_topology_discovery_support) == 6);
|
||||
HWLOC_BUILD_ASSERT(sizeof(struct hwloc_topology_cpubind_support) == 11);
|
||||
HWLOC_BUILD_ASSERT(sizeof(struct hwloc_topology_membind_support) == 15);
|
||||
HWLOC_BUILD_ASSERT(sizeof(struct hwloc_topology_membind_support) == 16);
|
||||
HWLOC_BUILD_ASSERT(sizeof(struct hwloc_topology_misc_support) == 1);
|
||||
#endif
|
||||
|
||||
|
@ -1378,6 +1382,7 @@ hwloc__xml_v2import_support(hwloc_topology_t topology,
|
|||
else DO(membind,firsttouch_membind);
|
||||
else DO(membind,bind_membind);
|
||||
else DO(membind,interleave_membind);
|
||||
else DO(membind,weighted_interleave_membind);
|
||||
else DO(membind,nexttouch_membind);
|
||||
else DO(membind,migrate_membind);
|
||||
else DO(membind,get_area_memlocation);
|
||||
|
@ -1436,6 +1441,10 @@ hwloc__xml_v2import_distances(hwloc_topology_t topology,
|
|||
}
|
||||
else if (!strcmp(attrname, "kind")) {
|
||||
kind = strtoul(attrvalue, NULL, 10);
|
||||
/* forward compat with "HOPS" kind in v3 */
|
||||
if (kind & (1UL<<5))
|
||||
/* hops becomes latency */
|
||||
kind = (kind & ~(1UL<<5)) | HWLOC_DISTANCES_KIND_MEANS_LATENCY;
|
||||
}
|
||||
else if (!strcmp(attrname, "name")) {
|
||||
name = attrvalue;
|
||||
|
@ -3087,7 +3096,7 @@ hwloc__xml_v2export_support(hwloc__xml_export_state_t parentstate, hwloc_topolog
|
|||
HWLOC_BUILD_ASSERT(sizeof(struct hwloc_topology_support) == 4*sizeof(void*));
|
||||
HWLOC_BUILD_ASSERT(sizeof(struct hwloc_topology_discovery_support) == 6);
|
||||
HWLOC_BUILD_ASSERT(sizeof(struct hwloc_topology_cpubind_support) == 11);
|
||||
HWLOC_BUILD_ASSERT(sizeof(struct hwloc_topology_membind_support) == 15);
|
||||
HWLOC_BUILD_ASSERT(sizeof(struct hwloc_topology_membind_support) == 16);
|
||||
HWLOC_BUILD_ASSERT(sizeof(struct hwloc_topology_misc_support) == 1);
|
||||
#endif
|
||||
|
||||
|
@ -3132,6 +3141,7 @@ hwloc__xml_v2export_support(hwloc__xml_export_state_t parentstate, hwloc_topolog
|
|||
DO(membind,firsttouch_membind);
|
||||
DO(membind,bind_membind);
|
||||
DO(membind,interleave_membind);
|
||||
DO(membind,weighted_interleave_membind);
|
||||
DO(membind,nexttouch_membind);
|
||||
DO(membind,migrate_membind);
|
||||
DO(membind,get_area_memlocation);
|
||||
|
|
14
src/3rdparty/hwloc/src/topology.c
vendored
14
src/3rdparty/hwloc/src/topology.c
vendored
|
@ -465,6 +465,20 @@ hwloc_debug_print_objects(int indent __hwloc_attribute_unused, hwloc_obj_t obj)
|
|||
#define hwloc_debug_print_objects(indent, obj) do { /* nothing */ } while (0)
|
||||
#endif /* !HWLOC_DEBUG */
|
||||
|
||||
int hwloc_obj_set_subtype(hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t obj, const char *subtype)
|
||||
{
|
||||
char *new = NULL;
|
||||
if (subtype) {
|
||||
new = strdup(subtype);
|
||||
if (!new)
|
||||
return -1;
|
||||
}
|
||||
if (obj->subtype)
|
||||
free(obj->subtype);
|
||||
obj->subtype = new;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void hwloc__free_infos(struct hwloc_info_s *infos, unsigned count)
|
||||
{
|
||||
unsigned i;
|
||||
|
|
|
@ -6,8 +6,8 @@
|
|||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||
* Copyright 2018 Lee Clagett <https://github.com/vtnerd>
|
||||
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||
* Copyright 2018-2024 SChernykh <https://github.com/SChernykh>
|
||||
* Copyright 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
|
||||
|
@ -23,7 +23,6 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#include <cstdlib>
|
||||
#include <uv.h>
|
||||
|
||||
|
@ -61,13 +60,13 @@ int xmrig::App::exec()
|
|||
return 2;
|
||||
}
|
||||
|
||||
m_signals = std::make_shared<Signals>(this);
|
||||
|
||||
int rc = 0;
|
||||
if (background(rc)) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
m_signals = std::make_shared<Signals>(this);
|
||||
|
||||
rc = m_controller->init();
|
||||
if (rc != 0) {
|
||||
return rc;
|
||||
|
|
|
@ -5,8 +5,8 @@
|
|||
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||
* Copyright 2018-2024 SChernykh <https://github.com/SChernykh>
|
||||
* Copyright 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
|
||||
|
@ -22,7 +22,6 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#include <cstdlib>
|
||||
#include <csignal>
|
||||
#include <cerrno>
|
||||
|
@ -53,16 +52,9 @@ bool xmrig::App::background(int &rc)
|
|||
return true;
|
||||
}
|
||||
|
||||
i = setsid();
|
||||
|
||||
if (i < 0) {
|
||||
if (setsid() < 0) {
|
||||
LOG_ERR("setsid() failed (errno = %d)", errno);
|
||||
}
|
||||
|
||||
i = chdir("/");
|
||||
if (i < 0) {
|
||||
LOG_ERR("chdir() failed (errno = %d)", errno);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -30,10 +30,10 @@
|
|||
#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)) {
|
||||
snprintf(buf, size, (h < 100.0) ? "%04.2f" : "%03.1f", h);
|
||||
if (h.first) {
|
||||
snprintf(buf, size, (h.second < 100.0) ? "%04.2f" : "%03.1f", h.second);
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
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
|
||||
|
||||
|
||||
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);
|
||||
if (index >= m_threads) {
|
||||
return nan("");
|
||||
return { false, 0.0 };
|
||||
}
|
||||
|
||||
uint64_t earliestHashCount = 0;
|
||||
|
@ -157,17 +158,27 @@ double xmrig::Hashrate::hashrate(size_t index, size_t ms) const
|
|||
} while (idx != idx_start);
|
||||
|
||||
if (!haveFullSet || earliestStamp == 0 || lastestStamp == 0) {
|
||||
return nan("");
|
||||
return { false, 0.0 };
|
||||
}
|
||||
|
||||
if (lastestStamp - earliestStamp == 0) {
|
||||
return nan("");
|
||||
if (lastestHashCnt == earliestHashCount) {
|
||||
return { true, 0.0 };
|
||||
}
|
||||
|
||||
if (lastestStamp == earliestStamp) {
|
||||
return { false, 0.0 };
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
inline double calc(size_t ms) const { const double data = hashrate(0U, ms); return std::isnormal(data) ? data : 0.0; }
|
||||
inline double calc(size_t threadId, size_t ms) const { return hashrate(threadId + 1, ms); }
|
||||
inline std::pair<bool, double> calc(size_t ms) const { return hashrate(0U, 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 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); }
|
||||
|
||||
double average() const;
|
||||
|
||||
static const char *format(double h, char *buf, size_t size);
|
||||
static rapidjson::Value normalize(double d);
|
||||
static const char *format(std::pair<bool, double> h, char *buf, size_t size);
|
||||
static rapidjson::Value normalize(std::pair<bool, double> d);
|
||||
|
||||
# ifdef XMRIG_FEATURE_API
|
||||
rapidjson::Value toJSON(rapidjson::Document &doc) const;
|
||||
|
@ -64,7 +64,7 @@ public:
|
|||
# endif
|
||||
|
||||
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);
|
||||
|
||||
constexpr static size_t kBucketSize = 2 << 11;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* XMRig
|
||||
* Copyright (c) 2018-2021 SChernykh <https://github.com/SChernykh>
|
||||
* 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
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
@ -122,17 +122,6 @@ size_t inline generate<Algorithm::RANDOM_X>(Threads<CpuThreads> &threads, uint32
|
|||
}
|
||||
}
|
||||
|
||||
if (!threads.isExist(Algorithm::RX_KEVA)) {
|
||||
auto keva = cpuInfo->threads(Algorithm::RX_KEVA, limit);
|
||||
if (keva == wow) {
|
||||
threads.setAlias(Algorithm::RX_KEVA, Algorithm::kRX_WOW);
|
||||
++count;
|
||||
}
|
||||
else {
|
||||
count += threads.move(Algorithm::kRX_KEVA, std::move(keva));
|
||||
}
|
||||
}
|
||||
|
||||
if (!threads.isExist(Algorithm::RX_WOW)) {
|
||||
count += threads.move(Algorithm::kRX_WOW, std::move(wow));
|
||||
}
|
||||
|
|
|
@ -359,7 +359,9 @@ void xmrig::CpuWorker<N>::start()
|
|||
}
|
||||
}
|
||||
|
||||
consumeJob();
|
||||
if (!Nonce::isPaused()) {
|
||||
consumeJob();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -52,7 +52,8 @@ public:
|
|||
ARCH_ZEN_PLUS,
|
||||
ARCH_ZEN2,
|
||||
ARCH_ZEN3,
|
||||
ARCH_ZEN4
|
||||
ARCH_ZEN4,
|
||||
ARCH_ZEN5
|
||||
};
|
||||
|
||||
enum MsrMod : uint32_t {
|
||||
|
@ -60,12 +61,13 @@ public:
|
|||
MSR_MOD_RYZEN_17H,
|
||||
MSR_MOD_RYZEN_19H,
|
||||
MSR_MOD_RYZEN_19H_ZEN4,
|
||||
MSR_MOD_RYZEN_1AH_ZEN5,
|
||||
MSR_MOD_INTEL,
|
||||
MSR_MOD_CUSTOM,
|
||||
MSR_MOD_MAX
|
||||
};
|
||||
|
||||
# define MSR_NAMES_LIST "none", "ryzen_17h", "ryzen_19h", "ryzen_19h_zen4", "intel", "custom"
|
||||
# define MSR_NAMES_LIST "none", "ryzen_17h", "ryzen_19h", "ryzen_19h_zen4", "ryzen_1Ah_zen5", "intel", "custom"
|
||||
|
||||
enum Flag : uint32_t {
|
||||
FLAG_AES,
|
||||
|
|
|
@ -64,7 +64,7 @@ static_assert(kCpuFlagsSize == ICpuInfo::FLAG_MAX, "kCpuFlagsSize and FLAG_MAX m
|
|||
|
||||
|
||||
#ifdef XMRIG_FEATURE_MSR
|
||||
constexpr size_t kMsrArraySize = 6;
|
||||
constexpr size_t kMsrArraySize = 7;
|
||||
static const std::array<const char *, kMsrArraySize> msrNames = { MSR_NAMES_LIST };
|
||||
static_assert(kMsrArraySize == ICpuInfo::MSR_MOD_MAX, "kMsrArraySize and MSR_MOD_MAX mismatch");
|
||||
#endif
|
||||
|
@ -260,6 +260,11 @@ xmrig::BasicCpuInfo::BasicCpuInfo() :
|
|||
}
|
||||
break;
|
||||
|
||||
case 0x1a:
|
||||
m_arch = ARCH_ZEN5;
|
||||
m_msrMod = MSR_MOD_RYZEN_1AH_ZEN5;
|
||||
break;
|
||||
|
||||
default:
|
||||
m_msrMod = MSR_MOD_NONE;
|
||||
break;
|
||||
|
|
|
@ -326,7 +326,8 @@ void xmrig::HwlocCpuInfo::processTopLevelCache(hwloc_obj_t cache, const Algorith
|
|||
}
|
||||
}
|
||||
|
||||
if (scratchpad == 2 * oneMiB) {
|
||||
// This code is supposed to run only on Intel CPUs
|
||||
if ((vendor() == VENDOR_INTEL) && (scratchpad == 2 * oneMiB)) {
|
||||
if (L2 && (cores.size() * oneMiB) == L2 && L2_associativity == 16 && L3 >= L2) {
|
||||
L3 = L2;
|
||||
extra = L2;
|
||||
|
@ -341,7 +342,7 @@ void xmrig::HwlocCpuInfo::processTopLevelCache(hwloc_obj_t cache, const Algorith
|
|||
}
|
||||
|
||||
# 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
|
||||
cacheHashes = (L3 + L2) / scratchpad;
|
||||
}
|
||||
|
|
|
@ -372,15 +372,20 @@ void xmrig::CudaBackend::printHashrate(bool details)
|
|||
|
||||
char num[16 * 3] = { 0 };
|
||||
|
||||
const double hashrate_short = hashrate()->calc(Hashrate::ShortInterval);
|
||||
const double hashrate_medium = hashrate()->calc(Hashrate::MediumInterval);
|
||||
const double hashrate_large = hashrate()->calc(Hashrate::LargeInterval);
|
||||
auto hashrate_short = hashrate()->calc(Hashrate::ShortInterval);
|
||||
auto hashrate_medium = hashrate()->calc(Hashrate::MediumInterval);
|
||||
auto hashrate_large = hashrate()->calc(Hashrate::LargeInterval);
|
||||
|
||||
double scale = 1.0;
|
||||
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;
|
||||
|
||||
hashrate_short.second *= scale;
|
||||
hashrate_medium.second *= scale;
|
||||
hashrate_large.second *= scale;
|
||||
|
||||
h = "MH/s";
|
||||
}
|
||||
|
||||
|
@ -388,12 +393,20 @@ void xmrig::CudaBackend::printHashrate(bool details)
|
|||
|
||||
size_t i = 0;
|
||||
for (const auto& data : d_ptr->threads) {
|
||||
Log::print("| %8zu | %8" PRId64 " | %8s | %8s | %8s |" CYAN_BOLD(" #%u") YELLOW(" %s") GREEN(" %s"),
|
||||
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"),
|
||||
i,
|
||||
data.thread.affinity(),
|
||||
Hashrate::format(hashrate()->calc(i, Hashrate::ShortInterval) * scale, num, sizeof num / 3),
|
||||
Hashrate::format(hashrate()->calc(i, Hashrate::MediumInterval) * scale, num + 16, sizeof num / 3),
|
||||
Hashrate::format(hashrate()->calc(i, Hashrate::LargeInterval) * scale, num + 16 * 2, sizeof num / 3),
|
||||
Hashrate::format(h0, num, sizeof num / 3),
|
||||
Hashrate::format(h1, num + 16, sizeof num / 3),
|
||||
Hashrate::format(h2, num + 16 * 2, sizeof num / 3),
|
||||
data.device.index(),
|
||||
data.device.topology().toString().data(),
|
||||
data.device.name().data()
|
||||
|
@ -403,9 +416,9 @@ void xmrig::CudaBackend::printHashrate(bool details)
|
|||
}
|
||||
|
||||
Log::print(WHITE_BOLD_S "| - | - | %8s | %8s | %8s |",
|
||||
Hashrate::format(hashrate_short * scale, num, sizeof num / 3),
|
||||
Hashrate::format(hashrate_medium * scale, num + 16, sizeof num / 3),
|
||||
Hashrate::format(hashrate_large * scale, num + 16 * 2, sizeof num / 3)
|
||||
Hashrate::format(hashrate_short , num, sizeof num / 3),
|
||||
Hashrate::format(hashrate_medium, num + 16, sizeof num / 3),
|
||||
Hashrate::format(hashrate_large , num + 16 * 2, sizeof num / 3)
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -114,7 +114,6 @@ size_t inline generate<Algorithm::RANDOM_X>(Threads<CudaThreads> &threads, const
|
|||
auto rx = CudaThreads(devices, Algorithm::RX_0);
|
||||
auto wow = CudaThreads(devices, Algorithm::RX_WOW);
|
||||
auto arq = CudaThreads(devices, Algorithm::RX_ARQ);
|
||||
auto kva = CudaThreads(devices, Algorithm::RX_KEVA);
|
||||
|
||||
if (!threads.isExist(Algorithm::RX_WOW) && wow != rx) {
|
||||
count += threads.move(Algorithm::kRX_WOW, std::move(wow));
|
||||
|
@ -124,10 +123,6 @@ size_t inline generate<Algorithm::RANDOM_X>(Threads<CudaThreads> &threads, const
|
|||
count += threads.move(Algorithm::kRX_ARQ, std::move(arq));
|
||||
}
|
||||
|
||||
if (!threads.isExist(Algorithm::RX_KEVA) && kva != rx) {
|
||||
count += threads.move(Algorithm::kRX_KEVA, std::move(kva));
|
||||
}
|
||||
|
||||
count += threads.move(Algorithm::kRX, std::move(rx));
|
||||
|
||||
return count;
|
||||
|
|
|
@ -158,7 +158,7 @@ void xmrig::CudaWorker::start()
|
|||
std::this_thread::yield();
|
||||
}
|
||||
|
||||
if (!consumeJob()) {
|
||||
if (isReady() && !consumeJob()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -352,15 +352,20 @@ void xmrig::OclBackend::printHashrate(bool details)
|
|||
|
||||
char num[16 * 3] = { 0 };
|
||||
|
||||
const double hashrate_short = hashrate()->calc(Hashrate::ShortInterval);
|
||||
const double hashrate_medium = hashrate()->calc(Hashrate::MediumInterval);
|
||||
const double hashrate_large = hashrate()->calc(Hashrate::LargeInterval);
|
||||
auto hashrate_short = hashrate()->calc(Hashrate::ShortInterval);
|
||||
auto hashrate_medium = hashrate()->calc(Hashrate::MediumInterval);
|
||||
auto hashrate_large = hashrate()->calc(Hashrate::LargeInterval);
|
||||
|
||||
double scale = 1.0;
|
||||
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;
|
||||
|
||||
hashrate_short.second *= scale;
|
||||
hashrate_medium.second *= scale;
|
||||
hashrate_large.second *= scale;
|
||||
|
||||
h = "MH/s";
|
||||
}
|
||||
|
||||
|
@ -368,12 +373,16 @@ void xmrig::OclBackend::printHashrate(bool details)
|
|||
|
||||
size_t i = 0;
|
||||
for (const auto& data : d_ptr->threads) {
|
||||
Log::print("| %8zu | %8" PRId64 " | %8s | %8s | %8s |" CYAN_BOLD(" #%u") YELLOW(" %s") " %s",
|
||||
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",
|
||||
i,
|
||||
data.affinity,
|
||||
Hashrate::format(hashrate()->calc(i, Hashrate::ShortInterval) * scale, num, sizeof num / 3),
|
||||
Hashrate::format(hashrate()->calc(i, Hashrate::MediumInterval) * scale, num + 16, sizeof num / 3),
|
||||
Hashrate::format(hashrate()->calc(i, Hashrate::LargeInterval) * scale, num + 16 * 2, sizeof num / 3),
|
||||
Hashrate::format(h0, num, sizeof num / 3),
|
||||
Hashrate::format(h1, num + 16, sizeof num / 3),
|
||||
Hashrate::format(h2, num + 16 * 2, sizeof num / 3),
|
||||
data.device.index(),
|
||||
data.device.topology().toString().data(),
|
||||
data.device.printableName().data()
|
||||
|
@ -383,9 +392,9 @@ void xmrig::OclBackend::printHashrate(bool details)
|
|||
}
|
||||
|
||||
Log::print(WHITE_BOLD_S "| - | - | %8s | %8s | %8s |",
|
||||
Hashrate::format(hashrate_short * scale, num, sizeof num / 3),
|
||||
Hashrate::format(hashrate_medium * scale, num + 16, sizeof num / 3),
|
||||
Hashrate::format(hashrate_large * scale, num + 16 * 2, sizeof num / 3)
|
||||
Hashrate::format(hashrate_short , num, sizeof num / 3),
|
||||
Hashrate::format(hashrate_medium, num + 16, sizeof num / 3),
|
||||
Hashrate::format(hashrate_large , num + 16 * 2, sizeof num / 3)
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -170,7 +170,7 @@ void xmrig::OclWorker::start()
|
|||
const uint64_t t = Chrono::steadyMSecs();
|
||||
|
||||
try {
|
||||
m_runner->run(readUnaligned(m_job.nonce()), results);
|
||||
m_runner->run(readUnaligned(m_job.nonce()), m_job.nonceOffset(), results);
|
||||
}
|
||||
catch (std::exception &ex) {
|
||||
printError(id(), ex.what());
|
||||
|
@ -190,7 +190,7 @@ void xmrig::OclWorker::start()
|
|||
std::this_thread::yield();
|
||||
}
|
||||
|
||||
if (!consumeJob()) {
|
||||
if (isReady() && !consumeJob()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,8 +22,8 @@
|
|||
#define ALGO_RX_WOW 0x72141177
|
||||
#define ALGO_RX_ARQMA 0x72121061
|
||||
#define ALGO_RX_SFX 0x72151273
|
||||
#define ALGO_RX_KEVA 0x7214116b
|
||||
#define ALGO_RX_GRAFT 0x72151267
|
||||
#define ALGO_RX_YADA 0x72151279
|
||||
#define ALGO_AR2_CHUKWA 0x61130000
|
||||
#define ALGO_AR2_CHUKWA_V2 0x61140000
|
||||
#define ALGO_AR2_WRKZ 0x61120000
|
||||
|
|
|
@ -34,9 +34,9 @@ static const char cryptonight_cl[61447] = {
|
|||
0x31,0x35,0x31,0x32,0x30,0x30,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x41,0x4c,0x47,0x4f,0x5f,0x52,0x58,0x5f,0x57,0x4f,0x57,0x20,0x30,0x78,0x37,0x32,0x31,
|
||||
0x34,0x31,0x31,0x37,0x37,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x41,0x4c,0x47,0x4f,0x5f,0x52,0x58,0x5f,0x41,0x52,0x51,0x4d,0x41,0x20,0x30,0x78,0x37,0x32,
|
||||
0x31,0x32,0x31,0x30,0x36,0x31,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x41,0x4c,0x47,0x4f,0x5f,0x52,0x58,0x5f,0x53,0x46,0x58,0x20,0x30,0x78,0x37,0x32,0x31,
|
||||
0x35,0x31,0x32,0x37,0x33,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x41,0x4c,0x47,0x4f,0x5f,0x52,0x58,0x5f,0x4b,0x45,0x56,0x41,0x20,0x30,0x78,0x37,0x32,0x31,
|
||||
0x34,0x31,0x31,0x36,0x62,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x41,0x4c,0x47,0x4f,0x5f,0x52,0x58,0x5f,0x47,0x52,0x41,0x46,0x54,0x20,0x30,0x78,0x37,0x32,
|
||||
0x31,0x35,0x31,0x32,0x36,0x37,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x41,0x4c,0x47,0x4f,0x5f,0x41,0x52,0x32,0x5f,0x43,0x48,0x55,0x4b,0x57,0x41,0x20,0x30,
|
||||
0x35,0x31,0x32,0x37,0x33,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x41,0x4c,0x47,0x4f,0x5f,0x52,0x58,0x5f,0x47,0x52,0x41,0x46,0x54,0x20,0x30,0x78,0x37,0x32,
|
||||
0x31,0x35,0x31,0x32,0x36,0x37,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x41,0x4c,0x47,0x4f,0x5f,0x52,0x58,0x5f,0x59,0x41,0x44,0x41,0x20,0x30,0x78,0x37,0x32,
|
||||
0x31,0x35,0x31,0x32,0x37,0x39,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x41,0x4c,0x47,0x4f,0x5f,0x41,0x52,0x32,0x5f,0x43,0x48,0x55,0x4b,0x57,0x41,0x20,0x30,
|
||||
0x78,0x36,0x31,0x31,0x33,0x30,0x30,0x30,0x30,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x41,0x4c,0x47,0x4f,0x5f,0x41,0x52,0x32,0x5f,0x43,0x48,0x55,0x4b,0x57,
|
||||
0x41,0x5f,0x56,0x32,0x20,0x30,0x78,0x36,0x31,0x31,0x34,0x30,0x30,0x30,0x30,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x41,0x4c,0x47,0x4f,0x5f,0x41,0x52,0x32,
|
||||
0x5f,0x57,0x52,0x4b,0x5a,0x20,0x30,0x78,0x36,0x31,0x31,0x32,0x30,0x30,0x30,0x30,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x41,0x4c,0x47,0x4f,0x5f,0x4b,0x41,
|
||||
|
|
|
@ -225,6 +225,110 @@ __kernel void blake2b_initial_hash_double(__global void *out, __global const voi
|
|||
t[7] = hash[7];
|
||||
}
|
||||
|
||||
void blake2b_512_process_big_block(ulong *out, __global const ulong* in, uint in_len, uint out_len, uint nonce, uint nonce_offset)
|
||||
{
|
||||
ulong h[8] = { iv0 ^ (0x01010000u | out_len), iv1, iv2, iv3, iv4, iv5, iv6, iv7 };
|
||||
|
||||
for (uint t = 128; t < in_len; t += 128, in += 16) {
|
||||
ulong m[16] = { in[0], in[1], in[2], in[3], in[4], in[5], in[6], in[7], in[8], in[9], in[10], in[11], in[12], in[13], in[14], in[15] };
|
||||
|
||||
const uint k0 = (nonce_offset + 0) - (t - 128);
|
||||
const uint k1 = (nonce_offset + 1) - (t - 128);
|
||||
const uint k2 = (nonce_offset + 2) - (t - 128);
|
||||
const uint k3 = (nonce_offset + 3) - (t - 128);
|
||||
|
||||
if (k0 < 128) m[k0 / 8] |= (ulong)((nonce >> 0) & 255) << ((k0 % 8) * 8);
|
||||
if (k1 < 128) m[k1 / 8] |= (ulong)((nonce >> 8) & 255) << ((k1 % 8) * 8);
|
||||
if (k2 < 128) m[k2 / 8] |= (ulong)((nonce >> 16) & 255) << ((k2 % 8) * 8);
|
||||
if (k3 < 128) m[k3 / 8] |= (ulong)((nonce >> 24) & 255) << ((k3 % 8) * 8);
|
||||
|
||||
ulong v[16] = { h[0], h[1], h[2], h[3], h[4], h[5], h[6], h[7], iv0, iv1, iv2, iv3, iv4 ^ t, iv5, iv6, iv7 };
|
||||
|
||||
BLAKE2B_ROUNDS();
|
||||
|
||||
h[0] ^= v[0] ^ v[ 8];
|
||||
h[1] ^= v[1] ^ v[ 9];
|
||||
h[2] ^= v[2] ^ v[10];
|
||||
h[3] ^= v[3] ^ v[11];
|
||||
h[4] ^= v[4] ^ v[12];
|
||||
h[5] ^= v[5] ^ v[13];
|
||||
h[6] ^= v[6] ^ v[14];
|
||||
h[7] ^= v[7] ^ v[15];
|
||||
}
|
||||
|
||||
uint k = in_len & 127;
|
||||
if (k == 0) k = 128;
|
||||
|
||||
ulong m[16] = {
|
||||
(k > 0) ? in[ 0] : 0,
|
||||
(k > 8) ? in[ 1] : 0,
|
||||
(k > 16) ? in[ 2] : 0,
|
||||
(k > 24) ? in[ 3] : 0,
|
||||
(k > 32) ? in[ 4] : 0,
|
||||
(k > 40) ? in[ 5] : 0,
|
||||
(k > 48) ? in[ 6] : 0,
|
||||
(k > 56) ? in[ 7] : 0,
|
||||
(k > 64) ? in[ 8] : 0,
|
||||
(k > 72) ? in[ 9] : 0,
|
||||
(k > 80) ? in[10] : 0,
|
||||
(k > 88) ? in[11] : 0,
|
||||
(k > 96) ? in[12] : 0,
|
||||
(k > 104) ? in[13] : 0,
|
||||
(k > 112) ? in[14] : 0,
|
||||
(k > 120) ? in[15] : 0
|
||||
};
|
||||
|
||||
const uint t = in_len - k;
|
||||
|
||||
const uint k0 = nonce_offset + 0 - t;
|
||||
const uint k1 = nonce_offset + 1 - t;
|
||||
const uint k2 = nonce_offset + 2 - t;
|
||||
const uint k3 = nonce_offset + 3 - t;
|
||||
|
||||
if (k0 < k) m[k0 / 8] |= (ulong)((nonce >> 0) & 255) << ((k0 % 8) * 8);
|
||||
if (k1 < k) m[k1 / 8] |= (ulong)((nonce >> 8) & 255) << ((k1 % 8) * 8);
|
||||
if (k2 < k) m[k2 / 8] |= (ulong)((nonce >> 16) & 255) << ((k2 % 8) * 8);
|
||||
if (k3 < k) m[k3 / 8] |= (ulong)((nonce >> 24) & 255) << ((k3 % 8) * 8);
|
||||
|
||||
if (k % 8) {
|
||||
m[k / 8] &= (ulong)(-1) >> (64 - (k % 8) * 8);
|
||||
}
|
||||
|
||||
ulong v[16] = { h[0], h[1], h[2], h[3], h[4], h[5], h[6], h[7], iv0, iv1, iv2, iv3, iv4 ^ in_len, iv5, ~iv6, iv7 };
|
||||
|
||||
BLAKE2B_ROUNDS();
|
||||
|
||||
if (out_len > 0) out[0] = h[0] ^ v[0] ^ v[8];
|
||||
if (out_len > 8) out[1] = h[1] ^ v[1] ^ v[9];
|
||||
if (out_len > 16) out[2] = h[2] ^ v[2] ^ v[10];
|
||||
if (out_len > 24) out[3] = h[3] ^ v[3] ^ v[11];
|
||||
if (out_len > 32) out[4] = h[4] ^ v[4] ^ v[12];
|
||||
if (out_len > 40) out[5] = h[5] ^ v[5] ^ v[13];
|
||||
if (out_len > 48) out[6] = h[6] ^ v[6] ^ v[14];
|
||||
if (out_len > 56) out[7] = h[7] ^ v[7] ^ v[15];
|
||||
}
|
||||
|
||||
__attribute__((reqd_work_group_size(64, 1, 1)))
|
||||
__kernel void blake2b_initial_hash_big(__global void *out, __global const void* blockTemplate, uint blockTemplateSize, uint start_nonce, uint nonce_offset)
|
||||
{
|
||||
const uint global_index = get_global_id(0);
|
||||
|
||||
__global const ulong* p = (__global const ulong*) blockTemplate;
|
||||
|
||||
ulong hash[8];
|
||||
blake2b_512_process_big_block(hash, p, blockTemplateSize, 64, start_nonce + global_index, nonce_offset);
|
||||
|
||||
__global ulong* t = ((__global ulong*) out) + global_index * 8;
|
||||
t[0] = hash[0];
|
||||
t[1] = hash[1];
|
||||
t[2] = hash[2];
|
||||
t[3] = hash[3];
|
||||
t[4] = hash[4];
|
||||
t[5] = hash[5];
|
||||
t[6] = hash[6];
|
||||
t[7] = hash[7];
|
||||
}
|
||||
|
||||
#define in_len 256
|
||||
|
||||
#define out_len 32
|
||||
|
|
|
@ -1,13 +1,11 @@
|
|||
#include "../cn/algorithm.cl"
|
||||
|
||||
#if (ALGO == ALGO_RX_0)
|
||||
#if ((ALGO == ALGO_RX_0) || (ALGO == ALGO_RX_YADA))
|
||||
#include "randomx_constants_monero.h"
|
||||
#elif (ALGO == ALGO_RX_WOW)
|
||||
#include "randomx_constants_wow.h"
|
||||
#elif (ALGO == ALGO_RX_ARQMA)
|
||||
#include "randomx_constants_arqma.h"
|
||||
#elif (ALGO == ALGO_RX_KEVA)
|
||||
#include "randomx_constants_keva.h"
|
||||
#elif (ALGO == ALGO_RX_GRAFT)
|
||||
#include "randomx_constants_graft.h"
|
||||
#endif
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,96 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2019 SChernykh
|
||||
|
||||
This file is part of RandomX OpenCL.
|
||||
|
||||
RandomX OpenCL 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.
|
||||
|
||||
RandomX OpenCL 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 RandomX OpenCL. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
//Dataset base size in bytes. Must be a power of 2.
|
||||
#define RANDOMX_DATASET_BASE_SIZE 2147483648
|
||||
|
||||
//Dataset extra size. Must be divisible by 64.
|
||||
#define RANDOMX_DATASET_EXTRA_SIZE 33554368
|
||||
|
||||
//Scratchpad L3 size in bytes. Must be a power of 2.
|
||||
#define RANDOMX_SCRATCHPAD_L3 1048576
|
||||
|
||||
//Scratchpad L2 size in bytes. Must be a power of two and less than or equal to RANDOMX_SCRATCHPAD_L3.
|
||||
#define RANDOMX_SCRATCHPAD_L2 131072
|
||||
|
||||
//Scratchpad L1 size in bytes. Must be a power of two (minimum 64) and less than or equal to RANDOMX_SCRATCHPAD_L2.
|
||||
#define RANDOMX_SCRATCHPAD_L1 16384
|
||||
|
||||
//Jump condition mask size in bits.
|
||||
#define RANDOMX_JUMP_BITS 8
|
||||
|
||||
//Jump condition mask offset in bits. The sum of RANDOMX_JUMP_BITS and RANDOMX_JUMP_OFFSET must not exceed 16.
|
||||
#define RANDOMX_JUMP_OFFSET 8
|
||||
|
||||
//Integer instructions
|
||||
#define RANDOMX_FREQ_IADD_RS 16
|
||||
#define RANDOMX_FREQ_IADD_M 7
|
||||
#define RANDOMX_FREQ_ISUB_R 16
|
||||
#define RANDOMX_FREQ_ISUB_M 7
|
||||
#define RANDOMX_FREQ_IMUL_R 16
|
||||
#define RANDOMX_FREQ_IMUL_M 4
|
||||
#define RANDOMX_FREQ_IMULH_R 4
|
||||
#define RANDOMX_FREQ_IMULH_M 1
|
||||
#define RANDOMX_FREQ_ISMULH_R 4
|
||||
#define RANDOMX_FREQ_ISMULH_M 1
|
||||
#define RANDOMX_FREQ_IMUL_RCP 8
|
||||
#define RANDOMX_FREQ_INEG_R 2
|
||||
#define RANDOMX_FREQ_IXOR_R 15
|
||||
#define RANDOMX_FREQ_IXOR_M 5
|
||||
#define RANDOMX_FREQ_IROR_R 8
|
||||
#define RANDOMX_FREQ_IROL_R 2
|
||||
#define RANDOMX_FREQ_ISWAP_R 4
|
||||
|
||||
//Floating point instructions
|
||||
#define RANDOMX_FREQ_FSWAP_R 4
|
||||
#define RANDOMX_FREQ_FADD_R 16
|
||||
#define RANDOMX_FREQ_FADD_M 5
|
||||
#define RANDOMX_FREQ_FSUB_R 16
|
||||
#define RANDOMX_FREQ_FSUB_M 5
|
||||
#define RANDOMX_FREQ_FSCAL_R 6
|
||||
#define RANDOMX_FREQ_FMUL_R 32
|
||||
#define RANDOMX_FREQ_FDIV_M 4
|
||||
#define RANDOMX_FREQ_FSQRT_R 6
|
||||
|
||||
//Control instructions
|
||||
#define RANDOMX_FREQ_CBRANCH 25
|
||||
#define RANDOMX_FREQ_CFROUND 1
|
||||
|
||||
//Store instruction
|
||||
#define RANDOMX_FREQ_ISTORE 16
|
||||
|
||||
//No-op instruction
|
||||
#define RANDOMX_FREQ_NOP 0
|
||||
|
||||
#define RANDOMX_DATASET_ITEM_SIZE 64
|
||||
|
||||
#define RANDOMX_PROGRAM_SIZE 256
|
||||
|
||||
#define HASH_SIZE 64
|
||||
#define ENTROPY_SIZE (128 + RANDOMX_PROGRAM_SIZE * 8)
|
||||
#define REGISTERS_SIZE 256
|
||||
#define IMM_BUF_SIZE (RANDOMX_PROGRAM_SIZE * 4 - REGISTERS_SIZE)
|
||||
#define IMM_INDEX_COUNT ((IMM_BUF_SIZE / 4) - 2)
|
||||
#define VM_STATE_SIZE (REGISTERS_SIZE + IMM_BUF_SIZE + RANDOMX_PROGRAM_SIZE * 4)
|
||||
#define ROUNDING_MODE (RANDOMX_FREQ_CFROUND ? -1 : 0)
|
||||
|
||||
// Scratchpad L1/L2/L3 bits
|
||||
#define LOC_L1 (32 - 14)
|
||||
#define LOC_L2 (32 - 17)
|
||||
#define LOC_L3 (32 - 20)
|
|
@ -64,7 +64,7 @@ public:
|
|||
virtual uint32_t deviceIndex() const = 0;
|
||||
virtual void build() = 0;
|
||||
virtual void init() = 0;
|
||||
virtual void run(uint32_t nonce, uint32_t *hashOutput) = 0;
|
||||
virtual void run(uint32_t nonce, uint32_t nonce_offset, uint32_t *hashOutput) = 0;
|
||||
virtual void set(const Job &job, uint8_t *blob) = 0;
|
||||
virtual void jobEarlyNotification(const Job&) = 0;
|
||||
|
||||
|
|
|
@ -0,0 +1,59 @@
|
|||
/* XMRig
|
||||
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
|
||||
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
|
||||
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
|
||||
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
||||
* Copyright 2016-2019 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/kernels/rx/Blake2bInitialHashBigKernel.h"
|
||||
#include "backend/opencl/wrappers/OclLib.h"
|
||||
|
||||
|
||||
void xmrig::Blake2bInitialHashBigKernel::enqueue(cl_command_queue queue, size_t threads)
|
||||
{
|
||||
const size_t gthreads = threads;
|
||||
static const size_t lthreads = 64;
|
||||
|
||||
enqueueNDRange(queue, 1, nullptr, >hreads, <hreads);
|
||||
}
|
||||
|
||||
|
||||
// __kernel void blake2b_initial_hash_double(__global void *out, __global const void* blockTemplate, uint blockTemplateSize, uint start_nonce)
|
||||
void xmrig::Blake2bInitialHashBigKernel::setArgs(cl_mem out, cl_mem blockTemplate)
|
||||
{
|
||||
setArg(0, sizeof(cl_mem), &out);
|
||||
setArg(1, sizeof(cl_mem), &blockTemplate);
|
||||
}
|
||||
|
||||
|
||||
void xmrig::Blake2bInitialHashBigKernel::setBlobSize(size_t size)
|
||||
{
|
||||
const uint32_t s = size;
|
||||
|
||||
setArg(2, sizeof(uint32_t), &s);
|
||||
}
|
||||
|
||||
|
||||
void xmrig::Blake2bInitialHashBigKernel::setNonce(uint32_t nonce, uint32_t nonce_offset)
|
||||
{
|
||||
setArg(3, sizeof(uint32_t), &nonce);
|
||||
setArg(4, sizeof(uint32_t), &nonce_offset);
|
||||
}
|
50
src/backend/opencl/kernels/rx/Blake2bInitialHashBigKernel.h
Normal file
50
src/backend/opencl/kernels/rx/Blake2bInitialHashBigKernel.h
Normal file
|
@ -0,0 +1,50 @@
|
|||
/* XMRig
|
||||
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
|
||||
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
|
||||
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
|
||||
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
||||
* Copyright 2016-2019 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/>.
|
||||
*/
|
||||
|
||||
#ifndef XMRIG_BLAKE2BINITIALHASHBIGKERNEL_H
|
||||
#define XMRIG_BLAKE2BINITIALHASHBIGKERNEL_H
|
||||
|
||||
|
||||
#include "backend/opencl/wrappers/OclKernel.h"
|
||||
|
||||
|
||||
namespace xmrig {
|
||||
|
||||
|
||||
class Blake2bInitialHashBigKernel : public OclKernel
|
||||
{
|
||||
public:
|
||||
inline Blake2bInitialHashBigKernel(cl_program program) : OclKernel(program, "blake2b_initial_hash_big") {}
|
||||
|
||||
void enqueue(cl_command_queue queue, size_t threads);
|
||||
void setArgs(cl_mem out, cl_mem blockTemplate);
|
||||
void setBlobSize(size_t size);
|
||||
void setNonce(uint32_t nonce, uint32_t nonce_offset);
|
||||
};
|
||||
|
||||
|
||||
} // namespace xmrig
|
||||
|
||||
|
||||
#endif /* XMRIG_BLAKE2BINITIALHASHBIGKERNEL_H */
|
|
@ -80,6 +80,7 @@ if (WITH_OPENCL)
|
|||
if (WITH_RANDOMX)
|
||||
list(APPEND HEADERS_BACKEND_OPENCL
|
||||
src/backend/opencl/kernels/rx/Blake2bHashRegistersKernel.h
|
||||
src/backend/opencl/kernels/rx/Blake2bInitialHashBigKernel.h
|
||||
src/backend/opencl/kernels/rx/Blake2bInitialHashDoubleKernel.h
|
||||
src/backend/opencl/kernels/rx/Blake2bInitialHashKernel.h
|
||||
src/backend/opencl/kernels/rx/ExecuteVmKernel.h
|
||||
|
@ -97,6 +98,7 @@ if (WITH_OPENCL)
|
|||
list(APPEND SOURCES_BACKEND_OPENCL
|
||||
src/backend/opencl/generators/ocl_generic_rx_generator.cpp
|
||||
src/backend/opencl/kernels/rx/Blake2bHashRegistersKernel.cpp
|
||||
src/backend/opencl/kernels/rx/Blake2bInitialHashBigKernel.cpp
|
||||
src/backend/opencl/kernels/rx/Blake2bInitialHashDoubleKernel.cpp
|
||||
src/backend/opencl/kernels/rx/Blake2bInitialHashKernel.cpp
|
||||
src/backend/opencl/kernels/rx/ExecuteVmKernel.cpp
|
||||
|
|
|
@ -87,7 +87,7 @@ size_t xmrig::OclCnRunner::bufferSize() const
|
|||
}
|
||||
|
||||
|
||||
void xmrig::OclCnRunner::run(uint32_t nonce, uint32_t *hashOutput)
|
||||
void xmrig::OclCnRunner::run(uint32_t nonce, uint32_t /*nonce_offset*/, uint32_t *hashOutput)
|
||||
{
|
||||
static const cl_uint zero = 0;
|
||||
|
||||
|
|
|
@ -42,7 +42,7 @@ public:
|
|||
|
||||
protected:
|
||||
size_t bufferSize() const override;
|
||||
void run(uint32_t nonce, uint32_t *hashOutput) override;
|
||||
void run(uint32_t nonce, uint32_t nonce_offset, uint32_t *hashOutput) override;
|
||||
void set(const Job &job, uint8_t *blob) override;
|
||||
void build() override;
|
||||
void init() override;
|
||||
|
|
|
@ -75,7 +75,7 @@ OclKawPowRunner::~OclKawPowRunner()
|
|||
}
|
||||
|
||||
|
||||
void OclKawPowRunner::run(uint32_t nonce, uint32_t *hashOutput)
|
||||
void OclKawPowRunner::run(uint32_t nonce, uint32_t /*nonce_offset*/, uint32_t *hashOutput)
|
||||
{
|
||||
const size_t local_work_size = m_workGroupSize;
|
||||
const size_t global_work_offset = nonce;
|
||||
|
|
|
@ -40,7 +40,7 @@ public:
|
|||
~OclKawPowRunner() override;
|
||||
|
||||
protected:
|
||||
void run(uint32_t nonce, uint32_t *hashOutput) override;
|
||||
void run(uint32_t nonce, uint32_t nonce_offset, uint32_t *hashOutput) override;
|
||||
void set(const Job &job, uint8_t *blob) override;
|
||||
void build() override;
|
||||
void init() override;
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include "backend/opencl/kernels/rx/Blake2bHashRegistersKernel.h"
|
||||
#include "backend/opencl/kernels/rx/Blake2bInitialHashKernel.h"
|
||||
#include "backend/opencl/kernels/rx/Blake2bInitialHashDoubleKernel.h"
|
||||
#include "backend/opencl/kernels/rx/Blake2bInitialHashBigKernel.h"
|
||||
#include "backend/opencl/kernels/rx/FillAesKernel.h"
|
||||
#include "backend/opencl/kernels/rx/FindSharesKernel.h"
|
||||
#include "backend/opencl/kernels/rx/HashAesKernel.h"
|
||||
|
@ -73,6 +74,7 @@ xmrig::OclRxBaseRunner::~OclRxBaseRunner()
|
|||
delete m_hashAes1Rx4;
|
||||
delete m_blake2b_initial_hash;
|
||||
delete m_blake2b_initial_hash_double;
|
||||
delete m_blake2b_initial_hash_big;
|
||||
delete m_blake2b_hash_registers_32;
|
||||
delete m_blake2b_hash_registers_64;
|
||||
delete m_find_shares;
|
||||
|
@ -85,7 +87,7 @@ xmrig::OclRxBaseRunner::~OclRxBaseRunner()
|
|||
}
|
||||
|
||||
|
||||
void xmrig::OclRxBaseRunner::run(uint32_t nonce, uint32_t *hashOutput)
|
||||
void xmrig::OclRxBaseRunner::run(uint32_t nonce, uint32_t nonce_offset, uint32_t *hashOutput)
|
||||
{
|
||||
static const uint32_t zero = 0;
|
||||
|
||||
|
@ -96,8 +98,7 @@ void xmrig::OclRxBaseRunner::run(uint32_t nonce, uint32_t *hashOutput)
|
|||
m_blake2b_initial_hash_double->setNonce(nonce);
|
||||
}
|
||||
else {
|
||||
hashOutput[0xFF] = 0;
|
||||
return;
|
||||
m_blake2b_initial_hash_big->setNonce(nonce, nonce_offset);
|
||||
}
|
||||
|
||||
m_find_shares->setNonce(nonce);
|
||||
|
@ -107,9 +108,12 @@ void xmrig::OclRxBaseRunner::run(uint32_t nonce, uint32_t *hashOutput)
|
|||
if (m_jobSize <= 128) {
|
||||
m_blake2b_initial_hash->enqueue(m_queue, m_intensity);
|
||||
}
|
||||
else {
|
||||
else if (m_jobSize <= 256) {
|
||||
m_blake2b_initial_hash_double->enqueue(m_queue, m_intensity);
|
||||
}
|
||||
else {
|
||||
m_blake2b_initial_hash_big->enqueue(m_queue, m_intensity);
|
||||
}
|
||||
|
||||
m_fillAes1Rx4_scratchpad->enqueue(m_queue, m_intensity);
|
||||
|
||||
|
@ -150,12 +154,15 @@ void xmrig::OclRxBaseRunner::set(const Job &job, uint8_t *blob)
|
|||
memset(blob + job.size(), 0, Job::kMaxBlobSize - job.size());
|
||||
}
|
||||
|
||||
memset(blob + job.nonceOffset(), 0, job.nonceSize());
|
||||
|
||||
enqueueWriteBuffer(m_input, CL_TRUE, 0, Job::kMaxBlobSize, blob);
|
||||
|
||||
m_jobSize = job.size();
|
||||
|
||||
m_blake2b_initial_hash->setBlobSize(job.size());
|
||||
m_blake2b_initial_hash_double->setBlobSize(job.size());
|
||||
m_blake2b_initial_hash_big->setBlobSize(job.size());
|
||||
|
||||
m_find_shares->setTarget(job.target());
|
||||
}
|
||||
|
@ -191,6 +198,9 @@ void xmrig::OclRxBaseRunner::build()
|
|||
m_blake2b_initial_hash_double = new Blake2bInitialHashDoubleKernel(m_program);
|
||||
m_blake2b_initial_hash_double->setArgs(m_hashes, m_input);
|
||||
|
||||
m_blake2b_initial_hash_big = new Blake2bInitialHashBigKernel(m_program);
|
||||
m_blake2b_initial_hash_big->setArgs(m_hashes, m_input);
|
||||
|
||||
m_blake2b_hash_registers_32 = new Blake2bHashRegistersKernel(m_program, "blake2b_hash_registers_32");
|
||||
m_blake2b_hash_registers_64 = new Blake2bHashRegistersKernel(m_program, "blake2b_hash_registers_64");
|
||||
|
||||
|
|
|
@ -36,6 +36,7 @@ namespace xmrig {
|
|||
class Blake2bHashRegistersKernel;
|
||||
class Blake2bInitialHashKernel;
|
||||
class Blake2bInitialHashDoubleKernel;
|
||||
class Blake2bInitialHashBigKernel;
|
||||
class FillAesKernel;
|
||||
class FindSharesKernel;
|
||||
class HashAesKernel;
|
||||
|
@ -53,7 +54,7 @@ protected:
|
|||
size_t bufferSize() const override;
|
||||
void build() override;
|
||||
void init() override;
|
||||
void run(uint32_t nonce, uint32_t *hashOutput) override;
|
||||
void run(uint32_t nonce, uint32_t nonce_offset, uint32_t *hashOutput) override;
|
||||
void set(const Job &job, uint8_t *blob) override;
|
||||
|
||||
protected:
|
||||
|
@ -63,6 +64,7 @@ protected:
|
|||
Blake2bHashRegistersKernel *m_blake2b_hash_registers_64 = nullptr;
|
||||
Blake2bInitialHashKernel *m_blake2b_initial_hash = nullptr;
|
||||
Blake2bInitialHashDoubleKernel *m_blake2b_initial_hash_double = nullptr;
|
||||
Blake2bInitialHashBigKernel* m_blake2b_initial_hash_big = nullptr;
|
||||
Buffer m_seed;
|
||||
cl_mem m_dataset = nullptr;
|
||||
cl_mem m_entropy = nullptr;
|
||||
|
|
|
@ -81,7 +81,7 @@ const char *Algorithm::kRX_WOW = "rx/wow";
|
|||
const char *Algorithm::kRX_ARQ = "rx/arq";
|
||||
const char *Algorithm::kRX_GRAFT = "rx/graft";
|
||||
const char *Algorithm::kRX_SFX = "rx/sfx";
|
||||
const char *Algorithm::kRX_KEVA = "rx/keva";
|
||||
const char *Algorithm::kRX_YADA = "rx/yada";
|
||||
#endif
|
||||
|
||||
#ifdef XMRIG_ALGO_ARGON2
|
||||
|
@ -147,7 +147,7 @@ static const std::map<uint32_t, const char *> kAlgorithmNames = {
|
|||
ALGO_NAME(RX_ARQ),
|
||||
ALGO_NAME(RX_GRAFT),
|
||||
ALGO_NAME(RX_SFX),
|
||||
ALGO_NAME(RX_KEVA),
|
||||
ALGO_NAME(RX_YADA),
|
||||
# endif
|
||||
|
||||
# ifdef XMRIG_ALGO_ARGON2
|
||||
|
@ -261,8 +261,8 @@ static const std::map<const char *, Algorithm::Id, aliasCompare> kAlgorithmAlias
|
|||
ALGO_ALIAS(RX_GRAFT, "randomgraft"),
|
||||
ALGO_ALIAS_AUTO(RX_SFX), ALGO_ALIAS(RX_SFX, "randomx/sfx"),
|
||||
ALGO_ALIAS(RX_SFX, "randomsfx"),
|
||||
ALGO_ALIAS_AUTO(RX_KEVA), ALGO_ALIAS(RX_KEVA, "randomx/keva"),
|
||||
ALGO_ALIAS(RX_KEVA, "randomkeva"),
|
||||
ALGO_ALIAS_AUTO(RX_YADA), ALGO_ALIAS(RX_YADA, "randomx/yada"),
|
||||
ALGO_ALIAS(RX_YADA, "randomyada"),
|
||||
# endif
|
||||
|
||||
# ifdef XMRIG_ALGO_ARGON2
|
||||
|
@ -350,7 +350,7 @@ std::vector<xmrig::Algorithm> xmrig::Algorithm::all(const std::function<bool(con
|
|||
CN_HEAVY_0, CN_HEAVY_TUBE, CN_HEAVY_XHV,
|
||||
CN_PICO_0, CN_PICO_TLO,
|
||||
CN_UPX2,
|
||||
RX_0, RX_WOW, RX_ARQ, RX_GRAFT, RX_SFX, RX_KEVA,
|
||||
RX_0, RX_WOW, RX_ARQ, RX_GRAFT, RX_SFX, RX_YADA,
|
||||
AR2_CHUKWA, AR2_CHUKWA_V2, AR2_WRKZ,
|
||||
KAWPOW_RVN,
|
||||
GHOSTRIDER_RTM
|
||||
|
|
|
@ -77,7 +77,7 @@ public:
|
|||
RX_ARQ = 0x72121061, // "rx/arq" RandomARQ (Arqma).
|
||||
RX_GRAFT = 0x72151267, // "rx/graft" RandomGRAFT (Graft).
|
||||
RX_SFX = 0x72151273, // "rx/sfx" RandomSFX (Safex Cash).
|
||||
RX_KEVA = 0x7214116b, // "rx/keva" RandomKEVA (Keva).
|
||||
RX_YADA = 0x72151279, // "rx/yada" RandomYada (YadaCoin).
|
||||
AR2_CHUKWA = 0x61130000, // "argon2/chukwa" Argon2id (Chukwa).
|
||||
AR2_CHUKWA_V2 = 0x61140000, // "argon2/chukwav2" Argon2id (Chukwa v2).
|
||||
AR2_WRKZ = 0x61120000, // "argon2/wrkz" Argon2id (WRKZ)
|
||||
|
@ -143,7 +143,7 @@ public:
|
|||
static const char *kRX_ARQ;
|
||||
static const char *kRX_GRAFT;
|
||||
static const char *kRX_SFX;
|
||||
static const char *kRX_KEVA;
|
||||
static const char *kRX_YADA;
|
||||
# endif
|
||||
|
||||
# ifdef XMRIG_ALGO_ARGON2
|
||||
|
|
|
@ -50,11 +50,11 @@ static const CoinInfo coinInfo[] = {
|
|||
{ Algorithm::CN_R, "SUMO", "Sumokoin", 240, 1000000000, BLUE_BG_BOLD( WHITE_BOLD_S " sumo ") },
|
||||
{ Algorithm::RX_ARQ, "ARQ", "ArQmA", 120, 1000000000, BLUE_BG_BOLD( WHITE_BOLD_S " arqma ") },
|
||||
{ Algorithm::RX_GRAFT, "GRFT", "Graft", 120, 10000000000, BLUE_BG_BOLD( WHITE_BOLD_S " graft ") },
|
||||
{ Algorithm::RX_KEVA, "KVA", "Kevacoin", 0, 0, MAGENTA_BG_BOLD(WHITE_BOLD_S " keva ") },
|
||||
{ Algorithm::KAWPOW_RVN, "RVN", "Ravencoin", 0, 0, BLUE_BG_BOLD( WHITE_BOLD_S " raven ") },
|
||||
{ Algorithm::RX_WOW, "WOW", "Wownero", 300, 100000000000, MAGENTA_BG_BOLD(WHITE_BOLD_S " wownero ") },
|
||||
{ Algorithm::RX_0, "ZEPH", "Zephyr", 120, 1000000000000, BLUE_BG_BOLD( WHITE_BOLD_S " zephyr ") },
|
||||
{ Algorithm::RX_0, "Townforge","Townforge", 30, 100000000, MAGENTA_BG_BOLD(WHITE_BOLD_S " townforge ") },
|
||||
{ Algorithm::RX_YADA, "YDA", "YadaCoin", 120, 100000000, BLUE_BG_BOLD( WHITE_BOLD_S " yada ") },
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -36,11 +36,11 @@ public:
|
|||
SUMO,
|
||||
ARQMA,
|
||||
GRAFT,
|
||||
KEVA,
|
||||
RAVEN,
|
||||
WOWNERO,
|
||||
ZEPHYR,
|
||||
TOWNFORGE,
|
||||
YADA,
|
||||
MAX
|
||||
};
|
||||
|
||||
|
|
|
@ -211,11 +211,13 @@ rapidjson::Value xmrig::Json::normalize(double value, bool zero)
|
|||
{
|
||||
using namespace rapidjson;
|
||||
|
||||
if (!std::isnormal(value)) {
|
||||
const double value_rounded = floor(value * 100.0) / 100.0;
|
||||
|
||||
if (!std::isnormal(value) || !std::isnormal(value_rounded)) {
|
||||
return zero ? Value(0.0) : Value(kNullType);
|
||||
}
|
||||
|
||||
return Value(floor(value * 100.0) / 100.0);
|
||||
return Value(value_rounded);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -5,8 +5,8 @@
|
|||
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
||||
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||
* Copyright 2018-2024 SChernykh <https://github.com/SChernykh>
|
||||
* Copyright 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
|
||||
|
@ -22,11 +22,9 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#include <cstdio>
|
||||
#include <uv.h>
|
||||
|
||||
|
||||
#ifdef XMRIG_FEATURE_TLS
|
||||
# include <openssl/opensslv.h>
|
||||
#endif
|
||||
|
@ -66,13 +64,13 @@ static int showVersion()
|
|||
# endif
|
||||
|
||||
printf("\n features:"
|
||||
# if defined(__i386__) || defined(_M_IX86)
|
||||
" 32-bit"
|
||||
# elif defined(__x86_64__) || defined(_M_AMD64)
|
||||
# if defined(__x86_64__) || defined(_M_AMD64) || defined (__arm64__) || defined (__aarch64__)
|
||||
" 64-bit"
|
||||
# else
|
||||
" 32-bit"
|
||||
# endif
|
||||
|
||||
# if defined(__AES__) || defined(_MSC_VER)
|
||||
# if defined(__AES__) || defined(_MSC_VER) || defined(__ARM_FEATURE_CRYPTO)
|
||||
" AES"
|
||||
# endif
|
||||
"\n");
|
||||
|
|
|
@ -363,7 +363,7 @@ bool xmrig::Client::parseJob(const rapidjson::Value ¶ms, int *code)
|
|||
|
||||
Job job(has<EXT_NICEHASH>(), m_pool.algorithm(), m_rpcId);
|
||||
|
||||
if (!job.setId(params["job_id"].GetString())) {
|
||||
if (!job.setId(Json::getString(params, "job_id"))) {
|
||||
*code = 3;
|
||||
return false;
|
||||
}
|
||||
|
@ -400,7 +400,7 @@ bool xmrig::Client::parseJob(const rapidjson::Value ¶ms, int *code)
|
|||
}
|
||||
}
|
||||
|
||||
if (!job.setTarget(params["target"].GetString())) {
|
||||
if (!job.setTarget(Json::getString(params, "target"))) {
|
||||
*code = 5;
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -7,8 +7,8 @@
|
|||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||
* Copyright 2018 Lee Clagett <https://github.com/vtnerd>
|
||||
* Copyright 2019 Howard Chu <https://github.com/hyc>
|
||||
* Copyright 2018-2021 SChernykh <https://github.com/SChernykh>
|
||||
* Copyright 2016-2021 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||
* Copyright 2018-2024 SChernykh <https://github.com/SChernykh>
|
||||
* Copyright 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
|
||||
|
@ -24,11 +24,9 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
|
||||
|
||||
#include "base/net/stratum/Job.h"
|
||||
#include "base/tools/Alignment.h"
|
||||
#include "base/tools/Buffer.h"
|
||||
|
@ -112,35 +110,69 @@ bool xmrig::Job::setSeedHash(const char *hash)
|
|||
|
||||
bool xmrig::Job::setTarget(const char *target)
|
||||
{
|
||||
if (!target) {
|
||||
static auto parse = [](const char *target, size_t size, const Algorithm &algorithm) -> uint64_t {
|
||||
if (algorithm == Algorithm::RX_YADA) {
|
||||
return strtoull(target, nullptr, 16);
|
||||
}
|
||||
|
||||
const auto raw = Cvt::fromHex(target, size);
|
||||
|
||||
switch (raw.size()) {
|
||||
case 4:
|
||||
return 0xFFFFFFFFFFFFFFFFULL / (0xFFFFFFFFULL / uint64_t(*reinterpret_cast<const uint32_t *>(raw.data())));
|
||||
|
||||
case 8:
|
||||
return *reinterpret_cast<const uint64_t *>(raw.data());
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
};
|
||||
|
||||
const size_t size = target ? strlen(target) : 0;
|
||||
|
||||
if (size < 4 || (m_target = parse(target, size, algorithm())) == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const auto raw = Cvt::fromHex(target, strlen(target));
|
||||
const size_t size = raw.size();
|
||||
|
||||
if (size == 4) {
|
||||
m_target = 0xFFFFFFFFFFFFFFFFULL / (0xFFFFFFFFULL / uint64_t(*reinterpret_cast<const uint32_t *>(raw.data())));
|
||||
}
|
||||
else if (size == 8) {
|
||||
m_target = *reinterpret_cast<const uint64_t *>(raw.data());
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
|
||||
# ifdef XMRIG_PROXY_PROJECT
|
||||
assert(sizeof(m_rawTarget) > (size * 2));
|
||||
|
||||
memset(m_rawTarget, 0, sizeof(m_rawTarget));
|
||||
memcpy(m_rawTarget, target, std::min(size * 2, sizeof(m_rawTarget)));
|
||||
# endif
|
||||
|
||||
m_diff = toDiff(m_target);
|
||||
|
||||
# ifdef XMRIG_PROXY_PROJECT
|
||||
if (size >= sizeof(m_rawTarget)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
memset(m_rawTarget, 0, sizeof(m_rawTarget));
|
||||
memcpy(m_rawTarget, target, size);
|
||||
# endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
size_t xmrig::Job::nonceOffset() const
|
||||
{
|
||||
switch (algorithm().family()) {
|
||||
case Algorithm::KAWPOW:
|
||||
return 32;
|
||||
|
||||
case Algorithm::GHOSTRIDER:
|
||||
return 76;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (algorithm() == Algorithm::RX_YADA) {
|
||||
return 147;
|
||||
}
|
||||
|
||||
return 39;
|
||||
}
|
||||
|
||||
|
||||
void xmrig::Job::setDiff(uint64_t diff)
|
||||
{
|
||||
m_diff = diff;
|
||||
|
@ -171,14 +203,6 @@ void xmrig::Job::setSigKey(const char *sig_key)
|
|||
}
|
||||
|
||||
|
||||
int32_t xmrig::Job::nonceOffset() const
|
||||
{
|
||||
auto f = algorithm().family();
|
||||
if (f == Algorithm::KAWPOW) return 32;
|
||||
if (f == Algorithm::GHOSTRIDER) return 76;
|
||||
return 39;
|
||||
}
|
||||
|
||||
uint32_t xmrig::Job::getNumTransactions() const
|
||||
{
|
||||
if (!(m_algorithm.isCN() || m_algorithm.family() == Algorithm::RANDOM_X)) {
|
||||
|
|
|
@ -7,8 +7,8 @@
|
|||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||
* Copyright 2018 Lee Clagett <https://github.com/vtnerd>
|
||||
* Copyright 2019 Howard Chu <https://github.com/hyc>
|
||||
* Copyright 2018-2021 SChernykh <https://github.com/SChernykh>
|
||||
* Copyright 2016-2021 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||
* Copyright 2018-2024 SChernykh <https://github.com/SChernykh>
|
||||
* Copyright 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
|
||||
|
@ -27,11 +27,9 @@
|
|||
#ifndef XMRIG_JOB_H
|
||||
#define XMRIG_JOB_H
|
||||
|
||||
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
|
||||
|
||||
#include "base/crypto/Algorithm.h"
|
||||
#include "base/tools/Buffer.h"
|
||||
#include "base/tools/String.h"
|
||||
|
@ -63,6 +61,7 @@ public:
|
|||
bool setBlob(const char *blob);
|
||||
bool setSeedHash(const char *hash);
|
||||
bool setTarget(const char *target);
|
||||
size_t nonceOffset() const;
|
||||
void setDiff(uint64_t diff);
|
||||
void setSigKey(const char *sig_key);
|
||||
|
||||
|
@ -77,7 +76,6 @@ public:
|
|||
inline const String &poolWallet() const { return m_poolWallet; }
|
||||
inline const uint32_t *nonce() const { return reinterpret_cast<const uint32_t*>(m_blob + nonceOffset()); }
|
||||
inline const uint8_t *blob() const { return m_blob; }
|
||||
int32_t nonceOffset() const;
|
||||
inline size_t nonceSize() const { return (algorithm().family() == Algorithm::KAWPOW) ? 8 : 4; }
|
||||
inline size_t size() const { return m_size; }
|
||||
inline uint32_t *nonce() { return reinterpret_cast<uint32_t*>(m_blob + nonceOffset()); }
|
||||
|
@ -111,7 +109,7 @@ public:
|
|||
|
||||
inline bool operator!=(const Job &other) const { return !isEqual(other); }
|
||||
inline bool operator==(const Job &other) const { return isEqual(other); }
|
||||
inline Job &operator=(const Job &other) { copy(other); return *this; }
|
||||
inline Job &operator=(const Job &other) { if (this != &other) { copy(other); } return *this; }
|
||||
inline Job &operator=(Job &&other) noexcept { move(std::move(other)); return *this; }
|
||||
|
||||
# ifdef XMRIG_FEATURE_BENCHMARK
|
||||
|
|
|
@ -173,7 +173,7 @@ public:
|
|||
Value total(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) {
|
||||
const Hashrate *hr = backend->hashrate();
|
||||
|
@ -181,9 +181,13 @@ public:
|
|||
continue;
|
||||
}
|
||||
|
||||
t[0] += hr->calc(Hashrate::ShortInterval);
|
||||
t[1] += hr->calc(Hashrate::MediumInterval);
|
||||
t[2] += hr->calc(Hashrate::LargeInterval);
|
||||
const auto h0 = hr->calc(Hashrate::ShortInterval);
|
||||
const auto h1 = hr->calc(Hashrate::MediumInterval);
|
||||
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) {
|
||||
continue;
|
||||
|
@ -204,7 +208,7 @@ public:
|
|||
total.PushBack(Hashrate::normalize(t[2]), 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) {
|
||||
hashrate.AddMember("threads", threads, allocator);
|
||||
|
@ -283,7 +287,7 @@ public:
|
|||
void printHashrate(bool details)
|
||||
{
|
||||
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;
|
||||
|
||||
double avg_hashrate = 0.0;
|
||||
|
@ -293,9 +297,13 @@ public:
|
|||
if (hashrate) {
|
||||
++count;
|
||||
|
||||
speed[0] += hashrate->calc(Hashrate::ShortInterval);
|
||||
speed[1] += hashrate->calc(Hashrate::MediumInterval);
|
||||
speed[2] += hashrate->calc(Hashrate::LargeInterval);
|
||||
const auto h0 = hashrate->calc(Hashrate::ShortInterval);
|
||||
const auto h1 = hashrate->calc(Hashrate::MediumInterval);
|
||||
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();
|
||||
}
|
||||
|
@ -312,8 +320,13 @@ public:
|
|||
double scale = 1.0;
|
||||
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;
|
||||
|
||||
speed[0].second *= scale;
|
||||
speed[1].second *= scale;
|
||||
speed[2].second *= scale;
|
||||
|
||||
h = "MH/s";
|
||||
}
|
||||
|
||||
|
@ -322,16 +335,16 @@ public:
|
|||
|
||||
# ifdef XMRIG_ALGO_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
|
||||
|
||||
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(),
|
||||
Hashrate::format(speed[0] * scale, num, 16),
|
||||
Hashrate::format(speed[1] * scale, num + 16, 16),
|
||||
Hashrate::format(speed[2] * scale, num + 16 * 2, 16), h,
|
||||
Hashrate::format(maxHashrate[algorithm] * scale, num + 16 * 3, 16), h,
|
||||
Hashrate::format(speed[0], num, 16),
|
||||
Hashrate::format(speed[1], num + 16, 16),
|
||||
Hashrate::format(speed[2], num + 16 * 2, 16), h,
|
||||
Hashrate::format({ maxHashrate[algorithm] > 0.0, maxHashrate[algorithm] * scale }, num + 16 * 3, 16), h,
|
||||
avg_hashrate_buf
|
||||
);
|
||||
|
||||
|
@ -576,6 +589,11 @@ void xmrig::Miner::setJob(const Job &job, bool donate)
|
|||
|
||||
# ifdef XMRIG_ALGO_RANDOMX
|
||||
const bool ready = d_ptr->initRX();
|
||||
|
||||
// Always reset nonce on RandomX dataset change
|
||||
if (!ready) {
|
||||
d_ptr->reset = true;
|
||||
}
|
||||
# else
|
||||
constexpr const bool ready = true;
|
||||
# endif
|
||||
|
@ -641,7 +659,10 @@ void xmrig::Miner::onTimer(const Timer *)
|
|||
}
|
||||
|
||||
if (backend->hashrate()) {
|
||||
maxHashrate += backend->hashrate()->calc(Hashrate::ShortInterval);
|
||||
const auto h = backend->hashrate()->calc(Hashrate::ShortInterval);
|
||||
if (h.first) {
|
||||
maxHashrate += h.second;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ xmrig -a gr -o rtm.suprnova.cc:4273 --tls -u WALLET_ADDRESS -p x
|
|||
|
||||
You can use **rtm_ghostrider_example.cmd** as a template and put pool URL and your wallet address there. The general XMRig documentation is available [here](https://xmrig.com/docs/miner).
|
||||
|
||||
**Using `--threads` or `-t` option is NOT recommended because it turns off advanced built-in config.** If you want to tweak the nubmer of threads used for GhostRider, it's recommended to start using config.json instead of command line. The best suitable command line option for this is `--cpu-max-threads-hint=N` where N can be between 0 and 100.
|
||||
**Using `--threads` or `-t` option is NOT recommended because it turns off advanced built-in config.** If you want to tweak the number of threads used for GhostRider, it's recommended to start using config.json instead of command line. The best suitable command line option for this is `--cpu-max-threads-hint=N` where N can be between 0 and 100.
|
||||
|
||||
## Performance
|
||||
|
||||
|
|
|
@ -94,7 +94,7 @@ static size_t CalcDatasetItemSize()
|
|||
// Main loop prologue
|
||||
((uint8_t*)randomx_calc_dataset_item_aarch64_mix - ((uint8_t*)randomx_calc_dataset_item_aarch64_prefetch)) + 4 +
|
||||
// Inner main loop (instructions)
|
||||
((RandomX_ConfigurationBase::SuperscalarLatency * 3) + 2) * 16 +
|
||||
((RandomX_ConfigurationBase::SuperscalarMaxLatency * 3) + 2) * 16 +
|
||||
// Main loop epilogue
|
||||
((uint8_t*)randomx_calc_dataset_item_aarch64_store_result - (uint8_t*)randomx_calc_dataset_item_aarch64_mix) + 4
|
||||
) +
|
||||
|
|
|
@ -266,6 +266,10 @@ namespace randomx {
|
|||
// AVX2 init is slower on Zen4
|
||||
initDatasetAVX2 = false;
|
||||
break;
|
||||
case xmrig::ICpuInfo::ARCH_ZEN5:
|
||||
// AVX2 init is 49% faster on Zen5
|
||||
initDatasetAVX2 = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -100,17 +100,18 @@ RandomX_ConfigurationSafex::RandomX_ConfigurationSafex()
|
|||
ArgonSalt = "RandomSFX\x01";
|
||||
}
|
||||
|
||||
RandomX_ConfigurationKeva::RandomX_ConfigurationKeva()
|
||||
RandomX_ConfigurationYada::RandomX_ConfigurationYada()
|
||||
{
|
||||
ArgonSalt = "RandomKV\x01";
|
||||
ScratchpadL2_Size = 131072;
|
||||
ScratchpadL3_Size = 1048576;
|
||||
ArgonSalt = "RandomXYadaCoin\x03";
|
||||
SuperscalarLatency = 150;
|
||||
ArgonIterations = 4;
|
||||
}
|
||||
|
||||
RandomX_ConfigurationBase::RandomX_ConfigurationBase()
|
||||
: ArgonIterations(3)
|
||||
, ArgonLanes(1)
|
||||
, ArgonSalt("RandomX\x03")
|
||||
, SuperscalarLatency(170)
|
||||
, ScratchpadL1_Size(16384)
|
||||
, ScratchpadL2_Size(262144)
|
||||
, ScratchpadL3_Size(2097152)
|
||||
|
@ -357,7 +358,7 @@ RandomX_ConfigurationWownero RandomX_WowneroConfig;
|
|||
RandomX_ConfigurationArqma RandomX_ArqmaConfig;
|
||||
RandomX_ConfigurationGraft RandomX_GraftConfig;
|
||||
RandomX_ConfigurationSafex RandomX_SafexConfig;
|
||||
RandomX_ConfigurationKeva RandomX_KevaConfig;
|
||||
RandomX_ConfigurationYada RandomX_YadaConfig;
|
||||
|
||||
alignas(64) RandomX_ConfigurationBase RandomX_CurrentConfig;
|
||||
|
||||
|
|
|
@ -69,7 +69,7 @@ struct RandomX_ConfigurationBase
|
|||
{
|
||||
ArgonMemory = 262144,
|
||||
CacheAccesses = 8,
|
||||
SuperscalarLatency = 170,
|
||||
SuperscalarMaxLatency = 170,
|
||||
DatasetBaseSize = 2147483648,
|
||||
DatasetExtraSize = 33554368,
|
||||
JumpBits = 8,
|
||||
|
@ -82,6 +82,7 @@ struct RandomX_ConfigurationBase
|
|||
uint32_t ArgonIterations;
|
||||
uint32_t ArgonLanes;
|
||||
const char* ArgonSalt;
|
||||
uint32_t SuperscalarLatency;
|
||||
|
||||
uint32_t ScratchpadL1_Size;
|
||||
uint32_t ScratchpadL2_Size;
|
||||
|
@ -146,14 +147,14 @@ struct RandomX_ConfigurationWownero : public RandomX_ConfigurationBase { RandomX
|
|||
struct RandomX_ConfigurationArqma : public RandomX_ConfigurationBase { RandomX_ConfigurationArqma(); };
|
||||
struct RandomX_ConfigurationGraft : public RandomX_ConfigurationBase { RandomX_ConfigurationGraft(); };
|
||||
struct RandomX_ConfigurationSafex : public RandomX_ConfigurationBase { RandomX_ConfigurationSafex(); };
|
||||
struct RandomX_ConfigurationKeva : public RandomX_ConfigurationBase { RandomX_ConfigurationKeva(); };
|
||||
struct RandomX_ConfigurationYada : public RandomX_ConfigurationBase { RandomX_ConfigurationYada(); };
|
||||
|
||||
extern RandomX_ConfigurationMonero RandomX_MoneroConfig;
|
||||
extern RandomX_ConfigurationWownero RandomX_WowneroConfig;
|
||||
extern RandomX_ConfigurationArqma RandomX_ArqmaConfig;
|
||||
extern RandomX_ConfigurationGraft RandomX_GraftConfig;
|
||||
extern RandomX_ConfigurationSafex RandomX_SafexConfig;
|
||||
extern RandomX_ConfigurationKeva RandomX_KevaConfig;
|
||||
extern RandomX_ConfigurationYada RandomX_YadaConfig;
|
||||
|
||||
extern RandomX_ConfigurationBase RandomX_CurrentConfig;
|
||||
|
||||
|
|
|
@ -44,8 +44,8 @@ const RandomX_ConfigurationBase *xmrig::RxAlgo::base(Algorithm::Id algorithm)
|
|||
case Algorithm::RX_SFX:
|
||||
return &RandomX_SafexConfig;
|
||||
|
||||
case Algorithm::RX_KEVA:
|
||||
return &RandomX_KevaConfig;
|
||||
case Algorithm::RX_YADA:
|
||||
return &RandomX_YadaConfig;
|
||||
|
||||
default:
|
||||
break;
|
||||
|
|
|
@ -53,13 +53,15 @@ static const std::array<const char *, RxConfig::ModeMax> modeNames = { "auto", "
|
|||
|
||||
|
||||
#ifdef XMRIG_FEATURE_MSR
|
||||
constexpr size_t kMsrArraySize = 6;
|
||||
constexpr size_t kMsrArraySize = 7;
|
||||
|
||||
static const std::array<MsrItems, kMsrArraySize> msrPresets = {
|
||||
MsrItems(),
|
||||
MsrItems{{ 0xC0011020, 0ULL }, { 0xC0011021, 0x40ULL, ~0x20ULL }, { 0xC0011022, 0x1510000ULL }, { 0xC001102b, 0x2000cc16ULL }},
|
||||
MsrItems{{ 0xC0011020, 0x0004480000000000ULL }, { 0xC0011021, 0x001c000200000040ULL, ~0x20ULL }, { 0xC0011022, 0xc000000401570000ULL }, { 0xC001102b, 0x2000cc10ULL }},
|
||||
MsrItems{{ 0xC0011020, 0x0004400000000000ULL }, { 0xC0011021, 0x0004000000000040ULL, ~0x20ULL }, { 0xC0011022, 0x8680000401570000ULL }, { 0xC001102b, 0x2040cc10ULL }},
|
||||
MsrItems{{ 0xC0011020, 0x0004400000000000ULL }, { 0xC0011021, 0x0004000000000040ULL, ~0x20ULL }, { 0xC0011022, 0x8680000401570000ULL }, { 0xC001102b, 0x2040cc10ULL }},
|
||||
|
||||
MsrItems{{ 0x1a4, 0xf }},
|
||||
MsrItems()
|
||||
};
|
||||
|
|
|
@ -22,15 +22,15 @@
|
|||
#define APP_ID "xmrig"
|
||||
#define APP_NAME "XMRig"
|
||||
#define APP_DESC "XMRig miner"
|
||||
#define APP_VERSION "6.21.3"
|
||||
#define APP_VERSION "6.22.2"
|
||||
#define APP_DOMAIN "xmrig.com"
|
||||
#define APP_SITE "www.xmrig.com"
|
||||
#define APP_COPYRIGHT "Copyright (C) 2016-2024 xmrig.com"
|
||||
#define APP_KIND "miner"
|
||||
|
||||
#define APP_VER_MAJOR 6
|
||||
#define APP_VER_MINOR 21
|
||||
#define APP_VER_PATCH 3
|
||||
#define APP_VER_MINOR 22
|
||||
#define APP_VER_PATCH 2
|
||||
|
||||
#ifdef _MSC_VER
|
||||
# if (_MSC_VER >= 1930)
|
||||
|
|
Loading…
Reference in a new issue