mirror of
https://github.com/xmrig/xmrig.git
synced 2025-12-07 07:55:04 -05:00
Compare commits
447 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4c5421b2bf | ||
|
|
6dd281b508 | ||
|
|
599958c982 | ||
|
|
328f985e07 | ||
|
|
7fc7b976bf | ||
|
|
36b1523194 | ||
|
|
5155139e9a | ||
|
|
a152d6be42 | ||
|
|
ccebf6bb20 | ||
|
|
5b4648339a | ||
|
|
7727014eea | ||
|
|
8c45e3226d | ||
|
|
75403ee275 | ||
|
|
c4db1435b2 | ||
|
|
f3ea3c5227 | ||
|
|
722e468bd9 | ||
|
|
9569772e7e | ||
|
|
144f9c4409 | ||
|
|
2ecece7b3d | ||
|
|
677d287135 | ||
|
|
62eb66486d | ||
|
|
da03d74ade | ||
|
|
9fcc542676 | ||
|
|
581d004568 | ||
|
|
4f7186cb0e | ||
|
|
65fa1d9bf3 | ||
|
|
f85efd163c | ||
|
|
eb8cf3ee5a | ||
|
|
793a2454ad | ||
|
|
4a74ce3242 | ||
|
|
87a54766eb | ||
|
|
22a69f70da | ||
|
|
3fbf2ac3d4 | ||
|
|
0a2fe5caa7 | ||
|
|
17795e3d7b | ||
|
|
1fdc8631e3 | ||
|
|
858463ceba | ||
|
|
a4550f55ea | ||
|
|
d9b6f46a6a | ||
|
|
4bac3e7695 | ||
|
|
59bd6d4187 | ||
|
|
166c011d37 | ||
|
|
1f55c6eb02 | ||
|
|
c2bdae70fe | ||
|
|
1289942567 | ||
|
|
44dcded866 | ||
|
|
8deb247b3e | ||
|
|
a705ab775b | ||
|
|
bfd5a81937 | ||
|
|
c710ee5fb5 | ||
|
|
a8466a139c | ||
|
|
ba47219185 | ||
|
|
cf54c85b76 | ||
|
|
fa5b872782 | ||
|
|
3ee0cd8c51 | ||
|
|
7bdeba4d08 | ||
|
|
116fb3d3f9 | ||
|
|
54a17a75ab | ||
|
|
5f0f2506e8 | ||
|
|
31e896feef | ||
|
|
8bfd7bcf05 | ||
|
|
ec13337228 | ||
|
|
cfe2a098ce | ||
|
|
a89c2c8dd1 | ||
|
|
ebf259fa7c | ||
|
|
1b4a124bc5 | ||
|
|
4bb8be8a29 | ||
|
|
d45bb24a32 | ||
|
|
5a7bcb2d03 | ||
|
|
f1ec8a18f6 | ||
|
|
7b4f768114 | ||
|
|
dfab81e9fa | ||
|
|
3025c265e8 | ||
|
|
ee603ab9e2 | ||
|
|
84f8a0dc54 | ||
|
|
481deff163 | ||
|
|
0e9ed351a1 | ||
|
|
8952f6892d | ||
|
|
d51fe01273 | ||
|
|
f7d6348948 | ||
|
|
3a01ebe277 | ||
|
|
189cc78d44 | ||
|
|
9be3b69109 | ||
|
|
7b38af703e | ||
|
|
bef9031b03 | ||
|
|
e4929d7c06 | ||
|
|
1e26e58660 | ||
|
|
8fe0577d60 | ||
|
|
64f42feba9 | ||
|
|
36ed0b4309 | ||
|
|
cb0bba7e10 | ||
|
|
51a72afb0e | ||
|
|
b1b0a3ba95 | ||
|
|
9768bf65d1 | ||
|
|
1584cca6d1 | ||
|
|
891a46382e | ||
|
|
db920e8006 | ||
|
|
768a4581e0 | ||
|
|
866245b525 | ||
|
|
c7476e076b | ||
|
|
d11a313d88 | ||
|
|
8d1168385a | ||
|
|
852fe14604 | ||
|
|
30be1cd102 | ||
|
|
fa0bb0e1bf | ||
|
|
a05393727c | ||
|
|
adf833b60a | ||
|
|
23daceb4dc | ||
|
|
4a9db89527 | ||
|
|
060c1af4c4 | ||
|
|
b826985d05 | ||
|
|
0f09883429 | ||
|
|
a84b45b1bb | ||
|
|
a5b6383f7b | ||
|
|
24f8f76714 | ||
|
|
ba336122c0 | ||
|
|
591744174c | ||
|
|
fc85017948 | ||
|
|
24f541a0dd | ||
|
|
f552577e71 | ||
|
|
a06ec06e8b | ||
|
|
96833d4790 | ||
|
|
5611ae9a30 | ||
|
|
72c8404d18 | ||
|
|
bc128d11d9 | ||
|
|
ff13675d31 | ||
|
|
4b682b6633 | ||
|
|
879e160ba3 | ||
|
|
9a6b8594f3 | ||
|
|
a354e9d217 | ||
|
|
950b5fa75e | ||
|
|
9f66d59c0a | ||
|
|
9d99fef52e | ||
|
|
3b22f1704f | ||
|
|
c89ad6b36d | ||
|
|
45300f1ff5 | ||
|
|
847d08cdbc | ||
|
|
81af1e964d | ||
|
|
3662e45435 | ||
|
|
f06e30e343 | ||
|
|
34d4aa4012 | ||
|
|
3e4bf8cd6c | ||
|
|
206b675892 | ||
|
|
00b4ae9c36 | ||
|
|
8d5ea745bb | ||
|
|
cac48cdd27 | ||
|
|
c20010ed54 | ||
|
|
5926dee354 | ||
|
|
b78b0b5c6b | ||
|
|
43afa437e4 | ||
|
|
050568a4ab | ||
|
|
8bf40cea36 | ||
|
|
ae3ff0f570 | ||
|
|
0addf91a70 | ||
|
|
abb78302b8 | ||
|
|
e5579d8635 | ||
|
|
3986c43fa5 | ||
|
|
838cc08680 | ||
|
|
a0fe49f946 | ||
|
|
70dbe8562c | ||
|
|
41fcd1e49a | ||
|
|
90195caa1d | ||
|
|
cdb6287d89 | ||
|
|
32e9b7e34a | ||
|
|
6484bbb716 | ||
|
|
e59806d6ae | ||
|
|
299b180b28 | ||
|
|
1acd88ed39 | ||
|
|
109c088e8a | ||
|
|
bb18239642 | ||
|
|
ccded7cc0a | ||
|
|
5bc89fdc8b | ||
|
|
70c7f33a20 | ||
|
|
1ec185a3a0 | ||
|
|
6aa4eeefbb | ||
|
|
10ea567084 | ||
|
|
028d6503aa | ||
|
|
51346c2b2b | ||
|
|
ca535c7813 | ||
|
|
ba80e27349 | ||
|
|
bd8cf54a0b | ||
|
|
e0eed7d5d6 | ||
|
|
8dff08f15f | ||
|
|
47d68b068b | ||
|
|
a648a8b9be | ||
|
|
7eefccc6bc | ||
|
|
1bf159d1e8 | ||
|
|
bf46cb8684 | ||
|
|
72c385c870 | ||
|
|
c83429c55c | ||
|
|
e5a2689052 | ||
|
|
b665d2d865 | ||
|
|
e06a76ef1c | ||
|
|
f523fddbfd | ||
|
|
30165ce4be | ||
|
|
83a10cce8c | ||
|
|
71cc486553 | ||
|
|
2eaf8edf0e | ||
|
|
3d740e81a2 | ||
|
|
ef475d98da | ||
|
|
5e92acab34 | ||
|
|
935b8a1106 | ||
|
|
c371a7a2bb | ||
|
|
4fe011b469 | ||
|
|
bf32802a82 | ||
|
|
ccfbba94f2 | ||
|
|
70d7fe9b59 | ||
|
|
34a5c89ee2 | ||
|
|
39ed25cf7b | ||
|
|
26c2200af3 | ||
|
|
aa5a7c3c13 | ||
|
|
08ca51ec4c | ||
|
|
bbd9945866 | ||
|
|
59313d9cc3 | ||
|
|
2da5d31a5d | ||
|
|
5724d8beb6 | ||
|
|
03e9797b92 | ||
|
|
74bd9460d7 | ||
|
|
f033cb7f46 | ||
|
|
38cf5b6324 | ||
|
|
16863763d3 | ||
|
|
aa1934d273 | ||
|
|
4bfe7c7090 | ||
|
|
c61dafce60 | ||
|
|
a4d086c451 | ||
|
|
12394c7c78 | ||
|
|
a83f2c809c | ||
|
|
416c9eff69 | ||
|
|
cee3aeb116 | ||
|
|
77ca380697 | ||
|
|
28c81f2c53 | ||
|
|
945d1db05c | ||
|
|
5324761e06 | ||
|
|
f7d1d50a25 | ||
|
|
dc0aee1432 | ||
|
|
e4c8714daa | ||
|
|
b974f1dc73 | ||
|
|
1b928e8bf1 | ||
|
|
8ac03a0d89 | ||
|
|
69a6111a4f | ||
|
|
78476c5da0 | ||
|
|
e4779ab6ca | ||
|
|
1c63a8e7c3 | ||
|
|
f42a100937 | ||
|
|
2d2f3d4eb2 | ||
|
|
3472bd9f02 | ||
|
|
8c979d3bc7 | ||
|
|
11ed37ea63 | ||
|
|
1afec10c7c | ||
|
|
12728649ff | ||
|
|
fa2461ba73 | ||
|
|
7ec14f249d | ||
|
|
e2a5b40793 | ||
|
|
d30bf207e9 | ||
|
|
dbc8e20e53 | ||
|
|
2170b58b6f | ||
|
|
75c57f7563 | ||
|
|
baa3384d12 | ||
|
|
5e1199ea48 | ||
|
|
5c5d841776 | ||
|
|
a28bddcbdf | ||
|
|
0bfe501dac | ||
|
|
3f237ae348 | ||
|
|
f4f88ea1f7 | ||
|
|
0e7bf5913b | ||
|
|
7f00cb59d2 | ||
|
|
2198beff59 | ||
|
|
0b304c1584 | ||
|
|
5ea0de2410 | ||
|
|
958224255a | ||
|
|
ea72052f50 | ||
|
|
9a02caf248 | ||
|
|
33bfecd49b | ||
|
|
f18bfeb77d | ||
|
|
ba017708bb | ||
|
|
0dbf41f761 | ||
|
|
936670f0fd | ||
|
|
ba405d1984 | ||
|
|
e17f686d4f | ||
|
|
74aff6b8f4 | ||
|
|
4f74675a19 | ||
|
|
4209aeb94d | ||
|
|
9a98c31514 | ||
|
|
fdbb2debd8 | ||
|
|
958f50c372 | ||
|
|
bbd3f05bf6 | ||
|
|
dd8777c11b | ||
|
|
9cbdb7f1f2 | ||
|
|
95ef32c913 | ||
|
|
6370d71ebe | ||
|
|
169fad3a5c | ||
|
|
2fae0e1319 | ||
|
|
297ff13810 | ||
|
|
77a7f144c0 | ||
|
|
aa101b6e00 | ||
|
|
4edcaa03be | ||
|
|
9864ba8696 | ||
|
|
bdbb7f891f | ||
|
|
06809df4a0 | ||
|
|
c9730faa49 | ||
|
|
2e3d087750 | ||
|
|
6676126376 | ||
|
|
eb1ed497e7 | ||
|
|
32442db099 | ||
|
|
734f142b47 | ||
|
|
340437b6d2 | ||
|
|
fb0ce0bf61 | ||
|
|
7a3233ab4b | ||
|
|
0ad4257113 | ||
|
|
e3d727cdb6 | ||
|
|
df24b25b64 | ||
|
|
c3c475cdcc | ||
|
|
15000e2c22 | ||
|
|
def045adda | ||
|
|
22b937cc1c | ||
|
|
07025dc41b | ||
|
|
e6e1028017 | ||
|
|
5c4cdfd80c | ||
|
|
636b2e3cfa | ||
|
|
0a7324f500 | ||
|
|
532520f626 | ||
|
|
5905dd63cc | ||
|
|
52e2890824 | ||
|
|
0d7820f61a | ||
|
|
65dc8f3d85 | ||
|
|
e4aa1fad3f | ||
|
|
a797d808b5 | ||
|
|
2e34bf7a1b | ||
|
|
7f31f45b6d | ||
|
|
3cbf0dc0ee | ||
|
|
85af4e27ec | ||
|
|
a7caf4cc66 | ||
|
|
628506e266 | ||
|
|
39ae24b138 | ||
|
|
dd7789763f | ||
|
|
c828e6b793 | ||
|
|
4326ba3c38 | ||
|
|
b34e3e1a7b | ||
|
|
29966fb491 | ||
|
|
80d944bf82 | ||
|
|
c18478a6b4 | ||
|
|
a0eb766238 | ||
|
|
781f08a034 | ||
|
|
d33c91684d | ||
|
|
bbee212970 | ||
|
|
05d3f17f15 | ||
|
|
8aeba61706 | ||
|
|
46e49cde0b | ||
|
|
b38046db46 | ||
|
|
72861e353b | ||
|
|
a8e91bb888 | ||
|
|
0cc90b152d | ||
|
|
11ac59331f | ||
|
|
ca7ff4e90b | ||
|
|
0e7036cf24 | ||
|
|
c8c874dadf | ||
|
|
bfd017d064 | ||
|
|
37f44b4da5 | ||
|
|
2da551e1e9 | ||
|
|
fb4b4a56e2 | ||
|
|
b025bca185 | ||
|
|
87bb1aa4d3 | ||
|
|
2d95a394a6 | ||
|
|
9634907676 | ||
|
|
d27647e408 | ||
|
|
9c9e7fa998 | ||
|
|
1a495e351c | ||
|
|
680e4dd865 | ||
|
|
abb3340cc7 | ||
|
|
89e6998054 | ||
|
|
70a3a83c26 | ||
|
|
92810ad761 | ||
|
|
39bd3ca1da | ||
|
|
4d0edde66d | ||
|
|
69cbfd682a | ||
|
|
6ae37a9519 | ||
|
|
97305f11a8 | ||
|
|
2e6c518a1c | ||
|
|
7f01c5c6f3 | ||
|
|
f19b2f7248 | ||
|
|
914b7023a2 | ||
|
|
4dddd3a44f | ||
|
|
01236bc40b | ||
|
|
618ca6525b | ||
|
|
c71ef8197f | ||
|
|
1eccb9d66f | ||
|
|
c0f7e881ba | ||
|
|
f9c65f3bbf | ||
|
|
f19fcb4407 | ||
|
|
382bfb0957 | ||
|
|
b7fbb28a47 | ||
|
|
fbedf197ab | ||
|
|
fc68ed15bc | ||
|
|
53ac6f7ee7 | ||
|
|
50eb7ba2fd | ||
|
|
1b875fdabb | ||
|
|
bb96684daf | ||
|
|
1e88b8447f | ||
|
|
5b610e4dfe | ||
|
|
92a258f142 | ||
|
|
1986b45acd | ||
|
|
539943c655 | ||
|
|
adb3c22e80 | ||
|
|
e22f798085 | ||
|
|
8698b73036 | ||
|
|
64650bf121 | ||
|
|
9405d8ed92 | ||
|
|
219f033647 | ||
|
|
16a83a9f61 | ||
|
|
abfed74af9 | ||
|
|
ba4a11c619 | ||
|
|
f1b8351a63 | ||
|
|
a620dfc955 | ||
|
|
f1e688724e | ||
|
|
e8355e1a1c | ||
|
|
6cb27e9662 | ||
|
|
5fee8ba288 | ||
|
|
b7840d9ab6 | ||
|
|
d591832eea | ||
|
|
13ac54ada9 | ||
|
|
1f36ea2a8e | ||
|
|
ab90af37b3 | ||
|
|
88031650b4 | ||
|
|
4a5493e12f | ||
|
|
6a97aeaf1b | ||
|
|
6ac3534fd5 | ||
|
|
e210067660 | ||
|
|
50c66083a7 | ||
|
|
05dc9821c5 | ||
|
|
c623dc7c92 | ||
|
|
4a7897b8bc | ||
|
|
33a7530f9b | ||
|
|
44f0daf384 | ||
|
|
6a45d5dcc9 | ||
|
|
7bf12dc81f | ||
|
|
2020b71eeb | ||
|
|
cad5fef1ea | ||
|
|
56e88f57fb | ||
|
|
bc09aa5ad0 | ||
|
|
eeadea53e2 | ||
|
|
0528ccd01e | ||
|
|
5486300db7 | ||
|
|
b0dda2b5b3 | ||
|
|
c80ef54b60 | ||
|
|
31383861cd | ||
|
|
7c4b76f3f7 | ||
|
|
835228d9f7 |
142
CHANGELOG.md
142
CHANGELOG.md
@@ -1,3 +1,145 @@
|
|||||||
|
# v6.4.0
|
||||||
|
- [#1862](https://github.com/xmrig/xmrig/pull/1862) **RandomX: removed `rx/loki` algorithm.**
|
||||||
|
- [#1890](https://github.com/xmrig/xmrig/pull/1890) **Added `argon2/chukwav2` algorithm.**
|
||||||
|
- [#1895](https://github.com/xmrig/xmrig/pull/1895) [#1897](https://github.com/xmrig/xmrig/pull/1897) **Added [benchmark and stress test](https://github.com/xmrig/xmrig/blob/dev/doc/BENCHMARK.md).**
|
||||||
|
- [#1864](https://github.com/xmrig/xmrig/pull/1864) RandomX: improved software AES performance.
|
||||||
|
- [#1870](https://github.com/xmrig/xmrig/pull/1870) RandomX: fixed unexpected resume due to disconnect during dataset init.
|
||||||
|
- [#1872](https://github.com/xmrig/xmrig/pull/1872) RandomX: fixed `randomx_create_vm` call.
|
||||||
|
- [#1875](https://github.com/xmrig/xmrig/pull/1875) RandomX: fixed crash on x86.
|
||||||
|
- [#1876](https://github.com/xmrig/xmrig/pull/1876) RandomX: added `huge-pages-jit` config parameter.
|
||||||
|
- [#1881](https://github.com/xmrig/xmrig/pull/1881) Fixed possible race condition in hashrate counting code.
|
||||||
|
- [#1882](https://github.com/xmrig/xmrig/pull/1882) [#1886](https://github.com/xmrig/xmrig/pull/1886) [#1887](https://github.com/xmrig/xmrig/pull/1887) [#1893](https://github.com/xmrig/xmrig/pull/1893) General code improvements.
|
||||||
|
- [#1885](https://github.com/xmrig/xmrig/pull/1885) Added more precise hashrate calculation.
|
||||||
|
- [#1889](https://github.com/xmrig/xmrig/pull/1889) Fixed libuv performance issue on Linux.
|
||||||
|
|
||||||
|
# v6.3.5
|
||||||
|
- [#1845](https://github.com/xmrig/xmrig/pull/1845) [#1861](https://github.com/xmrig/xmrig/pull/1861) Fixed ARM build and added CMake option `WITH_SSE4_1`.
|
||||||
|
- [#1846](https://github.com/xmrig/xmrig/pull/1846) KawPow: fixed OpenCL memory leak.
|
||||||
|
- [#1849](https://github.com/xmrig/xmrig/pull/1849) [#1859](https://github.com/xmrig/xmrig/pull/1859) RandomX: optimized soft AES code.
|
||||||
|
- [#1850](https://github.com/xmrig/xmrig/pull/1850) [#1852](https://github.com/xmrig/xmrig/pull/1852) General code improvements.
|
||||||
|
- [#1853](https://github.com/xmrig/xmrig/issues/1853) [#1856](https://github.com/xmrig/xmrig/pull/1856) [#1857](https://github.com/xmrig/xmrig/pull/1857) Fixed crash on old CPUs.
|
||||||
|
|
||||||
|
# v6.3.4
|
||||||
|
- [#1823](https://github.com/xmrig/xmrig/pull/1823) RandomX: added new option `scratchpad_prefetch_mode`.
|
||||||
|
- [#1827](https://github.com/xmrig/xmrig/pull/1827) [#1831](https://github.com/xmrig/xmrig/pull/1831) Improved nonce iteration performance.
|
||||||
|
- [#1828](https://github.com/xmrig/xmrig/pull/1828) RandomX: added SSE4.1-optimized Blake2b.
|
||||||
|
- [#1830](https://github.com/xmrig/xmrig/pull/1830) RandomX: added performance profiler (for developers).
|
||||||
|
- [#1835](https://github.com/xmrig/xmrig/pull/1835) RandomX: returned old soft AES implementation and added auto-select between the two.
|
||||||
|
- [#1840](https://github.com/xmrig/xmrig/pull/1840) RandomX: moved more stuff to compile time, small x86 JIT compiler speedup.
|
||||||
|
- [#1841](https://github.com/xmrig/xmrig/pull/1841) Fixed Cryptonight OpenCL for AMD 20.7.2 drivers.
|
||||||
|
- [#1842](https://github.com/xmrig/xmrig/pull/1842) RandomX: AES improvements, a bit faster hardware AES code when compiled with MSVC.
|
||||||
|
- [#1843](https://github.com/xmrig/xmrig/pull/1843) RandomX: improved performance of GCC compiled binaries.
|
||||||
|
|
||||||
|
# v6.3.3
|
||||||
|
- [#1817](https://github.com/xmrig/xmrig/pull/1817) Fixed self-select login sequence.
|
||||||
|
- Added brand new [build from source](https://xmrig.com/docs/miner/build) documentation.
|
||||||
|
- New binary downloads for macOS (`macos-x64`), FreeBSD (`freebsd-static-x64`), Linux (`linux-static-x64`), Ubuntu 18.04 (`bionic-x64`), Ubuntu 20.04 (`focal-x64`).
|
||||||
|
- Generic Linux download `xenial-x64` renamed to `linux-x64`.
|
||||||
|
- Builds without SSL/TLS support are no longer provided.
|
||||||
|
- Improved CUDA loader error reporting and fixed plugin load on Linux.
|
||||||
|
- Fixed build warnings with Clang compiler.
|
||||||
|
- Fixed colors on macOS.
|
||||||
|
|
||||||
|
# v6.3.2
|
||||||
|
- [#1794](https://github.com/xmrig/xmrig/pull/1794) More robust 1 GB pages handling.
|
||||||
|
- Don't allocate 1 GB per thread if 1 GB is the default huge page size.
|
||||||
|
- Try to allocate scratchpad from dataset's 1 GB huge pages, if normal huge pages are not available.
|
||||||
|
- Correctly initialize RandomX cache if 1 GB pages fail to allocate on a first NUMA node.
|
||||||
|
- [#1806](https://github.com/xmrig/xmrig/pull/1806) Fixed macOS battery detection.
|
||||||
|
- [#1809](https://github.com/xmrig/xmrig/issues/1809) Improved auto configuration on ARM CPUs.
|
||||||
|
- Added retrieving ARM CPU names, based on lscpu code and database.
|
||||||
|
|
||||||
|
# v6.3.1
|
||||||
|
- [#1786](https://github.com/xmrig/xmrig/pull/1786) Added `pause-on-battery` option, supported on Windows and Linux.
|
||||||
|
- Added command line options `--randomx-cache-qos` and `--argon2-impl`.
|
||||||
|
|
||||||
|
# v6.3.0
|
||||||
|
- [#1771](https://github.com/xmrig/xmrig/pull/1771) Adopted new SSE2NEON and reduced ARM-specific changes.
|
||||||
|
- [#1774](https://github.com/xmrig/xmrig/pull/1774) RandomX: Added new option `cache_qos` in `randomx` object for cache QoS support.
|
||||||
|
- [#1777](https://github.com/xmrig/xmrig/pull/1777) Added support for upcoming Haven offshore fork.
|
||||||
|
- [#1780](https://github.com/xmrig/xmrig/pull/1780) CryptoNight OpenCL: fix for long input data.
|
||||||
|
|
||||||
|
# v6.2.3
|
||||||
|
- [#1745](https://github.com/xmrig/xmrig/pull/1745) AstroBWT: fixed OpenCL compilation on some systems.
|
||||||
|
- [#1749](https://github.com/xmrig/xmrig/pull/1749) KawPow: optimized CPU share verification.
|
||||||
|
- [#1752](https://github.com/xmrig/xmrig/pull/1752) RandomX: added error message when MSR mod fails.
|
||||||
|
- [#1754](https://github.com/xmrig/xmrig/issues/1754) Fixed GPU health readings for pre Vega GPUs on Linux.
|
||||||
|
- [#1756](https://github.com/xmrig/xmrig/issues/1756) Added results and connection reports.
|
||||||
|
- [#1759](https://github.com/xmrig/xmrig/pull/1759) KawPow: fixed DAG initialization on slower AMD GPUs.
|
||||||
|
- [#1763](https://github.com/xmrig/xmrig/pull/1763) KawPow: fixed rare duplicate share errors.
|
||||||
|
- [#1766](https://github.com/xmrig/xmrig/pull/1766) RandomX: small speedup on Ryzen CPUs.
|
||||||
|
|
||||||
|
# v6.2.2
|
||||||
|
- [#1742](https://github.com/xmrig/xmrig/issues/1742) Fixed crash when use HTTP API.
|
||||||
|
|
||||||
|
# v6.2.1
|
||||||
|
- [#1726](https://github.com/xmrig/xmrig/issues/1726) Fixed detection of AVX2/AVX512.
|
||||||
|
- [#1728](https://github.com/xmrig/xmrig/issues/1728) Fixed, 32 bit Windows builds was crash on start.
|
||||||
|
- [#1729](https://github.com/xmrig/xmrig/pull/1729) Fixed KawPow crash on old CPUs.
|
||||||
|
- [#1730](https://github.com/xmrig/xmrig/pull/1730) Improved displaying information for compute errors on GPUs.
|
||||||
|
- [#1732](https://github.com/xmrig/xmrig/pull/1732) Fixed NiceHash disconnects for KawPow.
|
||||||
|
- Fixed AMD GPU health (temperatures/power/clocks/fans) readings on Linux.
|
||||||
|
|
||||||
|
# v6.2.0-beta
|
||||||
|
- [#1717](https://github.com/xmrig/xmrig/pull/1717) Added new algorithm `cn/ccx` for Conceal.
|
||||||
|
- [#1718](https://github.com/xmrig/xmrig/pull/1718) Fixed, linker on Linux was marking entire executable as having an executable stack.
|
||||||
|
- [#1720](https://github.com/xmrig/xmrig/pull/1720) Fixed broken CryptoNight algorithms family with gcc 10.1.
|
||||||
|
|
||||||
|
# v6.0.1-beta
|
||||||
|
- [#1708](https://github.com/xmrig/xmrig/issues/1708) Added `title` option.
|
||||||
|
- [#1711](https://github.com/xmrig/xmrig/pull/1711) [cuda] Print errors from KawPow DAG initialization.
|
||||||
|
- [#1713](https://github.com/xmrig/xmrig/pull/1713) [cuda] Reduced memory usage for KawPow, minimum CUDA plugin version now is 6.1.0.
|
||||||
|
|
||||||
|
# v6.0.0-beta
|
||||||
|
- [#1694](https://github.com/xmrig/xmrig/pull/1694) Added support for KawPow algorithm (Ravencoin) on AMD/NVIDIA.
|
||||||
|
- Removed previously deprecated `cn/gpu` algorithm.
|
||||||
|
- Default donation level reduced to 1% but you still can increase it if you like.
|
||||||
|
|
||||||
|
# v5.11.3
|
||||||
|
- [#1718](https://github.com/xmrig/xmrig/pull/1718) Fixed, linker on Linux was marking entire executable as having an executable stack.
|
||||||
|
- [#1720](https://github.com/xmrig/xmrig/pull/1720) Fixed broken CryptoNight algorithms family with gcc 10.1.
|
||||||
|
|
||||||
|
# v5.11.2
|
||||||
|
- [#1664](https://github.com/xmrig/xmrig/pull/1664) Improved JSON config error reporting.
|
||||||
|
- [#1668](https://github.com/xmrig/xmrig/pull/1668) Optimized RandomX dataset initialization.
|
||||||
|
- [#1675](https://github.com/xmrig/xmrig/pull/1675) Fixed cross-compiling on Linux.
|
||||||
|
- Fixed memory leak in HTTP client.
|
||||||
|
- Build [dependencies](https://github.com/xmrig/xmrig-deps/releases/tag/v4.1) updated to recent versions.
|
||||||
|
- Compiler for Windows gcc builds updated to v10.1.
|
||||||
|
|
||||||
|
# v5.11.1
|
||||||
|
- [#1652](https://github.com/xmrig/xmrig/pull/1652) Up to 1% RandomX perfomance improvement on recent AMD CPUs.
|
||||||
|
- [#1306](https://github.com/xmrig/xmrig/issues/1306) Fixed possible double connection to a pool.
|
||||||
|
- [#1654](https://github.com/xmrig/xmrig/issues/1654) Fixed build with LibreSSL.
|
||||||
|
|
||||||
|
# v5.11.0
|
||||||
|
- **[#1632](https://github.com/xmrig/xmrig/pull/1632) Added AstroBWT CUDA support ([CUDA plugin](https://github.com/xmrig/xmrig-cuda) v3.0.0 or newer required).**
|
||||||
|
- [#1605](https://github.com/xmrig/xmrig/pull/1605) Fixed AstroBWT OpenCL for NVIDIA GPUs.
|
||||||
|
- [#1635](https://github.com/xmrig/xmrig/pull/1635) Added pooled memory allocation of RandomX VMs (+0.5% speedup on Zen2).
|
||||||
|
- [#1641](https://github.com/xmrig/xmrig/pull/1641) RandomX JIT refactoring, smaller memory footprint and a bit faster overall.
|
||||||
|
- [#1643](https://github.com/xmrig/xmrig/issues/1643) Fixed build on CentOS 7.
|
||||||
|
|
||||||
|
# v5.10.0
|
||||||
|
- [#1602](https://github.com/xmrig/xmrig/pull/1602) Added AMD GPUs support for AstroBWT algorithm.
|
||||||
|
- [#1590](https://github.com/xmrig/xmrig/pull/1590) MSR mod automatically deactivated after switching from RandomX algorithms.
|
||||||
|
- [#1592](https://github.com/xmrig/xmrig/pull/1592) Added AVX2 optimized code for AstroBWT algorithm.
|
||||||
|
- Added new config option `astrobwt-avx2` in `cpu` object and command line option `--astrobwt-avx2`.
|
||||||
|
- [#1596](https://github.com/xmrig/xmrig/issues/1596) Major TLS (Transport Layer Security) subsystem update.
|
||||||
|
- Added new TLS options, please check [xmrig-proxy documentation](https://xmrig.com/docs/proxy/tls) for details.
|
||||||
|
- `cn/gpu` algorithm now disabled by default and will be removed in next major (v6.x.x) release, no ETA for it right now.
|
||||||
|
- Added command line option `--data-dir`.
|
||||||
|
|
||||||
|
# v5.9.0
|
||||||
|
- [#1578](https://github.com/xmrig/xmrig/pull/1578) Added new RandomKEVA algorithm for upcoming Kevacoin fork, as `"algo": "rx/keva"` or `"coin": "keva"`.
|
||||||
|
- [#1584](https://github.com/xmrig/xmrig/pull/1584) Fixed invalid AstroBWT hashes after algorithm switching.
|
||||||
|
- [#1585](https://github.com/xmrig/xmrig/issues/1585) Fixed build without HTTP support.
|
||||||
|
- Added command line option `--astrobwt-max-size`.
|
||||||
|
|
||||||
|
# v5.8.2
|
||||||
|
- [#1580](https://github.com/xmrig/xmrig/pull/1580) AstroBWT algorithm 20-50% speedup.
|
||||||
|
- Added new option `astrobwt-max-size`.
|
||||||
|
- [#1581](https://github.com/xmrig/xmrig/issues/1581) Fixed macOS build.
|
||||||
|
|
||||||
# v5.8.1
|
# v5.8.1
|
||||||
- [#1575](https://github.com/xmrig/xmrig/pull/1575) Fixed new block detection for DERO solo mining.
|
- [#1575](https://github.com/xmrig/xmrig/pull/1575) Fixed new block detection for DERO solo mining.
|
||||||
|
|
||||||
|
|||||||
@@ -6,10 +6,10 @@ option(WITH_HWLOC "Enable hwloc support" ON)
|
|||||||
option(WITH_CN_LITE "Enable CryptoNight-Lite algorithms family" ON)
|
option(WITH_CN_LITE "Enable CryptoNight-Lite algorithms family" ON)
|
||||||
option(WITH_CN_HEAVY "Enable CryptoNight-Heavy algorithms family" ON)
|
option(WITH_CN_HEAVY "Enable CryptoNight-Heavy algorithms family" ON)
|
||||||
option(WITH_CN_PICO "Enable CryptoNight-Pico algorithm" ON)
|
option(WITH_CN_PICO "Enable CryptoNight-Pico algorithm" ON)
|
||||||
option(WITH_CN_GPU "Enable CryptoNight-GPU algorithm" ON)
|
|
||||||
option(WITH_RANDOMX "Enable RandomX algorithms family" ON)
|
option(WITH_RANDOMX "Enable RandomX algorithms family" ON)
|
||||||
option(WITH_ARGON2 "Enable Argon2 algorithms family" ON)
|
option(WITH_ARGON2 "Enable Argon2 algorithms family" ON)
|
||||||
option(WITH_ASTROBWT "Enable AstroBWT algorithms family" ON)
|
option(WITH_ASTROBWT "Enable AstroBWT algorithms family" ON)
|
||||||
|
option(WITH_KAWPOW "Enable KawPow algorithms family" ON)
|
||||||
option(WITH_HTTP "Enable HTTP protocol support (client/server)" ON)
|
option(WITH_HTTP "Enable HTTP protocol support (client/server)" ON)
|
||||||
option(WITH_DEBUG_LOG "Enable debug log output" OFF)
|
option(WITH_DEBUG_LOG "Enable debug log output" OFF)
|
||||||
option(WITH_TLS "Enable OpenSSL support" ON)
|
option(WITH_TLS "Enable OpenSSL support" ON)
|
||||||
@@ -23,6 +23,9 @@ option(WITH_NVML "Enable NVML (NVIDIA Management Library) support (on
|
|||||||
option(WITH_ADL "Enable ADL (AMD Display Library) or sysfs support (only if OpenCL backend enabled)" ON)
|
option(WITH_ADL "Enable ADL (AMD Display Library) or sysfs support (only if OpenCL backend enabled)" ON)
|
||||||
option(WITH_STRICT_CACHE "Enable strict checks for OpenCL cache" ON)
|
option(WITH_STRICT_CACHE "Enable strict checks for OpenCL cache" ON)
|
||||||
option(WITH_INTERLEAVE_DEBUG_LOG "Enable debug log for threads interleave" OFF)
|
option(WITH_INTERLEAVE_DEBUG_LOG "Enable debug log for threads interleave" OFF)
|
||||||
|
option(WITH_PROFILING "Enable profiling for developers" OFF)
|
||||||
|
option(WITH_SSE4_1 "Enable SSE 4.1 for Blake2" ON)
|
||||||
|
option(WITH_BENCHMARK "Enable builtin RandomX benchmark and stress test" ON)
|
||||||
|
|
||||||
option(BUILD_STATIC "Build static binary" OFF)
|
option(BUILD_STATIC "Build static binary" OFF)
|
||||||
option(ARM_TARGET "Force use specific ARM target 8 or 7" 0)
|
option(ARM_TARGET "Force use specific ARM target 8 or 7" 0)
|
||||||
@@ -77,10 +80,7 @@ set(HEADERS_CRYPTO
|
|||||||
src/crypto/cn/hash.h
|
src/crypto/cn/hash.h
|
||||||
src/crypto/cn/skein_port.h
|
src/crypto/cn/skein_port.h
|
||||||
src/crypto/cn/soft_aes.h
|
src/crypto/cn/soft_aes.h
|
||||||
src/crypto/common/Algorithm.h
|
|
||||||
src/crypto/common/Coin.h
|
|
||||||
src/crypto/common/HugePagesInfo.h
|
src/crypto/common/HugePagesInfo.h
|
||||||
src/crypto/common/keccak.h
|
|
||||||
src/crypto/common/MemoryPool.h
|
src/crypto/common/MemoryPool.h
|
||||||
src/crypto/common/Nonce.h
|
src/crypto/common/Nonce.h
|
||||||
src/crypto/common/portable/mm_malloc.h
|
src/crypto/common/portable/mm_malloc.h
|
||||||
@@ -116,10 +116,7 @@ set(SOURCES_CRYPTO
|
|||||||
src/crypto/cn/c_skein.c
|
src/crypto/cn/c_skein.c
|
||||||
src/crypto/cn/CnCtx.cpp
|
src/crypto/cn/CnCtx.cpp
|
||||||
src/crypto/cn/CnHash.cpp
|
src/crypto/cn/CnHash.cpp
|
||||||
src/crypto/common/Algorithm.cpp
|
|
||||||
src/crypto/common/Coin.cpp
|
|
||||||
src/crypto/common/HugePagesInfo.cpp
|
src/crypto/common/HugePagesInfo.cpp
|
||||||
src/crypto/common/keccak.cpp
|
|
||||||
src/crypto/common/MemoryPool.cpp
|
src/crypto/common/MemoryPool.cpp
|
||||||
src/crypto/common/Nonce.cpp
|
src/crypto/common/Nonce.cpp
|
||||||
src/crypto/common/VirtualMemory.cpp
|
src/crypto/common/VirtualMemory.cpp
|
||||||
@@ -149,6 +146,8 @@ elseif (XMRIG_OS_APPLE)
|
|||||||
src/App_unix.cpp
|
src/App_unix.cpp
|
||||||
src/crypto/common/VirtualMemory_unix.cpp
|
src/crypto/common/VirtualMemory_unix.cpp
|
||||||
)
|
)
|
||||||
|
find_library(IOKIT_LIBRARY IOKit)
|
||||||
|
set(EXTRA_LIBS ${IOKIT_LIBRARY})
|
||||||
else()
|
else()
|
||||||
list(APPEND SOURCES_OS
|
list(APPEND SOURCES_OS
|
||||||
src/App_unix.cpp
|
src/App_unix.cpp
|
||||||
@@ -169,8 +168,8 @@ else()
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_definitions(/D__STDC_FORMAT_MACROS)
|
add_definitions(-DXMRIG_MINER_PROJECT)
|
||||||
add_definitions(/DUNICODE)
|
add_definitions(-D__STDC_FORMAT_MACROS -DUNICODE)
|
||||||
|
|
||||||
find_package(UV REQUIRED)
|
find_package(UV REQUIRED)
|
||||||
|
|
||||||
@@ -178,9 +177,9 @@ include(cmake/flags.cmake)
|
|||||||
include(cmake/randomx.cmake)
|
include(cmake/randomx.cmake)
|
||||||
include(cmake/argon2.cmake)
|
include(cmake/argon2.cmake)
|
||||||
include(cmake/astrobwt.cmake)
|
include(cmake/astrobwt.cmake)
|
||||||
|
include(cmake/kawpow.cmake)
|
||||||
include(cmake/OpenSSL.cmake)
|
include(cmake/OpenSSL.cmake)
|
||||||
include(cmake/asm.cmake)
|
include(cmake/asm.cmake)
|
||||||
include(cmake/cn-gpu.cmake)
|
|
||||||
|
|
||||||
if (WITH_CN_LITE)
|
if (WITH_CN_LITE)
|
||||||
add_definitions(/DXMRIG_ALGO_CN_LITE)
|
add_definitions(/DXMRIG_ALGO_CN_LITE)
|
||||||
@@ -202,18 +201,18 @@ include_directories(src)
|
|||||||
include_directories(src/3rdparty)
|
include_directories(src/3rdparty)
|
||||||
include_directories(${UV_INCLUDE_DIR})
|
include_directories(${UV_INCLUDE_DIR})
|
||||||
|
|
||||||
if (BUILD_STATIC)
|
|
||||||
set(CMAKE_EXE_LINKER_FLAGS " -static")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (WITH_DEBUG_LOG)
|
if (WITH_DEBUG_LOG)
|
||||||
add_definitions(/DAPP_DEBUG)
|
add_definitions(/DAPP_DEBUG)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_executable(${CMAKE_PROJECT_NAME} ${HEADERS} ${SOURCES} ${SOURCES_OS} ${SOURCES_CPUID} ${HEADERS_CRYPTO} ${SOURCES_CRYPTO} ${SOURCES_SYSLOG} ${TLS_SOURCES} ${XMRIG_ASM_SOURCES} ${CN_GPU_SOURCES})
|
add_executable(${CMAKE_PROJECT_NAME} ${HEADERS} ${SOURCES} ${SOURCES_OS} ${SOURCES_CPUID} ${HEADERS_CRYPTO} ${SOURCES_CRYPTO} ${SOURCES_SYSLOG} ${TLS_SOURCES} ${XMRIG_ASM_SOURCES})
|
||||||
target_link_libraries(${CMAKE_PROJECT_NAME} ${XMRIG_ASM_LIBRARY} ${OPENSSL_LIBRARIES} ${UV_LIBRARIES} ${EXTRA_LIBS} ${CPUID_LIB} ${ARGON2_LIBRARY})
|
target_link_libraries(${CMAKE_PROJECT_NAME} ${XMRIG_ASM_LIBRARY} ${OPENSSL_LIBRARIES} ${UV_LIBRARIES} ${EXTRA_LIBS} ${CPUID_LIB} ${ARGON2_LIBRARY} ${ETHASH_LIBRARY})
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD
|
add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/bin/WinRing0/WinRing0x64.sys" $<TARGET_FILE_DIR:${CMAKE_PROJECT_NAME}>)
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/bin/WinRing0/WinRing0x64.sys" $<TARGET_FILE_DIR:${CMAKE_PROJECT_NAME}>)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (CMAKE_CXX_COMPILER_ID MATCHES Clang AND CMAKE_BUILD_TYPE STREQUAL Release)
|
||||||
|
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_STRIP} ${CMAKE_PROJECT_NAME})
|
||||||
|
endif()
|
||||||
|
|||||||
110
README.md
110
README.md
@@ -1,120 +1,36 @@
|
|||||||
# XMRig
|
# XMRig
|
||||||
|
|
||||||
**:warning: [Monero changed PoW algorithm to RandomX on November 30.](https://github.com/xmrig/xmrig/issues/1204)**
|
|
||||||
|
|
||||||
[](https://github.com/xmrig/xmrig/releases)
|
[](https://github.com/xmrig/xmrig/releases)
|
||||||
[](https://github.com/xmrig/xmrig/releases)
|
[](https://github.com/xmrig/xmrig/releases)
|
||||||
[](https://github.com/xmrig/xmrig/releases)
|
[](https://github.com/xmrig/xmrig/releases)
|
||||||
[](https://github.com/xmrig/xmrig/blob/master/LICENSE)
|
[](https://github.com/xmrig/xmrig/blob/master/LICENSE)
|
||||||
[](https://github.com/xmrig/xmrig/stargazers)
|
[](https://github.com/xmrig/xmrig/stargazers)
|
||||||
[](https://github.com/xmrig/xmrig/network)
|
[](https://github.com/xmrig/xmrig/network)
|
||||||
|
|
||||||
XMRig High performance, open source, cross platform RandomX, CryptoNight and Argon2 CPU/GPU miner, with official support for Windows.
|
XMRig is a high performance, open source, cross platform RandomX, KawPow, CryptoNight and AstroBWT unified CPU/GPU miner. Official binaries are available for Windows, Linux, macOS and FreeBSD.
|
||||||
|
|
||||||
## Mining backends
|
## Mining backends
|
||||||
- **CPU** (x64/x86/ARM)
|
- **CPU** (x64/ARMv8)
|
||||||
- **OpenCL** for AMD GPUs.
|
- **OpenCL** for AMD GPUs.
|
||||||
- **CUDA** for NVIDIA GPUs via external [CUDA plugin](https://github.com/xmrig/xmrig-cuda).
|
- **CUDA** for NVIDIA GPUs via external [CUDA plugin](https://github.com/xmrig/xmrig-cuda).
|
||||||
|
|
||||||
<img src="doc/screenshot_v5_2_0.png" width="833" >
|
|
||||||
|
|
||||||
## Download
|
## Download
|
||||||
* Binary releases: https://github.com/xmrig/xmrig/releases
|
* **[Binary releases](https://github.com/xmrig/xmrig/releases)**
|
||||||
* Git tree: https://github.com/xmrig/xmrig.git
|
* **[Build from source](https://xmrig.com/docs/miner/build)**
|
||||||
* Clone with `git clone https://github.com/xmrig/xmrig.git` :hammer: [Build instructions](https://github.com/xmrig/xmrig/wiki/Build).
|
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
The preferred way to configure the miner is the [JSON config file](src/config.json) as it is more flexible and human friendly. The command line interface does not cover all features, such as mining profiles for different algorithms. Important options can be changed during runtime without miner restart by editing the config file or executing API calls.
|
The preferred way to configure the miner is the [JSON config file](src/config.json) as it is more flexible and human friendly. The [command line interface](https://xmrig.com/docs/miner/command-line-options) does not cover all features, such as mining profiles for different algorithms. Important options can be changed during runtime without miner restart by editing the config file or executing API calls.
|
||||||
|
|
||||||
* **[xmrig.com/wizard](https://xmrig.com/wizard)** helps you create initial configuration for the miner.
|
* **[Wizard](https://xmrig.com/wizard)** helps you create initial configuration for the miner.
|
||||||
* **[workers.xmrig.info](http://workers.xmrig.info)** helps manage your miners via HTTP API.
|
* **[Workers](http://workers.xmrig.info)** helps manage your miners via HTTP API.
|
||||||
|
|
||||||
### Command line options
|
|
||||||
```
|
|
||||||
Network:
|
|
||||||
-o, --url=URL URL of mining server
|
|
||||||
-a, --algo=ALGO mining algorithm https://xmrig.com/docs/algorithms
|
|
||||||
--coin=COIN specify coin instead of algorithm
|
|
||||||
-u, --user=USERNAME username for mining server
|
|
||||||
-p, --pass=PASSWORD password for mining server
|
|
||||||
-O, --userpass=U:P username:password pair for mining server
|
|
||||||
-x, --proxy=HOST:PORT connect through a SOCKS5 proxy
|
|
||||||
-k, --keepalive send keepalive packet for prevent timeout (needs pool support)
|
|
||||||
--nicehash enable nicehash.com support
|
|
||||||
--rig-id=ID rig identifier for pool-side statistics (needs pool support)
|
|
||||||
--tls enable SSL/TLS support (needs pool support)
|
|
||||||
--tls-fingerprint=HEX pool TLS certificate fingerprint for strict certificate pinning
|
|
||||||
--daemon use daemon RPC instead of pool for solo mining
|
|
||||||
--daemon-poll-interval=N daemon poll interval in milliseconds (default: 1000)
|
|
||||||
-r, --retries=N number of times to retry before switch to backup server (default: 5)
|
|
||||||
-R, --retry-pause=N time to pause between retries (default: 5)
|
|
||||||
--user-agent set custom user-agent string for pool
|
|
||||||
--donate-level=N donate level, default 5%% (5 minutes in 100 minutes)
|
|
||||||
--donate-over-proxy=N control donate over xmrig-proxy feature
|
|
||||||
|
|
||||||
CPU backend:
|
|
||||||
--no-cpu disable CPU mining backend
|
|
||||||
-t, --threads=N number of CPU threads
|
|
||||||
-v, --av=N algorithm variation, 0 auto select
|
|
||||||
--cpu-affinity set process affinity to CPU core(s), mask 0x3 for cores 0 and 1
|
|
||||||
--cpu-priority set process priority (0 idle, 2 normal to 5 highest)
|
|
||||||
--cpu-max-threads-hint=N maximum CPU threads count (in percentage) hint for autoconfig
|
|
||||||
--cpu-memory-pool=N number of 2 MB pages for persistent memory pool, -1 (auto), 0 (disable)
|
|
||||||
--cpu-no-yield prefer maximum hashrate rather than system response/stability
|
|
||||||
--no-huge-pages disable huge pages support
|
|
||||||
--asm=ASM ASM optimizations, possible values: auto, none, intel, ryzen, bulldozer
|
|
||||||
--randomx-init=N thread count to initialize RandomX dataset
|
|
||||||
--randomx-no-numa disable NUMA support for RandomX
|
|
||||||
--randomx-mode=MODE RandomX mode: auto, fast, light
|
|
||||||
--randomx-1gb-pages use 1GB hugepages for dataset (Linux only)
|
|
||||||
--randomx-wrmsr=N write custom value (0-15) to Intel MSR register 0x1a4 or disable MSR mod (-1)
|
|
||||||
--randomx-no-rdmsr disable reverting initial MSR values on exit
|
|
||||||
|
|
||||||
API:
|
|
||||||
--api-worker-id=ID custom worker-id for API
|
|
||||||
--api-id=ID custom instance ID for API
|
|
||||||
--http-host=HOST bind host for HTTP API (default: 127.0.0.1)
|
|
||||||
--http-port=N bind port for HTTP API
|
|
||||||
--http-access-token=T access token for HTTP API
|
|
||||||
--http-no-restricted enable full remote access to HTTP API (only if access token set)
|
|
||||||
|
|
||||||
OpenCL backend:
|
|
||||||
--opencl enable OpenCL mining backend
|
|
||||||
--opencl-devices=N comma separated list of OpenCL devices to use
|
|
||||||
--opencl-platform=N OpenCL platform index or name
|
|
||||||
--opencl-loader=PATH path to OpenCL-ICD-Loader (OpenCL.dll or libOpenCL.so)
|
|
||||||
--opencl-no-cache disable OpenCL cache
|
|
||||||
--print-platforms print available OpenCL platforms and exit
|
|
||||||
|
|
||||||
CUDA backend:
|
|
||||||
--cuda enable CUDA mining backend
|
|
||||||
--cuda-loader=PATH path to CUDA plugin (xmrig-cuda.dll or libxmrig-cuda.so)
|
|
||||||
--cuda-devices=N comma separated list of CUDA devices to use
|
|
||||||
--cuda-bfactor-hint=N bfactor hint for autoconfig (0-12)
|
|
||||||
--cuda-bsleep-hint=N bsleep hint for autoconfig
|
|
||||||
--no-nvml disable NVML (NVIDIA Management Library) support
|
|
||||||
|
|
||||||
Logging:
|
|
||||||
-S, --syslog use system log for output messages
|
|
||||||
-l, --log-file=FILE log all output to a file
|
|
||||||
--print-time=N print hashrate report every N seconds
|
|
||||||
--health-print-time=N print health report every N seconds
|
|
||||||
--no-color disable colored output
|
|
||||||
--verbose verbose output
|
|
||||||
|
|
||||||
Misc:
|
|
||||||
-c, --config=FILE load a JSON-format configuration file
|
|
||||||
-B, --background run the miner in the background
|
|
||||||
-V, --version output version information and exit
|
|
||||||
-h, --help display this help and exit
|
|
||||||
--dry-run test configuration and exit
|
|
||||||
--export-topology export hwloc topology to a XML file and exit
|
|
||||||
```
|
|
||||||
|
|
||||||
## Donations
|
## Donations
|
||||||
* Default donation 5% (5 minutes in 100 minutes) can be reduced to 1% via option `donate-level` or disabled in source code.
|
* Default donation 1% (1 minute in 100 minutes) can be increased via option `donate-level` or disabled in source code.
|
||||||
* XMR: `48edfHu7V9Z84YzzMa6fUueoELZ9ZRXq9VetWzYGzKt52XU5xvqgzYnDK9URnRoJMk1j8nLwEVsaSWJ4fhdUyZijBGUicoD`
|
* XMR: `48edfHu7V9Z84YzzMa6fUueoELZ9ZRXq9VetWzYGzKt52XU5xvqgzYnDK9URnRoJMk1j8nLwEVsaSWJ4fhdUyZijBGUicoD`
|
||||||
* BTC: `1P7ujsXeX7GxQwHNnJsRMgAdNkFZmNVqJT`
|
|
||||||
|
## Developers
|
||||||
|
* **[xmrig](https://github.com/xmrig)**
|
||||||
|
* **[sech1](https://github.com/SChernykh)**
|
||||||
|
|
||||||
## Contacts
|
## Contacts
|
||||||
* support@xmrig.com
|
* support@xmrig.com
|
||||||
|
|||||||
@@ -5,19 +5,43 @@ if (WITH_TLS)
|
|||||||
set(OPENSSL_USE_STATIC_LIBS TRUE)
|
set(OPENSSL_USE_STATIC_LIBS TRUE)
|
||||||
set(OPENSSL_MSVC_STATIC_RT TRUE)
|
set(OPENSSL_MSVC_STATIC_RT TRUE)
|
||||||
|
|
||||||
set(EXTRA_LIBS ${EXTRA_LIBS} Crypt32)
|
set(EXTRA_LIBS ${EXTRA_LIBS} crypt32)
|
||||||
elseif (APPLE)
|
elseif (APPLE)
|
||||||
set(OPENSSL_USE_STATIC_LIBS TRUE)
|
set(OPENSSL_USE_STATIC_LIBS TRUE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (BUILD_STATIC)
|
||||||
|
set(OPENSSL_USE_STATIC_LIBS TRUE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
find_package(OpenSSL)
|
find_package(OpenSSL)
|
||||||
|
|
||||||
if (OPENSSL_FOUND)
|
if (OPENSSL_FOUND)
|
||||||
set(TLS_SOURCES src/base/net/stratum/Tls.h src/base/net/stratum/Tls.cpp)
|
set(TLS_SOURCES
|
||||||
|
src/base/net/stratum/Tls.cpp
|
||||||
|
src/base/net/stratum/Tls.h
|
||||||
|
src/base/net/tls/ServerTls.cpp
|
||||||
|
src/base/net/tls/ServerTls.h
|
||||||
|
src/base/net/tls/TlsConfig.cpp
|
||||||
|
src/base/net/tls/TlsConfig.h
|
||||||
|
src/base/net/tls/TlsContext.cpp
|
||||||
|
src/base/net/tls/TlsContext.h
|
||||||
|
src/base/net/tls/TlsGen.cpp
|
||||||
|
src/base/net/tls/TlsGen.h
|
||||||
|
)
|
||||||
|
|
||||||
include_directories(${OPENSSL_INCLUDE_DIR})
|
include_directories(${OPENSSL_INCLUDE_DIR})
|
||||||
|
|
||||||
if (WITH_HTTP)
|
if (WITH_HTTP)
|
||||||
set(TLS_SOURCES ${TLS_SOURCES} src/base/net/http/HttpsClient.h src/base/net/http/HttpsClient.cpp)
|
set(TLS_SOURCES ${TLS_SOURCES}
|
||||||
|
src/base/net/https/HttpsClient.cpp
|
||||||
|
src/base/net/https/HttpsClient.h
|
||||||
|
src/base/net/https/HttpsContext.cpp
|
||||||
|
src/base/net/https/HttpsContext.h
|
||||||
|
src/base/net/https/HttpsServer.cpp
|
||||||
|
src/base/net/https/HttpsServer.h
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
message(FATAL_ERROR "OpenSSL NOT found: use `-DWITH_TLS=OFF` to build without TLS support")
|
message(FATAL_ERROR "OpenSSL NOT found: use `-DWITH_TLS=OFF` to build without TLS support")
|
||||||
@@ -29,5 +53,12 @@ else()
|
|||||||
set(OPENSSL_LIBRARIES "")
|
set(OPENSSL_LIBRARIES "")
|
||||||
remove_definitions(/DXMRIG_FEATURE_TLS)
|
remove_definitions(/DXMRIG_FEATURE_TLS)
|
||||||
|
|
||||||
|
if (WITH_HTTP)
|
||||||
|
set(TLS_SOURCES ${TLS_SOURCES}
|
||||||
|
src/base/net/http/HttpServer.cpp
|
||||||
|
src/base/net/http/HttpServer.h
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
set(CMAKE_PROJECT_NAME "${CMAKE_PROJECT_NAME}-notls")
|
set(CMAKE_PROJECT_NAME "${CMAKE_PROJECT_NAME}-notls")
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -3,12 +3,10 @@ if (WITH_ASTROBWT)
|
|||||||
|
|
||||||
list(APPEND HEADERS_CRYPTO
|
list(APPEND HEADERS_CRYPTO
|
||||||
src/crypto/astrobwt/AstroBWT.h
|
src/crypto/astrobwt/AstroBWT.h
|
||||||
src/crypto/astrobwt/sha3.h
|
|
||||||
)
|
)
|
||||||
|
|
||||||
list(APPEND SOURCES_CRYPTO
|
list(APPEND SOURCES_CRYPTO
|
||||||
src/crypto/astrobwt/AstroBWT.cpp
|
src/crypto/astrobwt/AstroBWT.cpp
|
||||||
src/crypto/astrobwt/sha3.cpp
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if (XMRIG_ARM)
|
if (XMRIG_ARM)
|
||||||
@@ -23,6 +21,17 @@ if (WITH_ASTROBWT)
|
|||||||
src/crypto/astrobwt/salsa20_ref/salsa20.c
|
src/crypto/astrobwt/salsa20_ref/salsa20.c
|
||||||
)
|
)
|
||||||
else()
|
else()
|
||||||
|
if (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
|
add_definitions(/DASTROBWT_AVX2)
|
||||||
|
if (CMAKE_C_COMPILER_ID MATCHES MSVC)
|
||||||
|
enable_language(ASM_MASM)
|
||||||
|
list(APPEND SOURCES_CRYPTO src/crypto/astrobwt/sha3_256_avx2.asm)
|
||||||
|
else()
|
||||||
|
enable_language(ASM)
|
||||||
|
list(APPEND SOURCES_CRYPTO src/crypto/astrobwt/sha3_256_avx2.S)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
list(APPEND HEADERS_CRYPTO
|
list(APPEND HEADERS_CRYPTO
|
||||||
src/crypto/astrobwt/Salsa20.hpp
|
src/crypto/astrobwt/Salsa20.hpp
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
if (WITH_CN_GPU AND CMAKE_SIZEOF_VOID_P EQUAL 8)
|
|
||||||
|
|
||||||
if (XMRIG_ARM)
|
|
||||||
set(CN_GPU_SOURCES src/crypto/cn/gpu/cn_gpu_arm.cpp)
|
|
||||||
|
|
||||||
if (CMAKE_CXX_COMPILER_ID MATCHES GNU OR CMAKE_CXX_COMPILER_ID MATCHES Clang)
|
|
||||||
set_source_files_properties(src/crypto/cn/gpu/cn_gpu_arm.cpp PROPERTIES COMPILE_FLAGS "-O3")
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
set(CN_GPU_SOURCES src/crypto/cn/gpu/cn_gpu_avx.cpp src/crypto/cn/gpu/cn_gpu_ssse3.cpp)
|
|
||||||
|
|
||||||
if (CMAKE_CXX_COMPILER_ID MATCHES GNU OR CMAKE_CXX_COMPILER_ID MATCHES Clang)
|
|
||||||
set_source_files_properties(src/crypto/cn/gpu/cn_gpu_avx.cpp PROPERTIES COMPILE_FLAGS "-O3 -mavx2")
|
|
||||||
set_source_files_properties(src/crypto/cn/gpu/cn_gpu_ssse3.cpp PROPERTIES COMPILE_FLAGS "-O3")
|
|
||||||
elseif (CMAKE_CXX_COMPILER_ID MATCHES MSVC)
|
|
||||||
set_source_files_properties(src/crypto/cn/gpu/cn_gpu_avx.cpp PROPERTIES COMPILE_FLAGS "/arch:AVX")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_definitions(/DXMRIG_ALGO_CN_GPU)
|
|
||||||
else()
|
|
||||||
set(CN_GPU_SOURCES "")
|
|
||||||
|
|
||||||
remove_definitions(/DXMRIG_ALGO_CN_GPU)
|
|
||||||
endif()
|
|
||||||
@@ -2,9 +2,10 @@ if (NOT CMAKE_SYSTEM_PROCESSOR)
|
|||||||
message(WARNING "CMAKE_SYSTEM_PROCESSOR not defined")
|
message(WARNING "CMAKE_SYSTEM_PROCESSOR not defined")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86_64|AMD64)$" AND CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
if (CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86_64|AMD64)$")
|
|
||||||
add_definitions(/DRAPIDJSON_SSE2)
|
add_definitions(/DRAPIDJSON_SSE2)
|
||||||
|
else()
|
||||||
|
set(WITH_SSE4_1 OFF)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT ARM_TARGET)
|
if (NOT ARM_TARGET)
|
||||||
@@ -41,3 +42,7 @@ if (ARM_TARGET AND ARM_TARGET GREATER 6)
|
|||||||
add_definitions(/DXMRIG_ARMv7)
|
add_definitions(/DXMRIG_ARMv7)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (WITH_SSE4_1)
|
||||||
|
add_definitions(/DXMRIG_FEATURE_SSE4_1)
|
||||||
|
endif()
|
||||||
|
|||||||
@@ -45,6 +45,10 @@ if (CMAKE_CXX_COMPILER_ID MATCHES GNU)
|
|||||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++")
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (BUILD_STATIC)
|
||||||
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
|
||||||
|
endif()
|
||||||
|
|
||||||
add_definitions(/D_GNU_SOURCE)
|
add_definitions(/D_GNU_SOURCE)
|
||||||
|
|
||||||
if (${CMAKE_VERSION} VERSION_LESS "3.1.0")
|
if (${CMAKE_VERSION} VERSION_LESS "3.1.0")
|
||||||
@@ -60,6 +64,9 @@ elseif (CMAKE_CXX_COMPILER_ID MATCHES MSVC)
|
|||||||
set(CMAKE_C_FLAGS_RELEASE "/MT /O2 /Oi /DNDEBUG /GL")
|
set(CMAKE_C_FLAGS_RELEASE "/MT /O2 /Oi /DNDEBUG /GL")
|
||||||
set(CMAKE_CXX_FLAGS_RELEASE "/MT /O2 /Oi /DNDEBUG /GL")
|
set(CMAKE_CXX_FLAGS_RELEASE "/MT /O2 /Oi /DNDEBUG /GL")
|
||||||
|
|
||||||
|
set(CMAKE_C_FLAGS_RELWITHDEBINFO "/Ob1 /Zi")
|
||||||
|
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/Ob1 /Zi")
|
||||||
|
|
||||||
add_definitions(/D_CRT_SECURE_NO_WARNINGS)
|
add_definitions(/D_CRT_SECURE_NO_WARNINGS)
|
||||||
add_definitions(/D_CRT_NONSTDC_NO_WARNINGS)
|
add_definitions(/D_CRT_NONSTDC_NO_WARNINGS)
|
||||||
add_definitions(/DNOMINMAX)
|
add_definitions(/DNOMINMAX)
|
||||||
@@ -89,6 +96,10 @@ elseif (CMAKE_CXX_COMPILER_ID MATCHES Clang)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (BUILD_STATIC)
|
||||||
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
|
||||||
|
endif()
|
||||||
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT WIN32)
|
if (NOT WIN32)
|
||||||
|
|||||||
19
cmake/kawpow.cmake
Normal file
19
cmake/kawpow.cmake
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
if (WITH_KAWPOW)
|
||||||
|
add_definitions(/DXMRIG_ALGO_KAWPOW)
|
||||||
|
|
||||||
|
list(APPEND HEADERS_CRYPTO
|
||||||
|
src/crypto/kawpow/KPCache.h
|
||||||
|
src/crypto/kawpow/KPHash.h
|
||||||
|
)
|
||||||
|
|
||||||
|
list(APPEND SOURCES_CRYPTO
|
||||||
|
src/crypto/kawpow/KPCache.cpp
|
||||||
|
src/crypto/kawpow/KPHash.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_subdirectory(src/3rdparty/libethash)
|
||||||
|
set(ETHASH_LIBRARY ethash)
|
||||||
|
else()
|
||||||
|
remove_definitions(/DXMRIG_ALGO_KAWPOW)
|
||||||
|
set(ETHASH_LIBRARY "")
|
||||||
|
endif()
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
if (WITH_RANDOMX)
|
if (WITH_RANDOMX)
|
||||||
add_definitions(/DXMRIG_ALGO_RANDOMX)
|
add_definitions(/DXMRIG_ALGO_RANDOMX)
|
||||||
|
set(WITH_ARGON2 ON)
|
||||||
|
|
||||||
list(APPEND HEADERS_CRYPTO
|
list(APPEND HEADERS_CRYPTO
|
||||||
src/crypto/rx/Rx.h
|
src/crypto/rx/Rx.h
|
||||||
@@ -16,8 +17,6 @@ if (WITH_RANDOMX)
|
|||||||
list(APPEND SOURCES_CRYPTO
|
list(APPEND SOURCES_CRYPTO
|
||||||
src/crypto/randomx/aes_hash.cpp
|
src/crypto/randomx/aes_hash.cpp
|
||||||
src/crypto/randomx/allocator.cpp
|
src/crypto/randomx/allocator.cpp
|
||||||
src/crypto/randomx/argon2_core.c
|
|
||||||
src/crypto/randomx/argon2_ref.c
|
|
||||||
src/crypto/randomx/blake2_generator.cpp
|
src/crypto/randomx/blake2_generator.cpp
|
||||||
src/crypto/randomx/blake2/blake2b.c
|
src/crypto/randomx/blake2/blake2b.c
|
||||||
src/crypto/randomx/bytecode_machine.cpp
|
src/crypto/randomx/bytecode_machine.cpp
|
||||||
@@ -63,6 +62,18 @@ if (WITH_RANDOMX)
|
|||||||
)
|
)
|
||||||
# cheat because cmake and ccache hate each other
|
# cheat because cmake and ccache hate each other
|
||||||
set_property(SOURCE src/crypto/randomx/jit_compiler_a64_static.S PROPERTY LANGUAGE C)
|
set_property(SOURCE src/crypto/randomx/jit_compiler_a64_static.S PROPERTY LANGUAGE C)
|
||||||
|
else()
|
||||||
|
list(APPEND SOURCES_CRYPTO
|
||||||
|
src/crypto/randomx/jit_compiler_fallback.cpp
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (WITH_SSE4_1)
|
||||||
|
list(APPEND SOURCES_CRYPTO src/crypto/randomx/blake2/blake2b_sse41.c)
|
||||||
|
|
||||||
|
if (CMAKE_C_COMPILER_ID MATCHES GNU OR CMAKE_C_COMPILER_ID MATCHES Clang)
|
||||||
|
set_source_files_properties(src/crypto/randomx/blake2/blake2b_sse41.c PROPERTIES COMPILE_FLAGS -msse4.1)
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (CMAKE_CXX_COMPILER_ID MATCHES Clang)
|
if (CMAKE_CXX_COMPILER_ID MATCHES Clang)
|
||||||
|
|||||||
@@ -6,38 +6,40 @@ Algorithm can be defined in 3 ways:
|
|||||||
2. Per pool `coin` option, currently only usable values for this option is `monero` and `arqma`.
|
2. Per pool `coin` option, currently only usable values for this option is `monero` and `arqma`.
|
||||||
3. Per pool `algo` option.
|
3. Per pool `algo` option.
|
||||||
|
|
||||||
Option `coin` useful for pools without algorithm negotiation support or daemon to allow automatically switch algorithm in next hard fork.
|
Option `coin` useful for pools without [algorithm negotiation](https://xmrig.com/docs/extensions/algorithm-negotiation) support or daemon to allow automatically switch algorithm in next hard fork. If you use xmrig-proxy don't need specify algorithm on miner side.
|
||||||
|
|
||||||
## Algorithm names
|
## Algorithm names
|
||||||
|
|
||||||
| Name | Memory | Version | Notes |
|
| Name | Memory | Version | Description | Notes |
|
||||||
|------|--------|---------|-------|
|
|------|--------|---------|-------------|-------|
|
||||||
| `rx/sfx` | 2 MB | 5.4.0+ | RandomSFX (RandomX variant for Safex). |
|
| `kawpow` | - | 6.0.0+ | KawPow (Ravencoin) | GPU only |
|
||||||
| `rx/v` | 2 MB | 5.4.0+ | RandomV (RandomX variant for new MoneroV). |
|
| `rx/keva` | 1 MB | 5.9.0+ | RandomKEVA (RandomX variant for Keva). | |
|
||||||
| `rx/arq` | 256 KB | 4.3.0+ | RandomARQ (RandomX variant for ArQmA). |
|
| `astrobwt` | 20 MB | 5.8.0+ | AstroBWT (Dero). | |
|
||||||
| `rx/0` | 2 MB | 3.2.0+ | RandomX (Monero). |
|
| `cn-pico/tlo` | 256 KB | 5.5.0+ | CryptoNight-Pico (Talleo). | |
|
||||||
| `argon2/chukwa` | 512 KB | 3.1.0+ | Argon2id (Chukwa). |
|
| `rx/sfx` | 2 MB | 5.4.0+ | RandomSFX (RandomX variant for Safex). | |
|
||||||
| `argon2/wrkz` | 256 KB | 3.1.0+ | Argon2id (WRKZ) |
|
| `rx/arq` | 256 KB | 4.3.0+ | RandomARQ (RandomX variant for ArQmA). | |
|
||||||
| `rx/wow` | 1 MB | 3.0.0+ | RandomWOW (RandomX variant for Wownero). |
|
| `rx/0` | 2 MB | 3.2.0+ | RandomX (Monero). | |
|
||||||
| `rx/loki` | 2 MB | 3.0.0+ | RandomXL (RandomX variant for Loki). |
|
| `argon2/chukwa` | 512 KB | 3.1.0+ | Argon2id (Chukwa). | CPU only |
|
||||||
| `cn/fast` | 2 MB | 3.0.0+ | CryptoNight variant 1 with half iterations. |
|
| `argon2/wrkz` | 256 KB | 3.1.0+ | Argon2id (WRKZ) | CPU only |
|
||||||
| `cn/rwz` | 2 MB | 2.14.0+ | CryptoNight variant 2 with 3/4 iterations and reversed shuffle operation. |
|
| `rx/wow` | 1 MB | 3.0.0+ | RandomWOW (RandomX variant for Wownero). | |
|
||||||
| `cn/zls` | 2 MB | 2.14.0+ | CryptoNight variant 2 with 3/4 iterations. |
|
| `rx/loki` | 2 MB | 3.0.0+ | RandomXL (RandomX variant for Loki). | |
|
||||||
| `cn/double` | 2 MB | 2.14.0+ | CryptoNight variant 2 with double iterations. |
|
| `cn/fast` | 2 MB | 3.0.0+ | CryptoNight variant 1 with half iterations. | |
|
||||||
| `cn/r` | 2 MB | 2.13.0+ | CryptoNightR (Monero's variant 4). |
|
| `cn/rwz` | 2 MB | 2.14.0+ | CryptoNight variant 2 with 3/4 iterations and reversed shuffle operation. | |
|
||||||
| `cn/gpu` | 2 MB | 2.11.0+ | CryptoNight-GPU. |
|
| `cn/zls` | 2 MB | 2.14.0+ | CryptoNight variant 2 with 3/4 iterations. | |
|
||||||
| `cn-pico` | 256 KB | 2.10.0+ | CryptoNight-Pico. |
|
| `cn/double` | 2 MB | 2.14.0+ | CryptoNight variant 2 with double iterations. | |
|
||||||
| `cn/half` | 2 MB | 2.9.0+ | CryptoNight variant 2 with half iterations. |
|
| `cn/r` | 2 MB | 2.13.0+ | CryptoNightR (Monero's variant 4). | |
|
||||||
| `cn/2` | 2 MB | 2.8.0+ | CryptoNight variant 2. |
|
| `cn-pico` | 256 KB | 2.10.0+ | CryptoNight-Pico. | |
|
||||||
| `cn/xao` | 2 MB | 2.6.4+ | CryptoNight variant 0 (modified). |
|
| `cn/half` | 2 MB | 2.9.0+ | CryptoNight variant 2 with half iterations. | |
|
||||||
| `cn/rto` | 2 MB | 2.6.4+ | CryptoNight variant 1 (modified). |
|
| `cn/2` | 2 MB | 2.8.0+ | CryptoNight variant 2. | |
|
||||||
| `cn-heavy/tube` | 4 MB | 2.6.4+ | CryptoNight-Heavy (modified). |
|
| `cn/xao` | 2 MB | 2.6.4+ | CryptoNight variant 0 (modified). | |
|
||||||
| `cn-heavy/xhv` | 4 MB | 2.6.3+ | CryptoNight-Heavy (modified). |
|
| `cn/rto` | 2 MB | 2.6.4+ | CryptoNight variant 1 (modified). | |
|
||||||
| `cn-heavy/0` | 4 MB | 2.6.0+ | CryptoNight-Heavy. |
|
| `cn-heavy/tube` | 4 MB | 2.6.4+ | CryptoNight-Heavy (modified). | |
|
||||||
| `cn/1` | 2 MB | 2.5.0+ | CryptoNight variant 1. |
|
| `cn-heavy/xhv` | 4 MB | 2.6.3+ | CryptoNight-Heavy (modified). | |
|
||||||
| `cn-lite/1` | 1 MB | 2.5.0+ | CryptoNight-Lite variant 1. |
|
| `cn-heavy/0` | 4 MB | 2.6.0+ | CryptoNight-Heavy. | |
|
||||||
| `cn-lite/0` | 1 MB | 0.8.0+ | CryptoNight-Lite variant 0. |
|
| `cn/1` | 2 MB | 2.5.0+ | CryptoNight variant 1. | |
|
||||||
| `cn/0` | 2 MB | 0.5.0+ | CryptoNight (original). |
|
| `cn-lite/1` | 1 MB | 2.5.0+ | CryptoNight-Lite variant 1. | |
|
||||||
|
| `cn-lite/0` | 1 MB | 0.8.0+ | CryptoNight-Lite variant 0. | |
|
||||||
|
| `cn/0` | 2 MB | 0.5.0+ | CryptoNight (original). | |
|
||||||
|
|
||||||
## Migration to v3
|
## Migration to v3
|
||||||
Since version 3 mining [algorithm](#algorithm-names) should specified for each pool separately (`algo` option), earlier versions was use one global `algo` option and per pool `variant` option (this option was removed in v3). If your pool support [mining algorithm negotiation](https://github.com/xmrig/xmrig-proxy/issues/168) you may not specify this option at all.
|
Since version 3 mining [algorithm](#algorithm-names) should specified for each pool separately (`algo` option), earlier versions was use one global `algo` option and per pool `variant` option (this option was removed in v3). If your pool support [mining algorithm negotiation](https://github.com/xmrig/xmrig-proxy/issues/168) you may not specify this option at all.
|
||||||
|
|||||||
29
doc/BENCHMARK.md
Normal file
29
doc/BENCHMARK.md
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# Embedded benchmark
|
||||||
|
|
||||||
|
You can run with XMRig with the following commands:
|
||||||
|
```
|
||||||
|
xmrig --bench=1M
|
||||||
|
xmrig --bench=10M
|
||||||
|
xmrig --bench=1M -a rx/wow
|
||||||
|
xmrig --bench=10M -a rx/wow
|
||||||
|
```
|
||||||
|
This will run between 1 and 10 million RandomX hashes, depending on `bench` parameter, and print the time it took. First two commands use Monero variant (2 MB per thread, best for Zen2/Zen3 CPUs), second two commands use Wownero variant (1 MB per thread, useful for Intel and 1st gen Zen/Zen+ CPUs).
|
||||||
|
|
||||||
|
Checksum of all the hashes will be also printed to check stability of your hardware: if it's green then it's correct, if it's red then there was hardware error during computation. No Internet connection is required for the benchmark.
|
||||||
|
|
||||||
|
Double check that you see `Huge pages 100%` both for dataset and for all threads, and also check for `msr register values ... has been set successfully` - without this result will be far from the best. Running as administrator is required for MSR and huge pages to be set up properly.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Benchmark with custom config
|
||||||
|
|
||||||
|
You can run benchmark with any configuration you want. Just start without command line parameteres, use regular config.json and add `"benchmark":"1M",` on the next line after pool url.
|
||||||
|
|
||||||
|
# Stress test
|
||||||
|
|
||||||
|
You can also run continuous stress-test that is as close to the real RandomX mining as possible and doesn't require any configuration:
|
||||||
|
```
|
||||||
|
xmrig --stress
|
||||||
|
xmrig --stress -a rx/wow
|
||||||
|
```
|
||||||
|
This will require Internet connection and will run indefinitely.
|
||||||
2
doc/build/CMAKE_OPTIONS.md
vendored
2
doc/build/CMAKE_OPTIONS.md
vendored
@@ -6,7 +6,6 @@
|
|||||||
* **`-DWITH_CN_LITE=OFF`** disable all CryptoNight-Lite algorithms (`cn-lite/0`, `cn-lite/1`).
|
* **`-DWITH_CN_LITE=OFF`** disable all CryptoNight-Lite algorithms (`cn-lite/0`, `cn-lite/1`).
|
||||||
* **`-DWITH_CN_HEAVY=OFF`** disable all CryptoNight-Heavy algorithms (`cn-heavy/0`, `cn-heavy/xhv`, `cn-heavy/tube`).
|
* **`-DWITH_CN_HEAVY=OFF`** disable all CryptoNight-Heavy algorithms (`cn-heavy/0`, `cn-heavy/xhv`, `cn-heavy/tube`).
|
||||||
* **`-DWITH_CN_PICO=OFF`** disable CryptoNight-Pico algorithm (`cn-pico`).
|
* **`-DWITH_CN_PICO=OFF`** disable CryptoNight-Pico algorithm (`cn-pico`).
|
||||||
* **`-DWITH_CN_GPU=OFF`** disable CryptoNight-GPU algorithm (`cn/gpu`).
|
|
||||||
* **`-DWITH_RANDOMX=OFF`** disable RandomX algorithms (`rx/loki`, `rx/wow`).
|
* **`-DWITH_RANDOMX=OFF`** disable RandomX algorithms (`rx/loki`, `rx/wow`).
|
||||||
* **`-DWITH_ARGON2=OFF`** disable Argon2 algorithms (`argon2/chukwa`, `argon2/wrkz`).
|
* **`-DWITH_ARGON2=OFF`** disable Argon2 algorithms (`argon2/chukwa`, `argon2/wrkz`).
|
||||||
|
|
||||||
@@ -23,6 +22,7 @@ This feature add external dependency to libhwloc (1.10.0+) (except MSVC builds).
|
|||||||
* **`-DWITH_EMBEDDED_CONFIG=ON`** Enable [embedded](https://github.com/xmrig/xmrig/issues/957) config support.
|
* **`-DWITH_EMBEDDED_CONFIG=ON`** Enable [embedded](https://github.com/xmrig/xmrig/issues/957) config support.
|
||||||
* **`-DWITH_OPENCL=OFF`** Disable OpenCL backend.
|
* **`-DWITH_OPENCL=OFF`** Disable OpenCL backend.
|
||||||
* **`-DWITH_CUDA=OFF`** Disable CUDA backend.
|
* **`-DWITH_CUDA=OFF`** Disable CUDA backend.
|
||||||
|
* **`-DWITH_SSE4_1=OFF`** Disable SSE 4.1 for Blake2 (useful for arm builds).
|
||||||
|
|
||||||
## Debug options
|
## Debug options
|
||||||
|
|
||||||
|
|||||||
19
scripts/build.hwloc.sh
Executable file
19
scripts/build.hwloc.sh
Executable file
@@ -0,0 +1,19 @@
|
|||||||
|
#!/bin/bash -e
|
||||||
|
|
||||||
|
HWLOC_VERSION="2.2.0"
|
||||||
|
|
||||||
|
mkdir -p deps
|
||||||
|
mkdir -p deps/include
|
||||||
|
mkdir -p deps/lib
|
||||||
|
|
||||||
|
mkdir -p build && cd build
|
||||||
|
|
||||||
|
wget https://download.open-mpi.org/release/hwloc/v2.2/hwloc-${HWLOC_VERSION}.tar.gz -O hwloc-${HWLOC_VERSION}.tar.gz
|
||||||
|
tar -xzf hwloc-${HWLOC_VERSION}.tar.gz
|
||||||
|
|
||||||
|
cd hwloc-${HWLOC_VERSION}
|
||||||
|
./configure --disable-shared --enable-static --disable-io --disable-libudev --disable-libxml2
|
||||||
|
make -j$(nproc || sysctl -n hw.ncpu || sysctl -n hw.logicalcpu)
|
||||||
|
cp -fr include ../../deps
|
||||||
|
cp hwloc/.libs/libhwloc.a ../../deps/lib
|
||||||
|
cd ..
|
||||||
19
scripts/build.hwloc1.sh
Executable file
19
scripts/build.hwloc1.sh
Executable file
@@ -0,0 +1,19 @@
|
|||||||
|
#!/bin/bash -e
|
||||||
|
|
||||||
|
HWLOC_VERSION="1.11.13"
|
||||||
|
|
||||||
|
mkdir -p deps
|
||||||
|
mkdir -p deps/include
|
||||||
|
mkdir -p deps/lib
|
||||||
|
|
||||||
|
mkdir -p build && cd build
|
||||||
|
|
||||||
|
wget https://download.open-mpi.org/release/hwloc/v1.11/hwloc-${HWLOC_VERSION}.tar.gz -O hwloc-${HWLOC_VERSION}.tar.gz
|
||||||
|
tar -xzf hwloc-${HWLOC_VERSION}.tar.gz
|
||||||
|
|
||||||
|
cd hwloc-${HWLOC_VERSION}
|
||||||
|
./configure --disable-shared --enable-static --disable-io --disable-libudev --disable-libxml2
|
||||||
|
make -j$(nproc || sysctl -n hw.ncpu || sysctl -n hw.logicalcpu)
|
||||||
|
cp -fr include ../../deps
|
||||||
|
cp src/.libs/libhwloc.a ../../deps/lib
|
||||||
|
cd ..
|
||||||
20
scripts/build.libressl.sh
Executable file
20
scripts/build.libressl.sh
Executable file
@@ -0,0 +1,20 @@
|
|||||||
|
#!/bin/bash -e
|
||||||
|
|
||||||
|
LIBRESSL_VERSION="3.0.2"
|
||||||
|
|
||||||
|
mkdir -p deps
|
||||||
|
mkdir -p deps/include
|
||||||
|
mkdir -p deps/lib
|
||||||
|
|
||||||
|
mkdir -p build && cd build
|
||||||
|
|
||||||
|
wget https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-${LIBRESSL_VERSION}.tar.gz -O libressl-${LIBRESSL_VERSION}.tar.gz
|
||||||
|
tar -xzf libressl-${LIBRESSL_VERSION}.tar.gz
|
||||||
|
|
||||||
|
cd libressl-${LIBRESSL_VERSION}
|
||||||
|
./configure --disable-shared
|
||||||
|
make -j$(nproc || sysctl -n hw.ncpu || sysctl -n hw.logicalcpu)
|
||||||
|
cp -fr include ../../deps
|
||||||
|
cp crypto/.libs/libcrypto.a ../../deps/lib
|
||||||
|
cp ssl/.libs/libssl.a ../../deps/lib
|
||||||
|
cd ..
|
||||||
20
scripts/build.openssl.sh
Executable file
20
scripts/build.openssl.sh
Executable file
@@ -0,0 +1,20 @@
|
|||||||
|
#!/bin/bash -e
|
||||||
|
|
||||||
|
OPENSSL_VERSION="1.1.1g"
|
||||||
|
|
||||||
|
mkdir -p deps
|
||||||
|
mkdir -p deps/include
|
||||||
|
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
|
||||||
|
tar -xzf openssl-${OPENSSL_VERSION}.tar.gz
|
||||||
|
|
||||||
|
cd openssl-${OPENSSL_VERSION}
|
||||||
|
./config -no-shared -no-asm -no-zlib -no-comp -no-dgram -no-filenames -no-cms
|
||||||
|
make -j$(nproc || sysctl -n hw.ncpu || sysctl -n hw.logicalcpu)
|
||||||
|
cp -fr include ../../deps
|
||||||
|
cp libcrypto.a ../../deps/lib
|
||||||
|
cp libssl.a ../../deps/lib
|
||||||
|
cd ..
|
||||||
20
scripts/build.uv.sh
Executable file
20
scripts/build.uv.sh
Executable file
@@ -0,0 +1,20 @@
|
|||||||
|
#!/bin/bash -e
|
||||||
|
|
||||||
|
UV_VERSION="1.38.1"
|
||||||
|
|
||||||
|
mkdir -p deps
|
||||||
|
mkdir -p deps/include
|
||||||
|
mkdir -p deps/lib
|
||||||
|
|
||||||
|
mkdir -p build && cd build
|
||||||
|
|
||||||
|
wget https://github.com/libuv/libuv/archive/v${UV_VERSION}.tar.gz -O v${UV_VERSION}.tar.gz
|
||||||
|
tar -xzf v${UV_VERSION}.tar.gz
|
||||||
|
|
||||||
|
cd libuv-${UV_VERSION}
|
||||||
|
sh autogen.sh
|
||||||
|
./configure --disable-shared
|
||||||
|
make -j$(nproc || sysctl -n hw.ncpu || sysctl -n hw.logicalcpu)
|
||||||
|
cp -fr include ../../deps
|
||||||
|
cp .libs/libuv.a ../../deps/lib
|
||||||
|
cd ..
|
||||||
@@ -1,43 +1,5 @@
|
|||||||
#!/bin/bash -e
|
#!/bin/bash -e
|
||||||
|
|
||||||
UV_VERSION="1.34.0"
|
./build.uv.sh
|
||||||
OPENSSL_VERSION="1.1.1d"
|
./build.hwloc.sh
|
||||||
HWLOC_VERSION="2.1.0"
|
./build.openssl.sh
|
||||||
|
|
||||||
mkdir deps
|
|
||||||
mkdir deps/include
|
|
||||||
mkdir deps/lib
|
|
||||||
|
|
||||||
mkdir build && cd build
|
|
||||||
|
|
||||||
wget https://github.com/libuv/libuv/archive/v${UV_VERSION}.tar.gz
|
|
||||||
tar -xzf v${UV_VERSION}.tar.gz
|
|
||||||
|
|
||||||
wget https://download.open-mpi.org/release/hwloc/v2.1/hwloc-${HWLOC_VERSION}.tar.bz2
|
|
||||||
tar -xjf hwloc-${HWLOC_VERSION}.tar.bz2
|
|
||||||
|
|
||||||
wget https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz
|
|
||||||
tar -xzf openssl-${OPENSSL_VERSION}.tar.gz
|
|
||||||
|
|
||||||
cd libuv-${UV_VERSION}
|
|
||||||
sh autogen.sh
|
|
||||||
./configure --disable-shared
|
|
||||||
make -j$(nproc)
|
|
||||||
cp -fr include/ ../../deps
|
|
||||||
cp .libs/libuv.a ../../deps/lib
|
|
||||||
cd ..
|
|
||||||
|
|
||||||
cd hwloc-${HWLOC_VERSION}
|
|
||||||
./configure --disable-shared --enable-static --disable-io --disable-libudev --disable-libxml2
|
|
||||||
make -j$(nproc)
|
|
||||||
cp -fr include/ ../../deps
|
|
||||||
cp hwloc/.libs/libhwloc.a ../../deps/lib
|
|
||||||
cd ..
|
|
||||||
|
|
||||||
cd openssl-${OPENSSL_VERSION}
|
|
||||||
./config -no-shared -no-asm -no-zlib -no-comp -no-dgram -no-filenames -no-cms
|
|
||||||
make -j$(nproc)
|
|
||||||
cp -fr include/ ../../deps
|
|
||||||
cp libcrypto.a ../../deps/lib
|
|
||||||
cp libssl.a ../../deps/lib
|
|
||||||
cd ../..
|
|
||||||
@@ -43,23 +43,14 @@ function cn_r()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function cn_gpu()
|
|
||||||
{
|
|
||||||
const cn_gpu = opencl_minify(addIncludes('cryptonight_gpu.cl', [ 'wolf-aes.cl', 'keccak.cl' ]));
|
|
||||||
|
|
||||||
// fs.writeFileSync('cryptonight_gpu_gen.cl', cn_gpu);
|
|
||||||
fs.writeFileSync('cryptonight_gpu_cl.h', text2h(cn_gpu, 'xmrig', 'cryptonight_gpu_cl'));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function rx()
|
function rx()
|
||||||
{
|
{
|
||||||
let rx = addIncludes('randomx.cl', [
|
let rx = addIncludes('randomx.cl', [
|
||||||
'../cn/algorithm.cl',
|
'../cn/algorithm.cl',
|
||||||
'randomx_constants_monero.h',
|
'randomx_constants_monero.h',
|
||||||
'randomx_constants_wow.h',
|
'randomx_constants_wow.h',
|
||||||
'randomx_constants_loki.h',
|
|
||||||
'randomx_constants_arqma.h',
|
'randomx_constants_arqma.h',
|
||||||
|
'randomx_constants_keva.h',
|
||||||
'aes.cl',
|
'aes.cl',
|
||||||
'blake2b.cl',
|
'blake2b.cl',
|
||||||
'randomx_vm.cl',
|
'randomx_vm.cl',
|
||||||
@@ -75,13 +66,42 @@ function rx()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function astrobwt()
|
||||||
|
{
|
||||||
|
const astrobwt = opencl_minify(addIncludes('astrobwt.cl', [ 'BWT.cl', 'salsa20.cl', 'sha3.cl' ]));
|
||||||
|
|
||||||
|
// fs.writeFileSync('astrobwt_gen.cl', astrobwt);
|
||||||
|
fs.writeFileSync('astrobwt_cl.h', text2h(astrobwt, 'xmrig', 'astrobwt_cl'));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function kawpow()
|
||||||
|
{
|
||||||
|
const kawpow = opencl_minify(addIncludes('kawpow.cl', [ 'defs.h' ]));
|
||||||
|
const kawpow_dag = opencl_minify(addIncludes('kawpow_dag.cl', [ 'defs.h' ]));
|
||||||
|
|
||||||
|
// fs.writeFileSync('kawpow_gen.cl', kawpow);
|
||||||
|
fs.writeFileSync('kawpow_cl.h', text2h(kawpow, 'xmrig', 'kawpow_cl'));
|
||||||
|
fs.writeFileSync('kawpow_dag_cl.h', text2h(kawpow_dag, 'xmrig', 'kawpow_dag_cl'));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
process.chdir(path.resolve('src/backend/opencl/cl/cn'));
|
process.chdir(path.resolve('src/backend/opencl/cl/cn'));
|
||||||
|
|
||||||
cn();
|
cn();
|
||||||
cn_r();
|
cn_r();
|
||||||
cn_gpu();
|
|
||||||
|
|
||||||
process.chdir(cwd);
|
process.chdir(cwd);
|
||||||
process.chdir(path.resolve('src/backend/opencl/cl/rx'));
|
process.chdir(path.resolve('src/backend/opencl/cl/rx'));
|
||||||
|
|
||||||
rx();
|
rx();
|
||||||
|
|
||||||
|
process.chdir(cwd);
|
||||||
|
process.chdir(path.resolve('src/backend/opencl/cl/astrobwt'));
|
||||||
|
|
||||||
|
astrobwt();
|
||||||
|
|
||||||
|
process.chdir(cwd);
|
||||||
|
process.chdir(path.resolve('src/backend/opencl/cl/kawpow'));
|
||||||
|
|
||||||
|
kawpow();
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ const fs = require('fs');
|
|||||||
function bin2h(buf, namespace, name)
|
function bin2h(buf, namespace, name)
|
||||||
{
|
{
|
||||||
const size = buf.byteLength;
|
const size = buf.byteLength;
|
||||||
let out = `#pragma once\n\nnamespace ${namespace} {\n\nstatic unsigned char ${name}[${size}] = {\n `;
|
let out = `#pragma once\n\nnamespace ${namespace} {\n\nstatic const unsigned char ${name}[${size}] = {\n `;
|
||||||
|
|
||||||
let b = 32;
|
let b = 32;
|
||||||
for (let i = 0; i < size; i++) {
|
for (let i = 0; i < size; i++) {
|
||||||
@@ -28,7 +28,7 @@ function text2h_internal(text, name)
|
|||||||
{
|
{
|
||||||
const buf = Buffer.from(text);
|
const buf = Buffer.from(text);
|
||||||
const size = buf.byteLength;
|
const size = buf.byteLength;
|
||||||
let out = `\nstatic char ${name}[${size + 1}] = {\n `;
|
let out = `\nstatic const char ${name}[${size + 1}] = {\n `;
|
||||||
|
|
||||||
let b = 32;
|
let b = 32;
|
||||||
for (let i = 0; i < size; i++) {
|
for (let i = 0; i < size; i++) {
|
||||||
|
|||||||
2
src/3rdparty/argon2/CMakeLists.txt
vendored
2
src/3rdparty/argon2/CMakeLists.txt
vendored
@@ -17,7 +17,7 @@ set(ARGON2_SOURCES
|
|||||||
|
|
||||||
set(ARGON2_X86_64_ENABLED ON)
|
set(ARGON2_X86_64_ENABLED ON)
|
||||||
set(ARGON2_X86_64_LIBS argon2-sse2 argon2-ssse3 argon2-xop argon2-avx2 argon2-avx512f)
|
set(ARGON2_X86_64_LIBS argon2-sse2 argon2-ssse3 argon2-xop argon2-avx2 argon2-avx512f)
|
||||||
set(ARGON2_X86_64_SOURCES arch/x86_64/lib/argon2-arch.c arch/x86_64/lib/cpu-flags.c)
|
set(ARGON2_X86_64_SOURCES arch/x86_64/lib/argon2-arch.c)
|
||||||
|
|
||||||
if (CMAKE_C_COMPILER_ID MATCHES MSVC)
|
if (CMAKE_C_COMPILER_ID MATCHES MSVC)
|
||||||
function(add_feature_impl FEATURE MSVC_FLAG DEF)
|
function(add_feature_impl FEATURE MSVC_FLAG DEF)
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
|
|
||||||
#include "impl-select.h"
|
#include "impl-select.h"
|
||||||
|
|
||||||
#include "cpu-flags.h"
|
|
||||||
#include "argon2-sse2.h"
|
#include "argon2-sse2.h"
|
||||||
#include "argon2-ssse3.h"
|
#include "argon2-ssse3.h"
|
||||||
#include "argon2-xop.h"
|
#include "argon2-xop.h"
|
||||||
@@ -26,16 +25,14 @@ void fill_segment_default(const argon2_instance_t *instance,
|
|||||||
void argon2_get_impl_list(argon2_impl_list *list)
|
void argon2_get_impl_list(argon2_impl_list *list)
|
||||||
{
|
{
|
||||||
static const argon2_impl IMPLS[] = {
|
static const argon2_impl IMPLS[] = {
|
||||||
{ "x86_64", NULL, fill_segment_default },
|
{ "x86_64", NULL, fill_segment_default },
|
||||||
{ "SSE2", check_sse2, fill_segment_sse2 },
|
{ "SSE2", xmrig_ar2_check_sse2, xmrig_ar2_fill_segment_sse2 },
|
||||||
{ "SSSE3", check_ssse3, fill_segment_ssse3 },
|
{ "SSSE3", xmrig_ar2_check_ssse3, xmrig_ar2_fill_segment_ssse3 },
|
||||||
{ "XOP", check_xop, fill_segment_xop },
|
{ "XOP", xmrig_ar2_check_xop, xmrig_ar2_fill_segment_xop },
|
||||||
{ "AVX2", check_avx2, fill_segment_avx2 },
|
{ "AVX2", xmrig_ar2_check_avx2, xmrig_ar2_fill_segment_avx2 },
|
||||||
{ "AVX-512F", check_avx512f, fill_segment_avx512f },
|
{ "AVX-512F", xmrig_ar2_check_avx512f, xmrig_ar2_fill_segment_avx512f },
|
||||||
};
|
};
|
||||||
|
|
||||||
cpu_flags_get();
|
|
||||||
|
|
||||||
list->count = sizeof(IMPLS) / sizeof(IMPLS[0]);
|
list->count = sizeof(IMPLS) / sizeof(IMPLS[0]);
|
||||||
list->entries = IMPLS;
|
list->entries = IMPLS;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,8 +9,6 @@
|
|||||||
# include <intrin.h>
|
# include <intrin.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "cpu-flags.h"
|
|
||||||
|
|
||||||
#define r16 (_mm256_setr_epi8( \
|
#define r16 (_mm256_setr_epi8( \
|
||||||
2, 3, 4, 5, 6, 7, 0, 1, \
|
2, 3, 4, 5, 6, 7, 0, 1, \
|
||||||
10, 11, 12, 13, 14, 15, 8, 9, \
|
10, 11, 12, 13, 14, 15, 8, 9, \
|
||||||
@@ -225,8 +223,7 @@ static void next_addresses(block *address_block, block *input_block)
|
|||||||
fill_block(zero2_block, address_block, address_block, 0);
|
fill_block(zero2_block, address_block, address_block, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void fill_segment_avx2(const argon2_instance_t *instance,
|
void xmrig_ar2_fill_segment_avx2(const argon2_instance_t *instance, argon2_position_t position)
|
||||||
argon2_position_t position)
|
|
||||||
{
|
{
|
||||||
block *ref_block = NULL, *curr_block = NULL;
|
block *ref_block = NULL, *curr_block = NULL;
|
||||||
block address_block, input_block;
|
block address_block, input_block;
|
||||||
@@ -310,8 +307,7 @@ void fill_segment_avx2(const argon2_instance_t *instance,
|
|||||||
* lane.
|
* lane.
|
||||||
*/
|
*/
|
||||||
position.index = i;
|
position.index = i;
|
||||||
ref_index = index_alpha(instance, &position, pseudo_rand & 0xFFFFFFFF,
|
ref_index = xmrig_ar2_index_alpha(instance, &position, pseudo_rand & 0xFFFFFFFF, ref_lane == position.lane);
|
||||||
ref_lane == position.lane);
|
|
||||||
|
|
||||||
/* 2 Creating a new block */
|
/* 2 Creating a new block */
|
||||||
ref_block =
|
ref_block =
|
||||||
@@ -327,21 +323,13 @@ void fill_segment_avx2(const argon2_instance_t *instance,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int check_avx2(void)
|
|
||||||
{
|
extern int cpu_flags_has_avx2(void);
|
||||||
return cpu_flags_have_avx2();
|
int xmrig_ar2_check_avx2(void) { return cpu_flags_has_avx2(); }
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
void fill_segment_avx2(const argon2_instance_t *instance,
|
void xmrig_ar2_fill_segment_avx2(const argon2_instance_t *instance, argon2_position_t position) {}
|
||||||
argon2_position_t position)
|
int xmrig_ar2_check_avx2(void) { return 0; }
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
int check_avx2(void)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -3,9 +3,7 @@
|
|||||||
|
|
||||||
#include "core.h"
|
#include "core.h"
|
||||||
|
|
||||||
void fill_segment_avx2(const argon2_instance_t *instance,
|
void xmrig_ar2_fill_segment_avx2(const argon2_instance_t *instance, argon2_position_t position);
|
||||||
argon2_position_t position);
|
int xmrig_ar2_check_avx2(void);
|
||||||
|
|
||||||
int check_avx2(void);
|
|
||||||
|
|
||||||
#endif // ARGON2_AVX2_H
|
#endif // ARGON2_AVX2_H
|
||||||
|
|||||||
@@ -10,8 +10,6 @@
|
|||||||
# include <intrin.h>
|
# include <intrin.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "cpu-flags.h"
|
|
||||||
|
|
||||||
#define ror64(x, n) _mm512_ror_epi64((x), (n))
|
#define ror64(x, n) _mm512_ror_epi64((x), (n))
|
||||||
|
|
||||||
static __m512i f(__m512i x, __m512i y)
|
static __m512i f(__m512i x, __m512i y)
|
||||||
@@ -210,8 +208,7 @@ static void next_addresses(block *address_block, block *input_block)
|
|||||||
fill_block(zero2_block, address_block, address_block, 0);
|
fill_block(zero2_block, address_block, address_block, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void fill_segment_avx512f(const argon2_instance_t *instance,
|
void xmrig_ar2_fill_segment_avx512f(const argon2_instance_t *instance, argon2_position_t position)
|
||||||
argon2_position_t position)
|
|
||||||
{
|
{
|
||||||
block *ref_block = NULL, *curr_block = NULL;
|
block *ref_block = NULL, *curr_block = NULL;
|
||||||
block address_block, input_block;
|
block address_block, input_block;
|
||||||
@@ -295,8 +292,7 @@ void fill_segment_avx512f(const argon2_instance_t *instance,
|
|||||||
* lane.
|
* lane.
|
||||||
*/
|
*/
|
||||||
position.index = i;
|
position.index = i;
|
||||||
ref_index = index_alpha(instance, &position, pseudo_rand & 0xFFFFFFFF,
|
ref_index = xmrig_ar2_index_alpha(instance, &position, pseudo_rand & 0xFFFFFFFF, ref_lane == position.lane);
|
||||||
ref_lane == position.lane);
|
|
||||||
|
|
||||||
/* 2 Creating a new block */
|
/* 2 Creating a new block */
|
||||||
ref_block =
|
ref_block =
|
||||||
@@ -312,21 +308,12 @@ void fill_segment_avx512f(const argon2_instance_t *instance,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int check_avx512f(void)
|
extern int cpu_flags_has_avx512f(void);
|
||||||
{
|
int xmrig_ar2_check_avx512f(void) { return cpu_flags_has_avx512f(); }
|
||||||
return cpu_flags_have_avx512f();
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
void fill_segment_avx512f(const argon2_instance_t *instance,
|
void xmrig_ar2_fill_segment_avx512f(const argon2_instance_t *instance, argon2_position_t position) {}
|
||||||
argon2_position_t position)
|
int xmrig_ar2_check_avx512f(void) { return 0; }
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
int check_avx512f(void)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -3,9 +3,7 @@
|
|||||||
|
|
||||||
#include "core.h"
|
#include "core.h"
|
||||||
|
|
||||||
void fill_segment_avx512f(const argon2_instance_t *instance,
|
void xmrig_ar2_fill_segment_avx512f(const argon2_instance_t *instance, argon2_position_t position);
|
||||||
argon2_position_t position);
|
int xmrig_ar2_check_avx512f(void);
|
||||||
|
|
||||||
int check_avx512f(void);
|
|
||||||
|
|
||||||
#endif // ARGON2_AVX512F_H
|
#endif // ARGON2_AVX512F_H
|
||||||
|
|||||||
@@ -7,8 +7,6 @@
|
|||||||
# include <intrin.h>
|
# include <intrin.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "cpu-flags.h"
|
|
||||||
|
|
||||||
#define ror64_16(x) \
|
#define ror64_16(x) \
|
||||||
_mm_shufflehi_epi16( \
|
_mm_shufflehi_epi16( \
|
||||||
_mm_shufflelo_epi16((x), _MM_SHUFFLE(0, 3, 2, 1)), \
|
_mm_shufflelo_epi16((x), _MM_SHUFFLE(0, 3, 2, 1)), \
|
||||||
@@ -102,27 +100,17 @@ static __m128i f(__m128i x, __m128i y)
|
|||||||
|
|
||||||
#include "argon2-template-128.h"
|
#include "argon2-template-128.h"
|
||||||
|
|
||||||
void fill_segment_sse2(const argon2_instance_t *instance,
|
void xmrig_ar2_fill_segment_sse2(const argon2_instance_t *instance, argon2_position_t position)
|
||||||
argon2_position_t position)
|
|
||||||
{
|
{
|
||||||
fill_segment_128(instance, position);
|
fill_segment_128(instance, position);
|
||||||
}
|
}
|
||||||
|
|
||||||
int check_sse2(void)
|
extern int cpu_flags_has_sse2(void);
|
||||||
{
|
int xmrig_ar2_check_sse2(void) { return cpu_flags_has_sse2(); }
|
||||||
return cpu_flags_have_sse2();
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
void fill_segment_sse2(const argon2_instance_t *instance,
|
void xmrig_ar2_fill_segment_sse2(const argon2_instance_t *instance, argon2_position_t position) {}
|
||||||
argon2_position_t position)
|
int xmrig_ar2_check_sse2(void) { return 0; }
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
int check_sse2(void)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -3,9 +3,7 @@
|
|||||||
|
|
||||||
#include "core.h"
|
#include "core.h"
|
||||||
|
|
||||||
void fill_segment_sse2(const argon2_instance_t *instance,
|
void xmrig_ar2_fill_segment_sse2(const argon2_instance_t *instance, argon2_position_t position);
|
||||||
argon2_position_t position);
|
int xmrig_ar2_check_sse2(void);
|
||||||
|
|
||||||
int check_sse2(void);
|
|
||||||
|
|
||||||
#endif // ARGON2_SSE2_H
|
#endif // ARGON2_SSE2_H
|
||||||
|
|||||||
@@ -9,8 +9,6 @@
|
|||||||
# include <intrin.h>
|
# include <intrin.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "cpu-flags.h"
|
|
||||||
|
|
||||||
#define r16 (_mm_setr_epi8( \
|
#define r16 (_mm_setr_epi8( \
|
||||||
2, 3, 4, 5, 6, 7, 0, 1, \
|
2, 3, 4, 5, 6, 7, 0, 1, \
|
||||||
10, 11, 12, 13, 14, 15, 8, 9))
|
10, 11, 12, 13, 14, 15, 8, 9))
|
||||||
@@ -114,27 +112,17 @@ static __m128i f(__m128i x, __m128i y)
|
|||||||
|
|
||||||
#include "argon2-template-128.h"
|
#include "argon2-template-128.h"
|
||||||
|
|
||||||
void fill_segment_ssse3(const argon2_instance_t *instance,
|
void xmrig_ar2_fill_segment_ssse3(const argon2_instance_t *instance, argon2_position_t position)
|
||||||
argon2_position_t position)
|
|
||||||
{
|
{
|
||||||
fill_segment_128(instance, position);
|
fill_segment_128(instance, position);
|
||||||
}
|
}
|
||||||
|
|
||||||
int check_ssse3(void)
|
extern int cpu_flags_has_ssse3(void);
|
||||||
{
|
int xmrig_ar2_check_ssse3(void) { return cpu_flags_has_ssse3(); }
|
||||||
return cpu_flags_have_ssse3();
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
void fill_segment_ssse3(const argon2_instance_t *instance,
|
void xmrig_ar2_fill_segment_ssse3(const argon2_instance_t *instance, argon2_position_t position) {}
|
||||||
argon2_position_t position)
|
int xmrig_ar2_check_ssse3(void) { return 0; }
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
int check_ssse3(void)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -3,9 +3,7 @@
|
|||||||
|
|
||||||
#include "core.h"
|
#include "core.h"
|
||||||
|
|
||||||
void fill_segment_ssse3(const argon2_instance_t *instance,
|
void xmrig_ar2_fill_segment_ssse3(const argon2_instance_t *instance, argon2_position_t position);
|
||||||
argon2_position_t position);
|
int xmrig_ar2_check_ssse3(void);
|
||||||
|
|
||||||
int check_ssse3(void);
|
|
||||||
|
|
||||||
#endif // ARGON2_SSSE3_H
|
#endif // ARGON2_SSSE3_H
|
||||||
|
|||||||
@@ -150,8 +150,7 @@ static void fill_segment_128(const argon2_instance_t *instance,
|
|||||||
* lane.
|
* lane.
|
||||||
*/
|
*/
|
||||||
position.index = i;
|
position.index = i;
|
||||||
ref_index = index_alpha(instance, &position, pseudo_rand & 0xFFFFFFFF,
|
ref_index = xmrig_ar2_index_alpha(instance, &position, pseudo_rand & 0xFFFFFFFF, ref_lane == position.lane);
|
||||||
ref_lane == position.lane);
|
|
||||||
|
|
||||||
/* 2 Creating a new block */
|
/* 2 Creating a new block */
|
||||||
ref_block =
|
ref_block =
|
||||||
|
|||||||
22
src/3rdparty/argon2/arch/x86_64/lib/argon2-xop.c
vendored
22
src/3rdparty/argon2/arch/x86_64/lib/argon2-xop.c
vendored
@@ -9,8 +9,6 @@
|
|||||||
# include <intrin.h>
|
# include <intrin.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "cpu-flags.h"
|
|
||||||
|
|
||||||
#define ror64(x, c) _mm_roti_epi64((x), -(c))
|
#define ror64(x, c) _mm_roti_epi64((x), -(c))
|
||||||
|
|
||||||
static __m128i f(__m128i x, __m128i y)
|
static __m128i f(__m128i x, __m128i y)
|
||||||
@@ -102,27 +100,17 @@ static __m128i f(__m128i x, __m128i y)
|
|||||||
|
|
||||||
#include "argon2-template-128.h"
|
#include "argon2-template-128.h"
|
||||||
|
|
||||||
void fill_segment_xop(const argon2_instance_t *instance,
|
void xmrig_ar2_fill_segment_xop(const argon2_instance_t *instance, argon2_position_t position)
|
||||||
argon2_position_t position)
|
|
||||||
{
|
{
|
||||||
fill_segment_128(instance, position);
|
fill_segment_128(instance, position);
|
||||||
}
|
}
|
||||||
|
|
||||||
int check_xop(void)
|
extern int cpu_flags_has_xop(void);
|
||||||
{
|
int xmrig_ar2_check_xop(void) { return cpu_flags_has_xop(); }
|
||||||
return cpu_flags_have_xop();
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
void fill_segment_xop(const argon2_instance_t *instance,
|
void xmrig_ar2_fill_segment_xop(const argon2_instance_t *instance, argon2_position_t position) {}
|
||||||
argon2_position_t position)
|
int xmrig_ar2_check_xop(void) { return 0; }
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
int check_xop(void)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -3,9 +3,7 @@
|
|||||||
|
|
||||||
#include "core.h"
|
#include "core.h"
|
||||||
|
|
||||||
void fill_segment_xop(const argon2_instance_t *instance,
|
void xmrig_ar2_fill_segment_xop(const argon2_instance_t *instance, argon2_position_t position);
|
||||||
argon2_position_t position);
|
int xmrig_ar2_check_xop(void);
|
||||||
|
|
||||||
int check_xop(void);
|
|
||||||
|
|
||||||
#endif // ARGON2_XOP_H
|
#endif // ARGON2_XOP_H
|
||||||
|
|||||||
129
src/3rdparty/argon2/arch/x86_64/lib/cpu-flags.c
vendored
129
src/3rdparty/argon2/arch/x86_64/lib/cpu-flags.c
vendored
@@ -1,129 +0,0 @@
|
|||||||
#include <stdbool.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
|
|
||||||
#include "cpu-flags.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
# include <intrin.h>
|
|
||||||
#else
|
|
||||||
# include <cpuid.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef bit_OSXSAVE
|
|
||||||
# define bit_OSXSAVE (1 << 27)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef bit_SSE2
|
|
||||||
# define bit_SSE2 (1 << 26)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef bit_SSSE3
|
|
||||||
# define bit_SSSE3 (1 << 9)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef bit_AVX2
|
|
||||||
# define bit_AVX2 (1 << 5)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef bit_AVX512F
|
|
||||||
# define bit_AVX512F (1 << 16)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef bit_XOP
|
|
||||||
# define bit_XOP (1 << 11)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define PROCESSOR_INFO (1)
|
|
||||||
#define EXTENDED_FEATURES (7)
|
|
||||||
|
|
||||||
#define EAX_Reg (0)
|
|
||||||
#define EBX_Reg (1)
|
|
||||||
#define ECX_Reg (2)
|
|
||||||
#define EDX_Reg (3)
|
|
||||||
|
|
||||||
|
|
||||||
enum {
|
|
||||||
X86_64_FEATURE_SSE2 = (1 << 0),
|
|
||||||
X86_64_FEATURE_SSSE3 = (1 << 1),
|
|
||||||
X86_64_FEATURE_XOP = (1 << 2),
|
|
||||||
X86_64_FEATURE_AVX2 = (1 << 3),
|
|
||||||
X86_64_FEATURE_AVX512F = (1 << 4),
|
|
||||||
};
|
|
||||||
|
|
||||||
static unsigned int cpu_flags;
|
|
||||||
|
|
||||||
|
|
||||||
static inline void cpuid(uint32_t level, int32_t output[4])
|
|
||||||
{
|
|
||||||
# ifdef _MSC_VER
|
|
||||||
__cpuid(output, (int) level);
|
|
||||||
# else
|
|
||||||
__cpuid_count(level, 0, output[0], output[1], output[2], output[3]);
|
|
||||||
# endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static bool has_feature(uint32_t level, uint32_t reg, int32_t bit)
|
|
||||||
{
|
|
||||||
int32_t cpu_info[4] = { 0 };
|
|
||||||
cpuid(level, cpu_info);
|
|
||||||
|
|
||||||
return (cpu_info[reg] & bit) != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void cpu_flags_get(void)
|
|
||||||
{
|
|
||||||
if (has_feature(PROCESSOR_INFO, EDX_Reg, bit_SSE2)) {
|
|
||||||
cpu_flags |= X86_64_FEATURE_SSE2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (has_feature(PROCESSOR_INFO, ECX_Reg, bit_SSSE3)) {
|
|
||||||
cpu_flags |= X86_64_FEATURE_SSSE3;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!has_feature(PROCESSOR_INFO, ECX_Reg, bit_OSXSAVE)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (has_feature(EXTENDED_FEATURES, EBX_Reg, bit_AVX2)) {
|
|
||||||
cpu_flags |= X86_64_FEATURE_AVX2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (has_feature(EXTENDED_FEATURES, EBX_Reg, bit_AVX512F)) {
|
|
||||||
cpu_flags |= X86_64_FEATURE_AVX512F;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (has_feature(0x80000001, ECX_Reg, bit_XOP)) {
|
|
||||||
cpu_flags |= X86_64_FEATURE_XOP;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpu_flags_have_sse2(void)
|
|
||||||
{
|
|
||||||
return cpu_flags & X86_64_FEATURE_SSE2;
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpu_flags_have_ssse3(void)
|
|
||||||
{
|
|
||||||
return cpu_flags & X86_64_FEATURE_SSSE3;
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpu_flags_have_xop(void)
|
|
||||||
{
|
|
||||||
return cpu_flags & X86_64_FEATURE_XOP;
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpu_flags_have_avx2(void)
|
|
||||||
{
|
|
||||||
return cpu_flags & X86_64_FEATURE_AVX2;
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpu_flags_have_avx512f(void)
|
|
||||||
{
|
|
||||||
return cpu_flags & X86_64_FEATURE_AVX512F;
|
|
||||||
}
|
|
||||||
|
|
||||||
12
src/3rdparty/argon2/arch/x86_64/lib/cpu-flags.h
vendored
12
src/3rdparty/argon2/arch/x86_64/lib/cpu-flags.h
vendored
@@ -1,12 +0,0 @@
|
|||||||
#ifndef ARGON2_CPU_FLAGS_H
|
|
||||||
#define ARGON2_CPU_FLAGS_H
|
|
||||||
|
|
||||||
void cpu_flags_get(void);
|
|
||||||
|
|
||||||
int cpu_flags_have_sse2(void);
|
|
||||||
int cpu_flags_have_ssse3(void);
|
|
||||||
int cpu_flags_have_xop(void);
|
|
||||||
int cpu_flags_have_avx2(void);
|
|
||||||
int cpu_flags_have_avx512f(void);
|
|
||||||
|
|
||||||
#endif // ARGON2_CPU_FLAGS_H
|
|
||||||
3
src/3rdparty/argon2/lib/argon2-template-64.h
vendored
3
src/3rdparty/argon2/lib/argon2-template-64.h
vendored
@@ -174,8 +174,7 @@ static void fill_segment_64(const argon2_instance_t *instance,
|
|||||||
* lane.
|
* lane.
|
||||||
*/
|
*/
|
||||||
position.index = i;
|
position.index = i;
|
||||||
ref_index = index_alpha(instance, &position, pseudo_rand & 0xFFFFFFFF,
|
ref_index = xmrig_ar2_index_alpha(instance, &position, pseudo_rand & 0xFFFFFFFF, ref_lane == position.lane);
|
||||||
ref_lane == position.lane);
|
|
||||||
|
|
||||||
/* 2 Creating a new block */
|
/* 2 Creating a new block */
|
||||||
ref_block =
|
ref_block =
|
||||||
|
|||||||
16
src/3rdparty/argon2/lib/argon2.c
vendored
16
src/3rdparty/argon2/lib/argon2.c
vendored
@@ -57,7 +57,7 @@ size_t argon2_memory_size(uint32_t m_cost, uint32_t parallelism) {
|
|||||||
int argon2_ctx_mem(argon2_context *context, argon2_type type, void *memory,
|
int argon2_ctx_mem(argon2_context *context, argon2_type type, void *memory,
|
||||||
size_t memory_size) {
|
size_t memory_size) {
|
||||||
/* 1. Validate all inputs */
|
/* 1. Validate all inputs */
|
||||||
int result = validate_inputs(context);
|
int result = xmrig_ar2_validate_inputs(context);
|
||||||
uint32_t memory_blocks, segment_length;
|
uint32_t memory_blocks, segment_length;
|
||||||
argon2_instance_t instance;
|
argon2_instance_t instance;
|
||||||
|
|
||||||
@@ -98,20 +98,20 @@ int argon2_ctx_mem(argon2_context *context, argon2_type type, void *memory,
|
|||||||
/* 3. Initialization: Hashing inputs, allocating memory, filling first
|
/* 3. Initialization: Hashing inputs, allocating memory, filling first
|
||||||
* blocks
|
* blocks
|
||||||
*/
|
*/
|
||||||
result = initialize(&instance, context);
|
result = xmrig_ar2_initialize(&instance, context);
|
||||||
|
|
||||||
if (ARGON2_OK != result) {
|
if (ARGON2_OK != result) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 4. Filling memory */
|
/* 4. Filling memory */
|
||||||
result = fill_memory_blocks(&instance);
|
result = xmrig_ar2_fill_memory_blocks(&instance);
|
||||||
|
|
||||||
if (ARGON2_OK != result) {
|
if (ARGON2_OK != result) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
/* 5. Finalization */
|
/* 5. Finalization */
|
||||||
finalize(context, &instance);
|
xmrig_ar2_finalize(context, &instance);
|
||||||
|
|
||||||
return ARGON2_OK;
|
return ARGON2_OK;
|
||||||
}
|
}
|
||||||
@@ -174,7 +174,7 @@ int argon2_hash(const uint32_t t_cost, const uint32_t m_cost,
|
|||||||
result = argon2_ctx(&context, type);
|
result = argon2_ctx(&context, type);
|
||||||
|
|
||||||
if (result != ARGON2_OK) {
|
if (result != ARGON2_OK) {
|
||||||
clear_internal_memory(out, hashlen);
|
xmrig_ar2_clear_internal_memory(out, hashlen);
|
||||||
free(out);
|
free(out);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -187,13 +187,13 @@ int argon2_hash(const uint32_t t_cost, const uint32_t m_cost,
|
|||||||
/* if encoding requested, write it */
|
/* if encoding requested, write it */
|
||||||
if (encoded && encodedlen) {
|
if (encoded && encodedlen) {
|
||||||
if (encode_string(encoded, encodedlen, &context, type) != ARGON2_OK) {
|
if (encode_string(encoded, encodedlen, &context, type) != ARGON2_OK) {
|
||||||
clear_internal_memory(out, hashlen); /* wipe buffers if error */
|
xmrig_ar2_clear_internal_memory(out, hashlen); /* wipe buffers if error */
|
||||||
clear_internal_memory(encoded, encodedlen);
|
xmrig_ar2_clear_internal_memory(encoded, encodedlen);
|
||||||
free(out);
|
free(out);
|
||||||
return ARGON2_ENCODING_FAIL;
|
return ARGON2_ENCODING_FAIL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
clear_internal_memory(out, hashlen);
|
xmrig_ar2_clear_internal_memory(out, hashlen);
|
||||||
free(out);
|
free(out);
|
||||||
|
|
||||||
return ARGON2_OK;
|
return ARGON2_OK;
|
||||||
|
|||||||
44
src/3rdparty/argon2/lib/blake2/blake2.c
vendored
44
src/3rdparty/argon2/lib/blake2/blake2.c
vendored
@@ -128,14 +128,14 @@ static void blake2b_init_state(blake2b_state *S)
|
|||||||
S->buflen = 0;
|
S->buflen = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void blake2b_init(blake2b_state *S, size_t outlen)
|
void xmrig_ar2_blake2b_init(blake2b_state *S, size_t outlen)
|
||||||
{
|
{
|
||||||
blake2b_init_state(S);
|
blake2b_init_state(S);
|
||||||
/* XOR initial state with param block: */
|
/* XOR initial state with param block: */
|
||||||
S->h[0] ^= (uint64_t)outlen | (UINT64_C(1) << 16) | (UINT64_C(1) << 24);
|
S->h[0] ^= (uint64_t)outlen | (UINT64_C(1) << 16) | (UINT64_C(1) << 24);
|
||||||
}
|
}
|
||||||
|
|
||||||
void blake2b_update(blake2b_state *S, const void *in, size_t inlen)
|
void xmrig_ar2_blake2b_update(blake2b_state *S, const void *in, size_t inlen)
|
||||||
{
|
{
|
||||||
const uint8_t *pin = (const uint8_t *)in;
|
const uint8_t *pin = (const uint8_t *)in;
|
||||||
|
|
||||||
@@ -160,7 +160,7 @@ void blake2b_update(blake2b_state *S, const void *in, size_t inlen)
|
|||||||
S->buflen += inlen;
|
S->buflen += inlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
void blake2b_final(blake2b_state *S, void *out, size_t outlen)
|
void xmrig_ar2_blake2b_final(blake2b_state *S, void *out, size_t outlen)
|
||||||
{
|
{
|
||||||
uint8_t buffer[BLAKE2B_OUTBYTES] = {0};
|
uint8_t buffer[BLAKE2B_OUTBYTES] = {0};
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
@@ -174,12 +174,12 @@ void blake2b_final(blake2b_state *S, void *out, size_t outlen)
|
|||||||
}
|
}
|
||||||
|
|
||||||
memcpy(out, buffer, outlen);
|
memcpy(out, buffer, outlen);
|
||||||
clear_internal_memory(buffer, sizeof(buffer));
|
xmrig_ar2_clear_internal_memory(buffer, sizeof(buffer));
|
||||||
clear_internal_memory(S->buf, sizeof(S->buf));
|
xmrig_ar2_clear_internal_memory(S->buf, sizeof(S->buf));
|
||||||
clear_internal_memory(S->h, sizeof(S->h));
|
xmrig_ar2_clear_internal_memory(S->h, sizeof(S->h));
|
||||||
}
|
}
|
||||||
|
|
||||||
void blake2b_long(void *out, size_t outlen, const void *in, size_t inlen)
|
void xmrig_ar2_blake2b_long(void *out, size_t outlen, const void *in, size_t inlen)
|
||||||
{
|
{
|
||||||
uint8_t *pout = (uint8_t *)out;
|
uint8_t *pout = (uint8_t *)out;
|
||||||
blake2b_state blake_state;
|
blake2b_state blake_state;
|
||||||
@@ -187,39 +187,39 @@ void blake2b_long(void *out, size_t outlen, const void *in, size_t inlen)
|
|||||||
|
|
||||||
store32(outlen_bytes, (uint32_t)outlen);
|
store32(outlen_bytes, (uint32_t)outlen);
|
||||||
if (outlen <= BLAKE2B_OUTBYTES) {
|
if (outlen <= BLAKE2B_OUTBYTES) {
|
||||||
blake2b_init(&blake_state, outlen);
|
xmrig_ar2_blake2b_init(&blake_state, outlen);
|
||||||
blake2b_update(&blake_state, outlen_bytes, sizeof(outlen_bytes));
|
xmrig_ar2_blake2b_update(&blake_state, outlen_bytes, sizeof(outlen_bytes));
|
||||||
blake2b_update(&blake_state, in, inlen);
|
xmrig_ar2_blake2b_update(&blake_state, in, inlen);
|
||||||
blake2b_final(&blake_state, pout, outlen);
|
xmrig_ar2_blake2b_final(&blake_state, pout, outlen);
|
||||||
} else {
|
} else {
|
||||||
uint32_t toproduce;
|
uint32_t toproduce;
|
||||||
uint8_t out_buffer[BLAKE2B_OUTBYTES];
|
uint8_t out_buffer[BLAKE2B_OUTBYTES];
|
||||||
|
|
||||||
blake2b_init(&blake_state, BLAKE2B_OUTBYTES);
|
xmrig_ar2_blake2b_init(&blake_state, BLAKE2B_OUTBYTES);
|
||||||
blake2b_update(&blake_state, outlen_bytes, sizeof(outlen_bytes));
|
xmrig_ar2_blake2b_update(&blake_state, outlen_bytes, sizeof(outlen_bytes));
|
||||||
blake2b_update(&blake_state, in, inlen);
|
xmrig_ar2_blake2b_update(&blake_state, in, inlen);
|
||||||
blake2b_final(&blake_state, out_buffer, BLAKE2B_OUTBYTES);
|
xmrig_ar2_blake2b_final(&blake_state, out_buffer, BLAKE2B_OUTBYTES);
|
||||||
|
|
||||||
memcpy(pout, out_buffer, BLAKE2B_OUTBYTES / 2);
|
memcpy(pout, out_buffer, BLAKE2B_OUTBYTES / 2);
|
||||||
pout += BLAKE2B_OUTBYTES / 2;
|
pout += BLAKE2B_OUTBYTES / 2;
|
||||||
toproduce = (uint32_t)outlen - BLAKE2B_OUTBYTES / 2;
|
toproduce = (uint32_t)outlen - BLAKE2B_OUTBYTES / 2;
|
||||||
|
|
||||||
while (toproduce > BLAKE2B_OUTBYTES) {
|
while (toproduce > BLAKE2B_OUTBYTES) {
|
||||||
blake2b_init(&blake_state, BLAKE2B_OUTBYTES);
|
xmrig_ar2_blake2b_init(&blake_state, BLAKE2B_OUTBYTES);
|
||||||
blake2b_update(&blake_state, out_buffer, BLAKE2B_OUTBYTES);
|
xmrig_ar2_blake2b_update(&blake_state, out_buffer, BLAKE2B_OUTBYTES);
|
||||||
blake2b_final(&blake_state, out_buffer, BLAKE2B_OUTBYTES);
|
xmrig_ar2_blake2b_final(&blake_state, out_buffer, BLAKE2B_OUTBYTES);
|
||||||
|
|
||||||
memcpy(pout, out_buffer, BLAKE2B_OUTBYTES / 2);
|
memcpy(pout, out_buffer, BLAKE2B_OUTBYTES / 2);
|
||||||
pout += BLAKE2B_OUTBYTES / 2;
|
pout += BLAKE2B_OUTBYTES / 2;
|
||||||
toproduce -= BLAKE2B_OUTBYTES / 2;
|
toproduce -= BLAKE2B_OUTBYTES / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
blake2b_init(&blake_state, toproduce);
|
xmrig_ar2_blake2b_init(&blake_state, toproduce);
|
||||||
blake2b_update(&blake_state, out_buffer, BLAKE2B_OUTBYTES);
|
xmrig_ar2_blake2b_update(&blake_state, out_buffer, BLAKE2B_OUTBYTES);
|
||||||
blake2b_final(&blake_state, out_buffer, toproduce);
|
xmrig_ar2_blake2b_final(&blake_state, out_buffer, toproduce);
|
||||||
|
|
||||||
memcpy(pout, out_buffer, toproduce);
|
memcpy(pout, out_buffer, toproduce);
|
||||||
|
|
||||||
clear_internal_memory(out_buffer, sizeof(out_buffer));
|
xmrig_ar2_clear_internal_memory(out_buffer, sizeof(out_buffer));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
8
src/3rdparty/argon2/lib/blake2/blake2.h
vendored
8
src/3rdparty/argon2/lib/blake2/blake2.h
vendored
@@ -20,11 +20,11 @@ typedef struct __blake2b_state {
|
|||||||
} blake2b_state;
|
} blake2b_state;
|
||||||
|
|
||||||
/* Streaming API */
|
/* Streaming API */
|
||||||
void blake2b_init(blake2b_state *S, size_t outlen);
|
void xmrig_ar2_blake2b_init(blake2b_state *S, size_t outlen);
|
||||||
void blake2b_update(blake2b_state *S, const void *in, size_t inlen);
|
void xmrig_ar2_blake2b_update(blake2b_state *S, const void *in, size_t inlen);
|
||||||
void blake2b_final(blake2b_state *S, void *out, size_t outlen);
|
void xmrig_ar2_blake2b_final(blake2b_state *S, void *out, size_t outlen);
|
||||||
|
|
||||||
void blake2b_long(void *out, size_t outlen, const void *in, size_t inlen);
|
void xmrig_ar2_blake2b_long(void *out, size_t outlen, const void *in, size_t inlen);
|
||||||
|
|
||||||
#endif // ARGON2_BLAKE2_H
|
#endif // ARGON2_BLAKE2_H
|
||||||
|
|
||||||
|
|||||||
119
src/3rdparty/argon2/lib/core.c
vendored
119
src/3rdparty/argon2/lib/core.c
vendored
@@ -77,8 +77,7 @@ static void store_block(void *output, const block *src) {
|
|||||||
|
|
||||||
/***************Memory functions*****************/
|
/***************Memory functions*****************/
|
||||||
|
|
||||||
int allocate_memory(const argon2_context *context,
|
int xmrig_ar2_allocate_memory(const argon2_context *context, argon2_instance_t *instance) {
|
||||||
argon2_instance_t *instance) {
|
|
||||||
size_t blocks = instance->memory_blocks;
|
size_t blocks = instance->memory_blocks;
|
||||||
size_t memory_size = blocks * ARGON2_BLOCK_SIZE;
|
size_t memory_size = blocks * ARGON2_BLOCK_SIZE;
|
||||||
|
|
||||||
@@ -107,11 +106,10 @@ int allocate_memory(const argon2_context *context,
|
|||||||
return ARGON2_OK;
|
return ARGON2_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void free_memory(const argon2_context *context,
|
void xmrig_ar2_free_memory(const argon2_context *context, const argon2_instance_t *instance) {
|
||||||
const argon2_instance_t *instance) {
|
|
||||||
size_t memory_size = instance->memory_blocks * ARGON2_BLOCK_SIZE;
|
size_t memory_size = instance->memory_blocks * ARGON2_BLOCK_SIZE;
|
||||||
|
|
||||||
clear_internal_memory(instance->memory, memory_size);
|
xmrig_ar2_clear_internal_memory(instance->memory, memory_size);
|
||||||
|
|
||||||
if (instance->keep_memory) {
|
if (instance->keep_memory) {
|
||||||
/* user-supplied memory -- do not free */
|
/* user-supplied memory -- do not free */
|
||||||
@@ -125,7 +123,7 @@ void free_memory(const argon2_context *context,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NOT_OPTIMIZED secure_wipe_memory(void *v, size_t n) {
|
void NOT_OPTIMIZED xmrig_ar2_secure_wipe_memory(void *v, size_t n) {
|
||||||
#if defined(_MSC_VER) && VC_GE_2005(_MSC_VER)
|
#if defined(_MSC_VER) && VC_GE_2005(_MSC_VER)
|
||||||
SecureZeroMemory(v, n);
|
SecureZeroMemory(v, n);
|
||||||
#elif defined memset_s
|
#elif defined memset_s
|
||||||
@@ -140,14 +138,14 @@ void NOT_OPTIMIZED secure_wipe_memory(void *v, size_t n) {
|
|||||||
|
|
||||||
/* Memory clear flag defaults to true. */
|
/* Memory clear flag defaults to true. */
|
||||||
int FLAG_clear_internal_memory = 0;
|
int FLAG_clear_internal_memory = 0;
|
||||||
void clear_internal_memory(void *v, size_t n) {
|
void xmrig_ar2_clear_internal_memory(void *v, size_t n) {
|
||||||
if (FLAG_clear_internal_memory && v) {
|
if (FLAG_clear_internal_memory && v) {
|
||||||
secure_wipe_memory(v, n);
|
xmrig_ar2_secure_wipe_memory(v, n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void finalize(const argon2_context *context, argon2_instance_t *instance) {
|
void xmrig_ar2_finalize(const argon2_context *context, argon2_instance_t *instance) {
|
||||||
if (context != NULL && instance != NULL) {
|
if (context != NULL && instance != NULL && context->out != NULL) {
|
||||||
block blockhash;
|
block blockhash;
|
||||||
uint32_t l;
|
uint32_t l;
|
||||||
|
|
||||||
@@ -164,24 +162,21 @@ void finalize(const argon2_context *context, argon2_instance_t *instance) {
|
|||||||
{
|
{
|
||||||
uint8_t blockhash_bytes[ARGON2_BLOCK_SIZE];
|
uint8_t blockhash_bytes[ARGON2_BLOCK_SIZE];
|
||||||
store_block(blockhash_bytes, &blockhash);
|
store_block(blockhash_bytes, &blockhash);
|
||||||
blake2b_long(context->out, context->outlen, blockhash_bytes,
|
xmrig_ar2_blake2b_long(context->out, context->outlen, blockhash_bytes, ARGON2_BLOCK_SIZE);
|
||||||
ARGON2_BLOCK_SIZE);
|
|
||||||
/* clear blockhash and blockhash_bytes */
|
/* clear blockhash and blockhash_bytes */
|
||||||
clear_internal_memory(blockhash.v, ARGON2_BLOCK_SIZE);
|
xmrig_ar2_clear_internal_memory(blockhash.v, ARGON2_BLOCK_SIZE);
|
||||||
clear_internal_memory(blockhash_bytes, ARGON2_BLOCK_SIZE);
|
xmrig_ar2_clear_internal_memory(blockhash_bytes, ARGON2_BLOCK_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (instance->print_internals) {
|
if (instance->print_internals) {
|
||||||
print_tag(context->out, context->outlen);
|
print_tag(context->out, context->outlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
free_memory(context, instance);
|
xmrig_ar2_free_memory(context, instance);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t index_alpha(const argon2_instance_t *instance,
|
uint32_t xmrig_ar2_index_alpha(const argon2_instance_t *instance, const argon2_position_t *position, uint32_t pseudo_rand, int same_lane) {
|
||||||
const argon2_position_t *position, uint32_t pseudo_rand,
|
|
||||||
int same_lane) {
|
|
||||||
/*
|
/*
|
||||||
* Pass 0:
|
* Pass 0:
|
||||||
* This lane : all already finished segments plus already constructed
|
* This lane : all already finished segments plus already constructed
|
||||||
@@ -257,7 +252,7 @@ static int fill_memory_blocks_st(argon2_instance_t *instance) {
|
|||||||
for (s = 0; s < ARGON2_SYNC_POINTS; ++s) {
|
for (s = 0; s < ARGON2_SYNC_POINTS; ++s) {
|
||||||
for (l = 0; l < instance->lanes; ++l) {
|
for (l = 0; l < instance->lanes; ++l) {
|
||||||
argon2_position_t position = { r, l, (uint8_t)s, 0 };
|
argon2_position_t position = { r, l, (uint8_t)s, 0 };
|
||||||
fill_segment(instance, position);
|
xmrig_ar2_fill_segment(instance, position);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -268,7 +263,7 @@ static int fill_memory_blocks_st(argon2_instance_t *instance) {
|
|||||||
return ARGON2_OK;
|
return ARGON2_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int fill_memory_blocks(argon2_instance_t *instance) {
|
int xmrig_ar2_fill_memory_blocks(argon2_instance_t *instance) {
|
||||||
if (instance == NULL || instance->lanes == 0) {
|
if (instance == NULL || instance->lanes == 0) {
|
||||||
return ARGON2_INCORRECT_PARAMETER;
|
return ARGON2_INCORRECT_PARAMETER;
|
||||||
}
|
}
|
||||||
@@ -276,19 +271,19 @@ int fill_memory_blocks(argon2_instance_t *instance) {
|
|||||||
return fill_memory_blocks_st(instance);
|
return fill_memory_blocks_st(instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
int validate_inputs(const argon2_context *context) {
|
int xmrig_ar2_validate_inputs(const argon2_context *context) {
|
||||||
if (NULL == context) {
|
if (NULL == context) {
|
||||||
return ARGON2_INCORRECT_PARAMETER;
|
return ARGON2_INCORRECT_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NULL == context->out) {
|
//if (NULL == context->out) {
|
||||||
return ARGON2_OUTPUT_PTR_NULL;
|
// return ARGON2_OUTPUT_PTR_NULL;
|
||||||
}
|
//}
|
||||||
|
|
||||||
/* Validate output length */
|
/* Validate output length */
|
||||||
if (ARGON2_MIN_OUTLEN > context->outlen) {
|
//if (ARGON2_MIN_OUTLEN > context->outlen) {
|
||||||
return ARGON2_OUTPUT_TOO_SHORT;
|
// return ARGON2_OUTPUT_TOO_SHORT;
|
||||||
}
|
//}
|
||||||
|
|
||||||
if (ARGON2_MAX_OUTLEN < context->outlen) {
|
if (ARGON2_MAX_OUTLEN < context->outlen) {
|
||||||
return ARGON2_OUTPUT_TOO_LONG;
|
return ARGON2_OUTPUT_TOO_LONG;
|
||||||
@@ -403,7 +398,7 @@ int validate_inputs(const argon2_context *context) {
|
|||||||
return ARGON2_OK;
|
return ARGON2_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void fill_first_blocks(uint8_t *blockhash, const argon2_instance_t *instance) {
|
void xmrig_ar2_fill_first_blocks(uint8_t *blockhash, const argon2_instance_t *instance) {
|
||||||
uint32_t l;
|
uint32_t l;
|
||||||
/* Make the first and second block in each lane as G(H0||0||i) or
|
/* Make the first and second block in each lane as G(H0||0||i) or
|
||||||
G(H0||1||i) */
|
G(H0||1||i) */
|
||||||
@@ -412,21 +407,17 @@ void fill_first_blocks(uint8_t *blockhash, const argon2_instance_t *instance) {
|
|||||||
|
|
||||||
store32(blockhash + ARGON2_PREHASH_DIGEST_LENGTH, 0);
|
store32(blockhash + ARGON2_PREHASH_DIGEST_LENGTH, 0);
|
||||||
store32(blockhash + ARGON2_PREHASH_DIGEST_LENGTH + 4, l);
|
store32(blockhash + ARGON2_PREHASH_DIGEST_LENGTH + 4, l);
|
||||||
blake2b_long(blockhash_bytes, ARGON2_BLOCK_SIZE, blockhash,
|
xmrig_ar2_blake2b_long(blockhash_bytes, ARGON2_BLOCK_SIZE, blockhash, ARGON2_PREHASH_SEED_LENGTH);
|
||||||
ARGON2_PREHASH_SEED_LENGTH);
|
load_block(&instance->memory[l * instance->lane_length + 0], blockhash_bytes);
|
||||||
load_block(&instance->memory[l * instance->lane_length + 0],
|
|
||||||
blockhash_bytes);
|
|
||||||
|
|
||||||
store32(blockhash + ARGON2_PREHASH_DIGEST_LENGTH, 1);
|
store32(blockhash + ARGON2_PREHASH_DIGEST_LENGTH, 1);
|
||||||
blake2b_long(blockhash_bytes, ARGON2_BLOCK_SIZE, blockhash,
|
xmrig_ar2_blake2b_long(blockhash_bytes, ARGON2_BLOCK_SIZE, blockhash, ARGON2_PREHASH_SEED_LENGTH);
|
||||||
ARGON2_PREHASH_SEED_LENGTH);
|
load_block(&instance->memory[l * instance->lane_length + 1], blockhash_bytes);
|
||||||
load_block(&instance->memory[l * instance->lane_length + 1],
|
|
||||||
blockhash_bytes);
|
|
||||||
}
|
}
|
||||||
clear_internal_memory(blockhash_bytes, ARGON2_BLOCK_SIZE);
|
xmrig_ar2_clear_internal_memory(blockhash_bytes, ARGON2_BLOCK_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void initial_hash(uint8_t *blockhash, argon2_context *context,
|
void xmrig_ar2_initial_hash(uint8_t *blockhash, argon2_context *context,
|
||||||
argon2_type type) {
|
argon2_type type) {
|
||||||
blake2b_state BlakeHash;
|
blake2b_state BlakeHash;
|
||||||
uint8_t value[sizeof(uint32_t)];
|
uint8_t value[sizeof(uint32_t)];
|
||||||
@@ -435,72 +426,70 @@ void initial_hash(uint8_t *blockhash, argon2_context *context,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
blake2b_init(&BlakeHash, ARGON2_PREHASH_DIGEST_LENGTH);
|
xmrig_ar2_blake2b_init(&BlakeHash, ARGON2_PREHASH_DIGEST_LENGTH);
|
||||||
|
|
||||||
store32(&value, context->lanes);
|
store32(&value, context->lanes);
|
||||||
blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value));
|
xmrig_ar2_blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value));
|
||||||
|
|
||||||
store32(&value, context->outlen);
|
store32(&value, context->outlen);
|
||||||
blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value));
|
xmrig_ar2_blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value));
|
||||||
|
|
||||||
store32(&value, context->m_cost);
|
store32(&value, context->m_cost);
|
||||||
blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value));
|
xmrig_ar2_blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value));
|
||||||
|
|
||||||
store32(&value, context->t_cost);
|
store32(&value, context->t_cost);
|
||||||
blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value));
|
xmrig_ar2_blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value));
|
||||||
|
|
||||||
store32(&value, context->version);
|
store32(&value, context->version);
|
||||||
blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value));
|
xmrig_ar2_blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value));
|
||||||
|
|
||||||
store32(&value, (uint32_t)type);
|
store32(&value, (uint32_t)type);
|
||||||
blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value));
|
xmrig_ar2_blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value));
|
||||||
|
|
||||||
store32(&value, context->pwdlen);
|
store32(&value, context->pwdlen);
|
||||||
blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value));
|
xmrig_ar2_blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value));
|
||||||
|
|
||||||
if (context->pwd != NULL) {
|
if (context->pwd != NULL) {
|
||||||
blake2b_update(&BlakeHash, (const uint8_t *)context->pwd,
|
xmrig_ar2_blake2b_update(&BlakeHash, (const uint8_t *)context->pwd,
|
||||||
context->pwdlen);
|
context->pwdlen);
|
||||||
|
|
||||||
if (context->flags & ARGON2_FLAG_CLEAR_PASSWORD) {
|
if (context->flags & ARGON2_FLAG_CLEAR_PASSWORD) {
|
||||||
secure_wipe_memory(context->pwd, context->pwdlen);
|
xmrig_ar2_secure_wipe_memory(context->pwd, context->pwdlen);
|
||||||
context->pwdlen = 0;
|
context->pwdlen = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
store32(&value, context->saltlen);
|
store32(&value, context->saltlen);
|
||||||
blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value));
|
xmrig_ar2_blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value));
|
||||||
|
|
||||||
if (context->salt != NULL) {
|
if (context->salt != NULL) {
|
||||||
blake2b_update(&BlakeHash, (const uint8_t *)context->salt,
|
xmrig_ar2_blake2b_update(&BlakeHash, (const uint8_t *)context->salt,
|
||||||
context->saltlen);
|
context->saltlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
store32(&value, context->secretlen);
|
store32(&value, context->secretlen);
|
||||||
blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value));
|
xmrig_ar2_blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value));
|
||||||
|
|
||||||
if (context->secret != NULL) {
|
if (context->secret != NULL) {
|
||||||
blake2b_update(&BlakeHash, (const uint8_t *)context->secret,
|
xmrig_ar2_blake2b_update(&BlakeHash, (const uint8_t *)context->secret, context->secretlen);
|
||||||
context->secretlen);
|
|
||||||
|
|
||||||
if (context->flags & ARGON2_FLAG_CLEAR_SECRET) {
|
if (context->flags & ARGON2_FLAG_CLEAR_SECRET) {
|
||||||
secure_wipe_memory(context->secret, context->secretlen);
|
xmrig_ar2_secure_wipe_memory(context->secret, context->secretlen);
|
||||||
context->secretlen = 0;
|
context->secretlen = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
store32(&value, context->adlen);
|
store32(&value, context->adlen);
|
||||||
blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value));
|
xmrig_ar2_blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value));
|
||||||
|
|
||||||
if (context->ad != NULL) {
|
if (context->ad != NULL) {
|
||||||
blake2b_update(&BlakeHash, (const uint8_t *)context->ad,
|
xmrig_ar2_blake2b_update(&BlakeHash, (const uint8_t *)context->ad, context->adlen);
|
||||||
context->adlen);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
blake2b_final(&BlakeHash, blockhash, ARGON2_PREHASH_DIGEST_LENGTH);
|
xmrig_ar2_blake2b_final(&BlakeHash, blockhash, ARGON2_PREHASH_DIGEST_LENGTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
int initialize(argon2_instance_t *instance, argon2_context *context) {
|
int xmrig_ar2_initialize(argon2_instance_t *instance, argon2_context *context) {
|
||||||
uint8_t blockhash[ARGON2_PREHASH_SEED_LENGTH];
|
uint8_t blockhash[ARGON2_PREHASH_SEED_LENGTH];
|
||||||
int result = ARGON2_OK;
|
int result = ARGON2_OK;
|
||||||
|
|
||||||
@@ -510,7 +499,7 @@ int initialize(argon2_instance_t *instance, argon2_context *context) {
|
|||||||
|
|
||||||
/* 1. Memory allocation */
|
/* 1. Memory allocation */
|
||||||
|
|
||||||
result = allocate_memory(context, instance);
|
result = xmrig_ar2_allocate_memory(context, instance);
|
||||||
if (result != ARGON2_OK) {
|
if (result != ARGON2_OK) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -519,11 +508,9 @@ int initialize(argon2_instance_t *instance, argon2_context *context) {
|
|||||||
/* H_0 + 8 extra bytes to produce the first blocks */
|
/* H_0 + 8 extra bytes to produce the first blocks */
|
||||||
/* uint8_t blockhash[ARGON2_PREHASH_SEED_LENGTH]; */
|
/* uint8_t blockhash[ARGON2_PREHASH_SEED_LENGTH]; */
|
||||||
/* Hashing all inputs */
|
/* Hashing all inputs */
|
||||||
initial_hash(blockhash, context, instance->type);
|
xmrig_ar2_initial_hash(blockhash, context, instance->type);
|
||||||
/* Zeroing 8 extra bytes */
|
/* Zeroing 8 extra bytes */
|
||||||
clear_internal_memory(blockhash + ARGON2_PREHASH_DIGEST_LENGTH,
|
xmrig_ar2_clear_internal_memory(blockhash + ARGON2_PREHASH_DIGEST_LENGTH, ARGON2_PREHASH_SEED_LENGTH - ARGON2_PREHASH_DIGEST_LENGTH);
|
||||||
ARGON2_PREHASH_SEED_LENGTH -
|
|
||||||
ARGON2_PREHASH_DIGEST_LENGTH);
|
|
||||||
|
|
||||||
if (instance->print_internals) {
|
if (instance->print_internals) {
|
||||||
initial_kat(blockhash, context, instance->type);
|
initial_kat(blockhash, context, instance->type);
|
||||||
@@ -531,9 +518,9 @@ int initialize(argon2_instance_t *instance, argon2_context *context) {
|
|||||||
|
|
||||||
/* 3. Creating first blocks, we always have at least two blocks in a slice
|
/* 3. Creating first blocks, we always have at least two blocks in a slice
|
||||||
*/
|
*/
|
||||||
fill_first_blocks(blockhash, instance);
|
xmrig_ar2_fill_first_blocks(blockhash, instance);
|
||||||
/* Clearing the hash */
|
/* Clearing the hash */
|
||||||
clear_internal_memory(blockhash, ARGON2_PREHASH_SEED_LENGTH);
|
xmrig_ar2_clear_internal_memory(blockhash, ARGON2_PREHASH_SEED_LENGTH);
|
||||||
|
|
||||||
return ARGON2_OK;
|
return ARGON2_OK;
|
||||||
}
|
}
|
||||||
|
|||||||
30
src/3rdparty/argon2/lib/core.h
vendored
30
src/3rdparty/argon2/lib/core.h
vendored
@@ -110,8 +110,7 @@ typedef struct Argon2_thread_data {
|
|||||||
* @param instance the Argon2 instance
|
* @param instance the Argon2 instance
|
||||||
* @return ARGON2_OK if memory is allocated successfully
|
* @return ARGON2_OK if memory is allocated successfully
|
||||||
*/
|
*/
|
||||||
int allocate_memory(const argon2_context *context,
|
int xmrig_ar2_allocate_memory(const argon2_context *context, argon2_instance_t *instance);
|
||||||
argon2_instance_t *instance);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Frees memory at the given pointer, uses the appropriate deallocator as
|
* Frees memory at the given pointer, uses the appropriate deallocator as
|
||||||
@@ -119,22 +118,21 @@ int allocate_memory(const argon2_context *context,
|
|||||||
* @param context argon2_context which specifies the deallocator
|
* @param context argon2_context which specifies the deallocator
|
||||||
* @param instance the Argon2 instance
|
* @param instance the Argon2 instance
|
||||||
*/
|
*/
|
||||||
void free_memory(const argon2_context *context,
|
void xmrig_ar2_free_memory(const argon2_context *context, const argon2_instance_t *instance);
|
||||||
const argon2_instance_t *instance);
|
|
||||||
|
|
||||||
/* Function that securely cleans the memory. This ignores any flags set
|
/* Function that securely cleans the memory. This ignores any flags set
|
||||||
* regarding clearing memory. Usually one just calls clear_internal_memory.
|
* regarding clearing memory. Usually one just calls clear_internal_memory.
|
||||||
* @param mem Pointer to the memory
|
* @param mem Pointer to the memory
|
||||||
* @param s Memory size in bytes
|
* @param s Memory size in bytes
|
||||||
*/
|
*/
|
||||||
void secure_wipe_memory(void *v, size_t n);
|
void xmrig_ar2_secure_wipe_memory(void *v, size_t n);
|
||||||
|
|
||||||
/* Function that securely clears the memory if FLAG_clear_internal_memory is
|
/* Function that securely clears the memory if FLAG_clear_internal_memory is
|
||||||
* set. If the flag isn't set, this function does nothing.
|
* set. If the flag isn't set, this function does nothing.
|
||||||
* @param mem Pointer to the memory
|
* @param mem Pointer to the memory
|
||||||
* @param s Memory size in bytes
|
* @param s Memory size in bytes
|
||||||
*/
|
*/
|
||||||
ARGON2_PUBLIC void clear_internal_memory(void *v, size_t n);
|
ARGON2_PUBLIC void xmrig_ar2_clear_internal_memory(void *v, size_t n);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Computes absolute position of reference block in the lane following a skewed
|
* Computes absolute position of reference block in the lane following a skewed
|
||||||
@@ -146,9 +144,7 @@ ARGON2_PUBLIC void clear_internal_memory(void *v, size_t n);
|
|||||||
* If so we can reference the current segment
|
* If so we can reference the current segment
|
||||||
* @pre All pointers must be valid
|
* @pre All pointers must be valid
|
||||||
*/
|
*/
|
||||||
uint32_t index_alpha(const argon2_instance_t *instance,
|
uint32_t xmrig_ar2_index_alpha(const argon2_instance_t *instance, const argon2_position_t *position, uint32_t pseudo_rand, int same_lane);
|
||||||
const argon2_position_t *position, uint32_t pseudo_rand,
|
|
||||||
int same_lane);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Function that validates all inputs against predefined restrictions and return
|
* Function that validates all inputs against predefined restrictions and return
|
||||||
@@ -157,7 +153,7 @@ uint32_t index_alpha(const argon2_instance_t *instance,
|
|||||||
* @return ARGON2_OK if everything is all right, otherwise one of error codes
|
* @return ARGON2_OK if everything is all right, otherwise one of error codes
|
||||||
* (all defined in <argon2.h>
|
* (all defined in <argon2.h>
|
||||||
*/
|
*/
|
||||||
int validate_inputs(const argon2_context *context);
|
int xmrig_ar2_validate_inputs(const argon2_context *context);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Hashes all the inputs into @a blockhash[PREHASH_DIGEST_LENGTH], clears
|
* Hashes all the inputs into @a blockhash[PREHASH_DIGEST_LENGTH], clears
|
||||||
@@ -169,8 +165,7 @@ int validate_inputs(const argon2_context *context);
|
|||||||
* @pre @a blockhash must have at least @a PREHASH_DIGEST_LENGTH bytes
|
* @pre @a blockhash must have at least @a PREHASH_DIGEST_LENGTH bytes
|
||||||
* allocated
|
* allocated
|
||||||
*/
|
*/
|
||||||
void initial_hash(uint8_t *blockhash, argon2_context *context,
|
void xmrig_ar2_initial_hash(uint8_t *blockhash, argon2_context *context, argon2_type type);
|
||||||
argon2_type type);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Function creates first 2 blocks per lane
|
* Function creates first 2 blocks per lane
|
||||||
@@ -178,7 +173,7 @@ void initial_hash(uint8_t *blockhash, argon2_context *context,
|
|||||||
* @param blockhash Pointer to the pre-hashing digest
|
* @param blockhash Pointer to the pre-hashing digest
|
||||||
* @pre blockhash must point to @a PREHASH_SEED_LENGTH allocated values
|
* @pre blockhash must point to @a PREHASH_SEED_LENGTH allocated values
|
||||||
*/
|
*/
|
||||||
void fill_first_blocks(uint8_t *blockhash, const argon2_instance_t *instance);
|
void xmrig_ar2_fill_first_blocks(uint8_t *blockhash, const argon2_instance_t *instance);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Function allocates memory, hashes the inputs with Blake, and creates first
|
* Function allocates memory, hashes the inputs with Blake, and creates first
|
||||||
@@ -190,7 +185,7 @@ void fill_first_blocks(uint8_t *blockhash, const argon2_instance_t *instance);
|
|||||||
* @return Zero if successful, -1 if memory failed to allocate. @context->state
|
* @return Zero if successful, -1 if memory failed to allocate. @context->state
|
||||||
* will be modified if successful.
|
* will be modified if successful.
|
||||||
*/
|
*/
|
||||||
int initialize(argon2_instance_t *instance, argon2_context *context);
|
int xmrig_ar2_initialize(argon2_instance_t *instance, argon2_context *context);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* XORing the last block of each lane, hashing it, making the tag. Deallocates
|
* XORing the last block of each lane, hashing it, making the tag. Deallocates
|
||||||
@@ -203,7 +198,7 @@ int initialize(argon2_instance_t *instance, argon2_context *context);
|
|||||||
* @pre if context->free_cbk is not NULL, it should point to a function that
|
* @pre if context->free_cbk is not NULL, it should point to a function that
|
||||||
* deallocates memory
|
* deallocates memory
|
||||||
*/
|
*/
|
||||||
void finalize(const argon2_context *context, argon2_instance_t *instance);
|
void xmrig_ar2_finalize(const argon2_context *context, argon2_instance_t *instance);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Function that fills the segment using previous segments also from other
|
* Function that fills the segment using previous segments also from other
|
||||||
@@ -212,8 +207,7 @@ void finalize(const argon2_context *context, argon2_instance_t *instance);
|
|||||||
* @param position Current position
|
* @param position Current position
|
||||||
* @pre all block pointers must be valid
|
* @pre all block pointers must be valid
|
||||||
*/
|
*/
|
||||||
void fill_segment(const argon2_instance_t *instance,
|
void xmrig_ar2_fill_segment(const argon2_instance_t *instance, argon2_position_t position);
|
||||||
argon2_position_t position);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Function that fills the entire memory t_cost times based on the first two
|
* Function that fills the entire memory t_cost times based on the first two
|
||||||
@@ -221,6 +215,6 @@ void fill_segment(const argon2_instance_t *instance,
|
|||||||
* @param instance Pointer to the current instance
|
* @param instance Pointer to the current instance
|
||||||
* @return ARGON2_OK if successful, @context->state
|
* @return ARGON2_OK if successful, @context->state
|
||||||
*/
|
*/
|
||||||
int fill_memory_blocks(argon2_instance_t *instance);
|
int xmrig_ar2_fill_memory_blocks(argon2_instance_t *instance);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
4
src/3rdparty/argon2/lib/encoding.c
vendored
4
src/3rdparty/argon2/lib/encoding.c
vendored
@@ -323,7 +323,7 @@ int decode_string(argon2_context *ctx, const char *str, argon2_type type) {
|
|||||||
ctx->flags = ARGON2_DEFAULT_FLAGS;
|
ctx->flags = ARGON2_DEFAULT_FLAGS;
|
||||||
|
|
||||||
/* On return, must have valid context */
|
/* On return, must have valid context */
|
||||||
validation_result = validate_inputs(ctx);
|
validation_result = xmrig_ar2_validate_inputs(ctx);
|
||||||
if (validation_result != ARGON2_OK) {
|
if (validation_result != ARGON2_OK) {
|
||||||
return validation_result;
|
return validation_result;
|
||||||
}
|
}
|
||||||
@@ -371,7 +371,7 @@ int encode_string(char *dst, size_t dst_len, argon2_context *ctx,
|
|||||||
} while ((void)0, 0)
|
} while ((void)0, 0)
|
||||||
|
|
||||||
const char* type_string = argon2_type2string(type, 0);
|
const char* type_string = argon2_type2string(type, 0);
|
||||||
int validation_result = validate_inputs(ctx);
|
int validation_result = xmrig_ar2_validate_inputs(ctx);
|
||||||
|
|
||||||
if (!type_string) {
|
if (!type_string) {
|
||||||
return ARGON2_ENCODING_FAIL;
|
return ARGON2_ENCODING_FAIL;
|
||||||
|
|||||||
82
src/3rdparty/argon2/lib/impl-select.c
vendored
82
src/3rdparty/argon2/lib/impl-select.c
vendored
@@ -2,79 +2,81 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "impl-select.h"
|
#include "impl-select.h"
|
||||||
|
|
||||||
#include "3rdparty/argon2.h"
|
#include "3rdparty/argon2.h"
|
||||||
|
|
||||||
#define BENCH_SAMPLES 1024
|
|
||||||
|
extern uint64_t uv_hrtime(void);
|
||||||
|
|
||||||
|
|
||||||
|
#define BENCH_SAMPLES 1024U
|
||||||
#define BENCH_MEM_BLOCKS 512
|
#define BENCH_MEM_BLOCKS 512
|
||||||
|
|
||||||
static argon2_impl selected_argon_impl = {
|
|
||||||
"default", NULL, fill_segment_default
|
#ifdef _MSC_VER
|
||||||
};
|
# define strcasecmp _stricmp
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
static argon2_impl selected_argon_impl = { "default", NULL, fill_segment_default };
|
||||||
|
|
||||||
|
|
||||||
/* the benchmark routine is not thread-safe, so we can use a global var here: */
|
/* the benchmark routine is not thread-safe, so we can use a global var here: */
|
||||||
static block memory[BENCH_MEM_BLOCKS];
|
static block memory[BENCH_MEM_BLOCKS];
|
||||||
|
|
||||||
static uint64_t benchmark_impl(const argon2_impl *impl) {
|
|
||||||
clock_t time;
|
|
||||||
unsigned int i;
|
|
||||||
uint64_t bench;
|
|
||||||
argon2_instance_t instance;
|
|
||||||
argon2_position_t pos;
|
|
||||||
|
|
||||||
|
static uint64_t benchmark_impl(const argon2_impl *impl) {
|
||||||
memset(memory, 0, sizeof(memory));
|
memset(memory, 0, sizeof(memory));
|
||||||
|
|
||||||
instance.version = ARGON2_VERSION_NUMBER;
|
argon2_instance_t instance;
|
||||||
instance.memory = memory;
|
instance.version = ARGON2_VERSION_NUMBER;
|
||||||
instance.passes = 1;
|
instance.memory = memory;
|
||||||
instance.memory_blocks = BENCH_MEM_BLOCKS;
|
instance.passes = 1;
|
||||||
|
instance.memory_blocks = BENCH_MEM_BLOCKS;
|
||||||
instance.segment_length = BENCH_MEM_BLOCKS / ARGON2_SYNC_POINTS;
|
instance.segment_length = BENCH_MEM_BLOCKS / ARGON2_SYNC_POINTS;
|
||||||
instance.lane_length = instance.segment_length * ARGON2_SYNC_POINTS;
|
instance.lane_length = instance.segment_length * ARGON2_SYNC_POINTS;
|
||||||
instance.lanes = 1;
|
instance.lanes = 1;
|
||||||
instance.threads = 1;
|
instance.threads = 1;
|
||||||
instance.type = Argon2_i;
|
instance.type = Argon2_id;
|
||||||
|
|
||||||
pos.lane = 0;
|
argon2_position_t pos;
|
||||||
pos.pass = 0;
|
pos.lane = 0;
|
||||||
pos.slice = 0;
|
pos.pass = 0;
|
||||||
pos.index = 0;
|
pos.slice = 0;
|
||||||
|
pos.index = 0;
|
||||||
|
|
||||||
/* warm-up cache: */
|
/* warm-up cache: */
|
||||||
impl->fill_segment(&instance, pos);
|
impl->fill_segment(&instance, pos);
|
||||||
|
|
||||||
/* OK, now measure: */
|
/* OK, now measure: */
|
||||||
bench = 0;
|
const uint64_t time = uv_hrtime();
|
||||||
time = clock();
|
|
||||||
for (i = 0; i < BENCH_SAMPLES; i++) {
|
for (uint32_t i = 0; i < BENCH_SAMPLES; i++) {
|
||||||
impl->fill_segment(&instance, pos);
|
impl->fill_segment(&instance, pos);
|
||||||
}
|
}
|
||||||
time = clock() - time;
|
|
||||||
bench = (uint64_t)time;
|
return uv_hrtime() - time;
|
||||||
return bench;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void argon2_select_impl()
|
void argon2_select_impl()
|
||||||
{
|
{
|
||||||
argon2_impl_list impls;
|
argon2_impl_list impls;
|
||||||
unsigned int i;
|
|
||||||
const argon2_impl *best_impl = NULL;
|
const argon2_impl *best_impl = NULL;
|
||||||
uint64_t best_bench = UINT_MAX;
|
uint64_t best_bench = UINT_MAX;
|
||||||
|
|
||||||
argon2_get_impl_list(&impls);
|
argon2_get_impl_list(&impls);
|
||||||
|
|
||||||
for (i = 0; i < impls.count; i++) {
|
for (uint32_t i = 0; i < impls.count; i++) {
|
||||||
const argon2_impl *impl = &impls.entries[i];
|
const argon2_impl *impl = &impls.entries[i];
|
||||||
uint64_t bench;
|
|
||||||
|
|
||||||
if (impl->check != NULL && !impl->check()) {
|
if (impl->check != NULL && !impl->check()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
bench = benchmark_impl(impl);
|
const uint64_t bench = benchmark_impl(impl);
|
||||||
|
|
||||||
if (bench < best_bench) {
|
if (bench < best_bench) {
|
||||||
best_bench = bench;
|
best_bench = bench;
|
||||||
best_impl = impl;
|
best_impl = impl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,11 +85,13 @@ void argon2_select_impl()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void fill_segment(const argon2_instance_t *instance, argon2_position_t position)
|
|
||||||
|
void xmrig_ar2_fill_segment(const argon2_instance_t *instance, argon2_position_t position)
|
||||||
{
|
{
|
||||||
selected_argon_impl.fill_segment(instance, position);
|
selected_argon_impl.fill_segment(instance, position);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const char *argon2_get_impl_name()
|
const char *argon2_get_impl_name()
|
||||||
{
|
{
|
||||||
return selected_argon_impl.name;
|
return selected_argon_impl.name;
|
||||||
@@ -97,14 +101,12 @@ const char *argon2_get_impl_name()
|
|||||||
int argon2_select_impl_by_name(const char *name)
|
int argon2_select_impl_by_name(const char *name)
|
||||||
{
|
{
|
||||||
argon2_impl_list impls;
|
argon2_impl_list impls;
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
argon2_get_impl_list(&impls);
|
argon2_get_impl_list(&impls);
|
||||||
|
|
||||||
for (i = 0; i < impls.count; i++) {
|
for (uint32_t i = 0; i < impls.count; i++) {
|
||||||
const argon2_impl *impl = &impls.entries[i];
|
const argon2_impl *impl = &impls.entries[i];
|
||||||
|
|
||||||
if (strcmp(impl->name, name) == 0) {
|
if (strcasecmp(impl->name, name) == 0) {
|
||||||
selected_argon_impl = *impl;
|
selected_argon_impl = *impl;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
128
src/3rdparty/http-parser/http_parser.c
vendored
128
src/3rdparty/http-parser/http_parser.c
vendored
@@ -381,7 +381,10 @@ enum header_states
|
|||||||
, h_transfer_encoding
|
, h_transfer_encoding
|
||||||
, h_upgrade
|
, h_upgrade
|
||||||
|
|
||||||
|
, h_matching_transfer_encoding_token_start
|
||||||
, h_matching_transfer_encoding_chunked
|
, h_matching_transfer_encoding_chunked
|
||||||
|
, h_matching_transfer_encoding_token
|
||||||
|
|
||||||
, h_matching_connection_token_start
|
, h_matching_connection_token_start
|
||||||
, h_matching_connection_keep_alive
|
, h_matching_connection_keep_alive
|
||||||
, h_matching_connection_close
|
, h_matching_connection_close
|
||||||
@@ -1257,9 +1260,9 @@ reexecute:
|
|||||||
|
|
||||||
switch (parser->header_state) {
|
switch (parser->header_state) {
|
||||||
case h_general: {
|
case h_general: {
|
||||||
size_t limit = data + len - p;
|
size_t left = data + len - p;
|
||||||
limit = MIN(limit, max_header_size);
|
const char* pe = p + MIN(left, max_header_size);
|
||||||
while (p+1 < data + limit && TOKEN(p[1])) {
|
while (p+1 < pe && TOKEN(p[1])) {
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1335,6 +1338,7 @@ reexecute:
|
|||||||
parser->header_state = h_general;
|
parser->header_state = h_general;
|
||||||
} else if (parser->index == sizeof(TRANSFER_ENCODING)-2) {
|
} else if (parser->index == sizeof(TRANSFER_ENCODING)-2) {
|
||||||
parser->header_state = h_transfer_encoding;
|
parser->header_state = h_transfer_encoding;
|
||||||
|
parser->flags |= F_TRANSFER_ENCODING;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -1416,10 +1420,14 @@ reexecute:
|
|||||||
if ('c' == c) {
|
if ('c' == c) {
|
||||||
parser->header_state = h_matching_transfer_encoding_chunked;
|
parser->header_state = h_matching_transfer_encoding_chunked;
|
||||||
} else {
|
} else {
|
||||||
parser->header_state = h_general;
|
parser->header_state = h_matching_transfer_encoding_token;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
/* Multi-value `Transfer-Encoding` header */
|
||||||
|
case h_matching_transfer_encoding_token_start:
|
||||||
|
break;
|
||||||
|
|
||||||
case h_content_length:
|
case h_content_length:
|
||||||
if (UNLIKELY(!IS_NUM(ch))) {
|
if (UNLIKELY(!IS_NUM(ch))) {
|
||||||
SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);
|
SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);
|
||||||
@@ -1496,28 +1504,25 @@ reexecute:
|
|||||||
|
|
||||||
switch (h_state) {
|
switch (h_state) {
|
||||||
case h_general:
|
case h_general:
|
||||||
{
|
{
|
||||||
const char* p_cr;
|
size_t left = data + len - p;
|
||||||
const char* p_lf;
|
const char* pe = p + MIN(left, max_header_size);
|
||||||
size_t limit = data + len - p;
|
|
||||||
|
|
||||||
limit = MIN(limit, max_header_size);
|
for (; p != pe; p++) {
|
||||||
|
ch = *p;
|
||||||
p_cr = (const char*) memchr(p, CR, limit);
|
if (ch == CR || ch == LF) {
|
||||||
p_lf = (const char*) memchr(p, LF, limit);
|
--p;
|
||||||
if (p_cr != NULL) {
|
break;
|
||||||
if (p_lf != NULL && p_cr >= p_lf)
|
}
|
||||||
p = p_lf;
|
if (!lenient && !IS_HEADER_CHAR(ch)) {
|
||||||
else
|
SET_ERRNO(HPE_INVALID_HEADER_TOKEN);
|
||||||
p = p_cr;
|
goto error;
|
||||||
} else if (UNLIKELY(p_lf != NULL)) {
|
}
|
||||||
p = p_lf;
|
}
|
||||||
} else {
|
if (p == data + len)
|
||||||
p = data + len;
|
--p;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
--p;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case h_connection:
|
case h_connection:
|
||||||
case h_transfer_encoding:
|
case h_transfer_encoding:
|
||||||
@@ -1566,16 +1571,41 @@ reexecute:
|
|||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
/* Transfer-Encoding: chunked */
|
/* Transfer-Encoding: chunked */
|
||||||
|
case h_matching_transfer_encoding_token_start:
|
||||||
|
/* looking for 'Transfer-Encoding: chunked' */
|
||||||
|
if ('c' == c) {
|
||||||
|
h_state = h_matching_transfer_encoding_chunked;
|
||||||
|
} else if (STRICT_TOKEN(c)) {
|
||||||
|
/* TODO(indutny): similar code below does this, but why?
|
||||||
|
* At the very least it seems to be inconsistent given that
|
||||||
|
* h_matching_transfer_encoding_token does not check for
|
||||||
|
* `STRICT_TOKEN`
|
||||||
|
*/
|
||||||
|
h_state = h_matching_transfer_encoding_token;
|
||||||
|
} else if (c == ' ' || c == '\t') {
|
||||||
|
/* Skip lws */
|
||||||
|
} else {
|
||||||
|
h_state = h_general;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case h_matching_transfer_encoding_chunked:
|
case h_matching_transfer_encoding_chunked:
|
||||||
parser->index++;
|
parser->index++;
|
||||||
if (parser->index > sizeof(CHUNKED)-1
|
if (parser->index > sizeof(CHUNKED)-1
|
||||||
|| c != CHUNKED[parser->index]) {
|
|| c != CHUNKED[parser->index]) {
|
||||||
h_state = h_general;
|
h_state = h_matching_transfer_encoding_token;
|
||||||
} else if (parser->index == sizeof(CHUNKED)-2) {
|
} else if (parser->index == sizeof(CHUNKED)-2) {
|
||||||
h_state = h_transfer_encoding_chunked;
|
h_state = h_transfer_encoding_chunked;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case h_matching_transfer_encoding_token:
|
||||||
|
if (ch == ',') {
|
||||||
|
h_state = h_matching_transfer_encoding_token_start;
|
||||||
|
parser->index = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case h_matching_connection_token_start:
|
case h_matching_connection_token_start:
|
||||||
/* looking for 'Connection: keep-alive' */
|
/* looking for 'Connection: keep-alive' */
|
||||||
if (c == 'k') {
|
if (c == 'k') {
|
||||||
@@ -1634,7 +1664,7 @@ reexecute:
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case h_transfer_encoding_chunked:
|
case h_transfer_encoding_chunked:
|
||||||
if (ch != ' ') h_state = h_general;
|
if (ch != ' ') h_state = h_matching_transfer_encoding_token;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case h_connection_keep_alive:
|
case h_connection_keep_alive:
|
||||||
@@ -1768,12 +1798,17 @@ reexecute:
|
|||||||
REEXECUTE();
|
REEXECUTE();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Cannot use chunked encoding and a content-length header together
|
/* Cannot us transfer-encoding and a content-length header together
|
||||||
per the HTTP specification. */
|
per the HTTP specification. (RFC 7230 Section 3.3.3) */
|
||||||
if ((parser->flags & F_CHUNKED) &&
|
if ((parser->flags & F_TRANSFER_ENCODING) &&
|
||||||
(parser->flags & F_CONTENTLENGTH)) {
|
(parser->flags & F_CONTENTLENGTH)) {
|
||||||
SET_ERRNO(HPE_UNEXPECTED_CONTENT_LENGTH);
|
/* Allow it for lenient parsing as long as `Transfer-Encoding` is
|
||||||
goto error;
|
* not `chunked`
|
||||||
|
*/
|
||||||
|
if (!lenient || (parser->flags & F_CHUNKED)) {
|
||||||
|
SET_ERRNO(HPE_UNEXPECTED_CONTENT_LENGTH);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
UPDATE_STATE(s_headers_done);
|
UPDATE_STATE(s_headers_done);
|
||||||
@@ -1848,8 +1883,31 @@ reexecute:
|
|||||||
UPDATE_STATE(NEW_MESSAGE());
|
UPDATE_STATE(NEW_MESSAGE());
|
||||||
CALLBACK_NOTIFY(message_complete);
|
CALLBACK_NOTIFY(message_complete);
|
||||||
} else if (parser->flags & F_CHUNKED) {
|
} else if (parser->flags & F_CHUNKED) {
|
||||||
/* chunked encoding - ignore Content-Length header */
|
/* chunked encoding - ignore Content-Length header,
|
||||||
|
* prepare for a chunk */
|
||||||
UPDATE_STATE(s_chunk_size_start);
|
UPDATE_STATE(s_chunk_size_start);
|
||||||
|
} else if (parser->flags & F_TRANSFER_ENCODING) {
|
||||||
|
if (parser->type == HTTP_REQUEST && !lenient) {
|
||||||
|
/* RFC 7230 3.3.3 */
|
||||||
|
|
||||||
|
/* If a Transfer-Encoding header field
|
||||||
|
* is present in a request and the chunked transfer coding is not
|
||||||
|
* the final encoding, the message body length cannot be determined
|
||||||
|
* reliably; the server MUST respond with the 400 (Bad Request)
|
||||||
|
* status code and then close the connection.
|
||||||
|
*/
|
||||||
|
SET_ERRNO(HPE_INVALID_TRANSFER_ENCODING);
|
||||||
|
RETURN(p - data); /* Error */
|
||||||
|
} else {
|
||||||
|
/* RFC 7230 3.3.3 */
|
||||||
|
|
||||||
|
/* If a Transfer-Encoding header field is present in a response and
|
||||||
|
* the chunked transfer coding is not the final encoding, the
|
||||||
|
* message body length is determined by reading the connection until
|
||||||
|
* it is closed by the server.
|
||||||
|
*/
|
||||||
|
UPDATE_STATE(s_body_identity_eof);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (parser->content_length == 0) {
|
if (parser->content_length == 0) {
|
||||||
/* Content-Length header given but zero: Content-Length: 0\r\n */
|
/* Content-Length header given but zero: Content-Length: 0\r\n */
|
||||||
@@ -2103,6 +2161,12 @@ http_message_needs_eof (const http_parser *parser)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* RFC 7230 3.3.3, see `s_headers_almost_done` */
|
||||||
|
if ((parser->flags & F_TRANSFER_ENCODING) &&
|
||||||
|
(parser->flags & F_CHUNKED) == 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
if ((parser->flags & F_CHUNKED) || parser->content_length != ULLONG_MAX) {
|
if ((parser->flags & F_CHUNKED) || parser->content_length != ULLONG_MAX) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
7
src/3rdparty/http-parser/http_parser.h
vendored
7
src/3rdparty/http-parser/http_parser.h
vendored
@@ -27,7 +27,7 @@ extern "C" {
|
|||||||
/* Also update SONAME in the Makefile whenever you change these. */
|
/* Also update SONAME in the Makefile whenever you change these. */
|
||||||
#define HTTP_PARSER_VERSION_MAJOR 2
|
#define HTTP_PARSER_VERSION_MAJOR 2
|
||||||
#define HTTP_PARSER_VERSION_MINOR 9
|
#define HTTP_PARSER_VERSION_MINOR 9
|
||||||
#define HTTP_PARSER_VERSION_PATCH 0
|
#define HTTP_PARSER_VERSION_PATCH 3
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#if defined(_WIN32) && !defined(__MINGW32__) && \
|
#if defined(_WIN32) && !defined(__MINGW32__) && \
|
||||||
@@ -225,6 +225,7 @@ enum flags
|
|||||||
, F_UPGRADE = 1 << 5
|
, F_UPGRADE = 1 << 5
|
||||||
, F_SKIPBODY = 1 << 6
|
, F_SKIPBODY = 1 << 6
|
||||||
, F_CONTENTLENGTH = 1 << 7
|
, F_CONTENTLENGTH = 1 << 7
|
||||||
|
, F_TRANSFER_ENCODING = 1 << 8
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -271,6 +272,8 @@ enum flags
|
|||||||
"unexpected content-length header") \
|
"unexpected content-length header") \
|
||||||
XX(INVALID_CHUNK_SIZE, \
|
XX(INVALID_CHUNK_SIZE, \
|
||||||
"invalid character in chunk size header") \
|
"invalid character in chunk size header") \
|
||||||
|
XX(INVALID_TRANSFER_ENCODING, \
|
||||||
|
"request has invalid transfer-encoding") \
|
||||||
XX(INVALID_CONSTANT, "invalid constant string") \
|
XX(INVALID_CONSTANT, "invalid constant string") \
|
||||||
XX(INVALID_INTERNAL_STATE, "encountered unexpected internal state")\
|
XX(INVALID_INTERNAL_STATE, "encountered unexpected internal state")\
|
||||||
XX(STRICT, "strict mode assertion failed") \
|
XX(STRICT, "strict mode assertion failed") \
|
||||||
@@ -293,11 +296,11 @@ enum http_errno {
|
|||||||
struct http_parser {
|
struct http_parser {
|
||||||
/** PRIVATE **/
|
/** PRIVATE **/
|
||||||
unsigned int type : 2; /* enum http_parser_type */
|
unsigned int type : 2; /* enum http_parser_type */
|
||||||
unsigned int flags : 8; /* F_* values from 'flags' enum; semi-public */
|
|
||||||
unsigned int state : 7; /* enum state from http_parser.c */
|
unsigned int state : 7; /* enum state from http_parser.c */
|
||||||
unsigned int header_state : 7; /* enum header_state from http_parser.c */
|
unsigned int header_state : 7; /* enum header_state from http_parser.c */
|
||||||
unsigned int index : 7; /* index into current matcher */
|
unsigned int index : 7; /* index into current matcher */
|
||||||
unsigned int lenient_http_headers : 1;
|
unsigned int lenient_http_headers : 1;
|
||||||
|
unsigned int flags : 16; /* F_* values from 'flags' enum; semi-public */
|
||||||
|
|
||||||
uint32_t nread; /* # bytes read in various scenarios */
|
uint32_t nread; /* # bytes read in various scenarios */
|
||||||
uint64_t content_length; /* # bytes in body (0 if no Content-Length header) */
|
uint64_t content_length; /* # bytes in body (0 if no Content-Length header) */
|
||||||
|
|||||||
23
src/3rdparty/hwloc/NEWS
vendored
23
src/3rdparty/hwloc/NEWS
vendored
@@ -1,5 +1,5 @@
|
|||||||
Copyright © 2009 CNRS
|
Copyright © 2009 CNRS
|
||||||
Copyright © 2009-2019 Inria. All rights reserved.
|
Copyright © 2009-2020 Inria. All rights reserved.
|
||||||
Copyright © 2009-2013 Université Bordeaux
|
Copyright © 2009-2013 Université Bordeaux
|
||||||
Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
||||||
|
|
||||||
@@ -16,6 +16,27 @@ bug fixes (and other actions) for each version of hwloc since version
|
|||||||
0.9.
|
0.9.
|
||||||
|
|
||||||
|
|
||||||
|
Version 2.2.0
|
||||||
|
-------------
|
||||||
|
* API
|
||||||
|
+ Add hwloc_bitmap_singlify_by_core() to remove SMT from a given cpuset,
|
||||||
|
thanks to Florian Reynier for the suggestion.
|
||||||
|
+ Add --enable-32bits-pci-domain to stop ignoring PCI devices with domain
|
||||||
|
>16bits (e.g. 10000:02:03.4). Enabling this option breaks the library ABI.
|
||||||
|
Thanks to Dylan Simon for the help.
|
||||||
|
* Backends
|
||||||
|
+ Add support for Linux cgroups v2.
|
||||||
|
+ Add NUMA support for FreeBSD.
|
||||||
|
+ Add get_last_cpu_location support for FreeBSD.
|
||||||
|
+ Remove support for Intel Xeon Phi (MIC, Knights Corner) co-processors.
|
||||||
|
* Tools
|
||||||
|
+ Add --uid to filter the hwloc-ps output by uid on Linux.
|
||||||
|
+ Add a GRAPHICAL OUTPUT section in the manpage of lstopo.
|
||||||
|
* Misc
|
||||||
|
+ Use the native dlopen instead of libltdl,
|
||||||
|
unless --disable-plugin-dlopen is passed at configure time.
|
||||||
|
|
||||||
|
|
||||||
Version 2.1.0
|
Version 2.1.0
|
||||||
-------------
|
-------------
|
||||||
* API
|
* API
|
||||||
|
|||||||
6
src/3rdparty/hwloc/VERSION
vendored
6
src/3rdparty/hwloc/VERSION
vendored
@@ -8,7 +8,7 @@
|
|||||||
# Please update HWLOC_VERSION* in contrib/windows/hwloc_config.h too.
|
# Please update HWLOC_VERSION* in contrib/windows/hwloc_config.h too.
|
||||||
|
|
||||||
major=2
|
major=2
|
||||||
minor=1
|
minor=2
|
||||||
release=0
|
release=0
|
||||||
|
|
||||||
# greek is used for alpha or beta release tags. If it is non-empty,
|
# greek is used for alpha or beta release tags. If it is non-empty,
|
||||||
@@ -22,7 +22,7 @@ greek=
|
|||||||
|
|
||||||
# The date when this release was created
|
# The date when this release was created
|
||||||
|
|
||||||
date="Sep 30, 2019"
|
date="Mar 30, 2020"
|
||||||
|
|
||||||
# If snapshot=1, then use the value from snapshot_version as the
|
# If snapshot=1, then use the value from snapshot_version as the
|
||||||
# entire hwloc version (i.e., ignore major, minor, release, and
|
# entire hwloc version (i.e., ignore major, minor, release, and
|
||||||
@@ -41,7 +41,7 @@ snapshot_version=${major}.${minor}.${release}${greek}-git
|
|||||||
# 2. Version numbers are described in the Libtool current:revision:age
|
# 2. Version numbers are described in the Libtool current:revision:age
|
||||||
# format.
|
# format.
|
||||||
|
|
||||||
libhwloc_so_version=16:0:1
|
libhwloc_so_version=17:0:2
|
||||||
libnetloc_so_version=0:0:0
|
libnetloc_so_version=0:0:0
|
||||||
|
|
||||||
# Please also update the <TargetName> lines in contrib/windows/libhwloc.vcxproj
|
# Please also update the <TargetName> lines in contrib/windows/libhwloc.vcxproj
|
||||||
|
|||||||
35
src/3rdparty/hwloc/include/hwloc.h
vendored
35
src/3rdparty/hwloc/include/hwloc.h
vendored
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright © 2009 CNRS
|
* Copyright © 2009 CNRS
|
||||||
* Copyright © 2009-2019 Inria. All rights reserved.
|
* Copyright © 2009-2020 Inria. All rights reserved.
|
||||||
* Copyright © 2009-2012 Université Bordeaux
|
* Copyright © 2009-2012 Université Bordeaux
|
||||||
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
||||||
* See COPYING in top-level directory.
|
* See COPYING in top-level directory.
|
||||||
@@ -173,8 +173,12 @@ typedef hwloc_const_bitmap_t hwloc_const_nodeset_t;
|
|||||||
* may be defined in the future! If you need to compare types, use
|
* may be defined in the future! If you need to compare types, use
|
||||||
* hwloc_compare_types() instead.
|
* hwloc_compare_types() instead.
|
||||||
*/
|
*/
|
||||||
#define HWLOC_OBJ_TYPE_MIN HWLOC_OBJ_MACHINE /**< \private Sentinel value */
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|
||||||
|
/** \cond */
|
||||||
|
#define HWLOC_OBJ_TYPE_MIN HWLOC_OBJ_MACHINE /* Sentinel value */
|
||||||
|
/** \endcond */
|
||||||
|
|
||||||
HWLOC_OBJ_MACHINE, /**< \brief Machine.
|
HWLOC_OBJ_MACHINE, /**< \brief Machine.
|
||||||
* A set of processors and memory with cache
|
* A set of processors and memory with cache
|
||||||
* coherency.
|
* coherency.
|
||||||
@@ -251,7 +255,7 @@ typedef enum {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
HWLOC_OBJ_BRIDGE, /**< \brief Bridge (filtered out by default).
|
HWLOC_OBJ_BRIDGE, /**< \brief Bridge (filtered out by default).
|
||||||
* Any bridge that connects the host or an I/O bus,
|
* Any bridge (or PCI switch) that connects the host or an I/O bus,
|
||||||
* to another I/O bus.
|
* to another I/O bus.
|
||||||
* They are not added to the topology unless I/O discovery
|
* They are not added to the topology unless I/O discovery
|
||||||
* is enabled with hwloc_topology_set_flags().
|
* is enabled with hwloc_topology_set_flags().
|
||||||
@@ -360,9 +364,8 @@ typedef enum hwloc_obj_osdev_type_e {
|
|||||||
*/
|
*/
|
||||||
HWLOC_DECLSPEC int hwloc_compare_types (hwloc_obj_type_t type1, hwloc_obj_type_t type2) __hwloc_attribute_const;
|
HWLOC_DECLSPEC int hwloc_compare_types (hwloc_obj_type_t type1, hwloc_obj_type_t type2) __hwloc_attribute_const;
|
||||||
|
|
||||||
enum hwloc_compare_types_e {
|
/** \brief Value returned by hwloc_compare_types() when types can not be compared. \hideinitializer */
|
||||||
HWLOC_TYPE_UNORDERED = INT_MAX /**< \brief Value returned by hwloc_compare_types() when types can not be compared. \hideinitializer */
|
#define HWLOC_TYPE_UNORDERED INT_MAX
|
||||||
};
|
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
@@ -614,7 +617,11 @@ union hwloc_obj_attr_u {
|
|||||||
} group;
|
} group;
|
||||||
/** \brief PCI Device specific Object Attributes */
|
/** \brief PCI Device specific Object Attributes */
|
||||||
struct hwloc_pcidev_attr_s {
|
struct hwloc_pcidev_attr_s {
|
||||||
unsigned short domain;
|
#ifndef HWLOC_HAVE_32BITS_PCI_DOMAIN
|
||||||
|
unsigned short domain; /* Only 16bits PCI domains are supported by default */
|
||||||
|
#else
|
||||||
|
unsigned int domain; /* 32bits PCI domain support break the library ABI, hence it's disabled by default */
|
||||||
|
#endif
|
||||||
unsigned char bus, dev, func;
|
unsigned char bus, dev, func;
|
||||||
unsigned short class_id;
|
unsigned short class_id;
|
||||||
unsigned short vendor_id, device_id, subvendor_id, subdevice_id;
|
unsigned short vendor_id, device_id, subvendor_id, subdevice_id;
|
||||||
@@ -629,7 +636,11 @@ union hwloc_obj_attr_u {
|
|||||||
hwloc_obj_bridge_type_t upstream_type;
|
hwloc_obj_bridge_type_t upstream_type;
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
unsigned short domain;
|
#ifndef HWLOC_HAVE_32BITS_PCI_DOMAIN
|
||||||
|
unsigned short domain; /* Only 16bits PCI domains are supported by default */
|
||||||
|
#else
|
||||||
|
unsigned int domain; /* 32bits PCI domain support break the library ABI, hence it's disabled by default */
|
||||||
|
#endif
|
||||||
unsigned char secondary_bus, subordinate_bus;
|
unsigned char secondary_bus, subordinate_bus;
|
||||||
} pci;
|
} pci;
|
||||||
} downstream;
|
} downstream;
|
||||||
@@ -859,7 +870,8 @@ hwloc_get_type_or_above_depth (hwloc_topology_t topology, hwloc_obj_type_t type)
|
|||||||
|
|
||||||
/** \brief Returns the type of objects at depth \p depth.
|
/** \brief Returns the type of objects at depth \p depth.
|
||||||
*
|
*
|
||||||
* \p depth should between 0 and hwloc_topology_get_depth()-1.
|
* \p depth should between 0 and hwloc_topology_get_depth()-1,
|
||||||
|
* or a virtual depth such as ::HWLOC_TYPE_DEPTH_NUMANODE.
|
||||||
*
|
*
|
||||||
* \return (hwloc_obj_type_t)-1 if depth \p depth does not exist.
|
* \return (hwloc_obj_type_t)-1 if depth \p depth does not exist.
|
||||||
*/
|
*/
|
||||||
@@ -1355,7 +1367,7 @@ HWLOC_DECLSPEC int hwloc_get_proc_last_cpu_location(hwloc_topology_t topology, h
|
|||||||
typedef enum {
|
typedef enum {
|
||||||
/** \brief Reset the memory allocation policy to the system default.
|
/** \brief Reset the memory allocation policy to the system default.
|
||||||
* Depending on the operating system, this may correspond to
|
* Depending on the operating system, this may correspond to
|
||||||
* ::HWLOC_MEMBIND_FIRSTTOUCH (Linux),
|
* ::HWLOC_MEMBIND_FIRSTTOUCH (Linux, FreeBSD),
|
||||||
* or ::HWLOC_MEMBIND_BIND (AIX, HP-UX, Solaris, Windows).
|
* or ::HWLOC_MEMBIND_BIND (AIX, HP-UX, Solaris, Windows).
|
||||||
* This policy is never returned by get membind functions.
|
* This policy is never returned by get membind functions.
|
||||||
* The nodeset argument is ignored.
|
* The nodeset argument is ignored.
|
||||||
@@ -2169,13 +2181,14 @@ HWLOC_DECLSPEC void * hwloc_topology_get_userdata(hwloc_topology_t topology);
|
|||||||
enum hwloc_restrict_flags_e {
|
enum hwloc_restrict_flags_e {
|
||||||
/** \brief Remove all objects that became CPU-less.
|
/** \brief Remove all objects that became CPU-less.
|
||||||
* By default, only objects that contain no PU and no memory are removed.
|
* By default, only objects that contain no PU and no memory are removed.
|
||||||
|
* This flag may not be used with ::HWLOC_RESTRICT_FLAG_BYNODESET.
|
||||||
* \hideinitializer
|
* \hideinitializer
|
||||||
*/
|
*/
|
||||||
HWLOC_RESTRICT_FLAG_REMOVE_CPULESS = (1UL<<0),
|
HWLOC_RESTRICT_FLAG_REMOVE_CPULESS = (1UL<<0),
|
||||||
|
|
||||||
/** \brief Restrict by nodeset instead of CPU set.
|
/** \brief Restrict by nodeset instead of CPU set.
|
||||||
* Only keep objects whose nodeset is included or partially included in the given set.
|
* Only keep objects whose nodeset is included or partially included in the given set.
|
||||||
* This flag may not be used with ::HWLOC_RESTRICT_FLAG_BYNODESET.
|
* This flag may not be used with ::HWLOC_RESTRICT_FLAG_REMOVE_CPULESS.
|
||||||
*/
|
*/
|
||||||
HWLOC_RESTRICT_FLAG_BYNODESET = (1UL<<3),
|
HWLOC_RESTRICT_FLAG_BYNODESET = (1UL<<3),
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright © 2009 CNRS
|
* Copyright © 2009 CNRS
|
||||||
* Copyright © 2009-2018 Inria. All rights reserved.
|
* Copyright © 2009-2019 Inria. All rights reserved.
|
||||||
* Copyright © 2009-2012 Université Bordeaux
|
* Copyright © 2009-2012 Université Bordeaux
|
||||||
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
||||||
* See COPYING in top-level directory.
|
* See COPYING in top-level directory.
|
||||||
@@ -11,9 +11,9 @@
|
|||||||
#ifndef HWLOC_CONFIG_H
|
#ifndef HWLOC_CONFIG_H
|
||||||
#define HWLOC_CONFIG_H
|
#define HWLOC_CONFIG_H
|
||||||
|
|
||||||
#define HWLOC_VERSION "2.1.0"
|
#define HWLOC_VERSION "2.2.0"
|
||||||
#define HWLOC_VERSION_MAJOR 2
|
#define HWLOC_VERSION_MAJOR 2
|
||||||
#define HWLOC_VERSION_MINOR 1
|
#define HWLOC_VERSION_MINOR 2
|
||||||
#define HWLOC_VERSION_RELEASE 0
|
#define HWLOC_VERSION_RELEASE 0
|
||||||
#define HWLOC_VERSION_GREEK ""
|
#define HWLOC_VERSION_GREEK ""
|
||||||
|
|
||||||
|
|||||||
46
src/3rdparty/hwloc/include/hwloc/helper.h
vendored
46
src/3rdparty/hwloc/include/hwloc/helper.h
vendored
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright © 2009 CNRS
|
* Copyright © 2009 CNRS
|
||||||
* Copyright © 2009-2019 Inria. All rights reserved.
|
* Copyright © 2009-2020 Inria. All rights reserved.
|
||||||
* Copyright © 2009-2012 Université Bordeaux
|
* Copyright © 2009-2012 Université Bordeaux
|
||||||
* Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
|
* Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
|
||||||
* See COPYING in top-level directory.
|
* See COPYING in top-level directory.
|
||||||
@@ -672,6 +672,24 @@ hwloc_get_shared_cache_covering_obj (hwloc_topology_t topology __hwloc_attribute
|
|||||||
* package has fewer caches than its peers.
|
* package has fewer caches than its peers.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/** \brief Remove simultaneous multithreading PUs from a CPU set.
|
||||||
|
*
|
||||||
|
* For each core in \p topology, if \p cpuset contains some PUs of that core,
|
||||||
|
* modify \p cpuset to only keep a single PU for that core.
|
||||||
|
*
|
||||||
|
* \p which specifies which PU will be kept.
|
||||||
|
* PU are considered in physical index order.
|
||||||
|
* If 0, for each core, the function keeps the first PU that was originally set in \p cpuset.
|
||||||
|
*
|
||||||
|
* If \p which is larger than the number of PUs in a core there were originally set in \p cpuset,
|
||||||
|
* no PU is kept for that core.
|
||||||
|
*
|
||||||
|
* \note PUs that are not below a Core object are ignored
|
||||||
|
* (for instance if the topology does not contain any Core object).
|
||||||
|
* None of them is removed from \p cpuset.
|
||||||
|
*/
|
||||||
|
HWLOC_DECLSPEC int hwloc_bitmap_singlify_per_core(hwloc_topology_t topology, hwloc_bitmap_t cpuset, unsigned which);
|
||||||
|
|
||||||
/** \brief Returns the object of type ::HWLOC_OBJ_PU with \p os_index.
|
/** \brief Returns the object of type ::HWLOC_OBJ_PU with \p os_index.
|
||||||
*
|
*
|
||||||
* This function is useful for converting a CPU set into the PU
|
* This function is useful for converting a CPU set into the PU
|
||||||
@@ -998,15 +1016,16 @@ hwloc_topology_get_allowed_nodeset(hwloc_topology_t topology) __hwloc_attribute_
|
|||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \brief Convert a CPU set into a NUMA node set and handle non-NUMA cases
|
/** \brief Convert a CPU set into a NUMA node set
|
||||||
|
*
|
||||||
|
* For each PU included in the input \p _cpuset, set the corresponding
|
||||||
|
* local NUMA node(s) in the output \p nodeset.
|
||||||
*
|
*
|
||||||
* If some NUMA nodes have no CPUs at all, this function never sets their
|
* If some NUMA nodes have no CPUs at all, this function never sets their
|
||||||
* indexes in the output node set, even if a full CPU set is given in input.
|
* indexes in the output node set, even if a full CPU set is given in input.
|
||||||
*
|
*
|
||||||
* If the topology contains no NUMA nodes, the machine is considered
|
* Hence the entire topology CPU set is converted into the set of all nodes
|
||||||
* as a single memory node, and the following behavior is used:
|
* that have some local CPUs.
|
||||||
* If \p cpuset is empty, \p nodeset will be emptied as well.
|
|
||||||
* Otherwise \p nodeset will be entirely filled.
|
|
||||||
*/
|
*/
|
||||||
static __hwloc_inline int
|
static __hwloc_inline int
|
||||||
hwloc_cpuset_to_nodeset(hwloc_topology_t topology, hwloc_const_cpuset_t _cpuset, hwloc_nodeset_t nodeset)
|
hwloc_cpuset_to_nodeset(hwloc_topology_t topology, hwloc_const_cpuset_t _cpuset, hwloc_nodeset_t nodeset)
|
||||||
@@ -1021,13 +1040,16 @@ hwloc_cpuset_to_nodeset(hwloc_topology_t topology, hwloc_const_cpuset_t _cpuset,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \brief Convert a NUMA node set into a CPU set and handle non-NUMA cases
|
/** \brief Convert a NUMA node set into a CPU set
|
||||||
*
|
*
|
||||||
* If the topology contains no NUMA nodes, the machine is considered
|
* For each NUMA node included in the input \p nodeset, set the corresponding
|
||||||
* as a single memory node, and the following behavior is used:
|
* local PUs in the output \p _cpuset.
|
||||||
* If \p nodeset is empty, \p cpuset will be emptied as well.
|
*
|
||||||
* Otherwise \p cpuset will be entirely filled.
|
* If some CPUs have no local NUMA nodes, this function never sets their
|
||||||
* This is useful for manipulating memory binding sets.
|
* indexes in the output CPU set, even if a full node set is given in input.
|
||||||
|
*
|
||||||
|
* Hence the entire topology node set is converted into the set of all CPUs
|
||||||
|
* that have some local NUMA nodes.
|
||||||
*/
|
*/
|
||||||
static __hwloc_inline int
|
static __hwloc_inline int
|
||||||
hwloc_cpuset_from_nodeset(hwloc_topology_t topology, hwloc_cpuset_t _cpuset, hwloc_const_nodeset_t nodeset)
|
hwloc_cpuset_from_nodeset(hwloc_topology_t topology, hwloc_cpuset_t _cpuset, hwloc_const_nodeset_t nodeset)
|
||||||
|
|||||||
13
src/3rdparty/hwloc/include/hwloc/opencl.h
vendored
13
src/3rdparty/hwloc/include/hwloc/opencl.h
vendored
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright © 2012-2018 Inria. All rights reserved.
|
* Copyright © 2012-2019 Inria. All rights reserved.
|
||||||
* Copyright © 2013, 2018 Université Bordeaux. All right reserved.
|
* Copyright © 2013, 2018 Université Bordeaux. All right reserved.
|
||||||
* See COPYING in top-level directory.
|
* See COPYING in top-level directory.
|
||||||
*/
|
*/
|
||||||
@@ -52,6 +52,7 @@ typedef union {
|
|||||||
/* needs "cl_nv_device_attribute_query" device extension, but not strictly required for clGetDeviceInfo() */
|
/* needs "cl_nv_device_attribute_query" device extension, but not strictly required for clGetDeviceInfo() */
|
||||||
#define HWLOC_CL_DEVICE_PCI_BUS_ID_NV 0x4008
|
#define HWLOC_CL_DEVICE_PCI_BUS_ID_NV 0x4008
|
||||||
#define HWLOC_CL_DEVICE_PCI_SLOT_ID_NV 0x4009
|
#define HWLOC_CL_DEVICE_PCI_SLOT_ID_NV 0x4009
|
||||||
|
#define HWLOC_CL_DEVICE_PCI_DOMAIN_ID_NV 0x400A
|
||||||
|
|
||||||
|
|
||||||
/** \defgroup hwlocality_opencl Interoperability with OpenCL
|
/** \defgroup hwlocality_opencl Interoperability with OpenCL
|
||||||
@@ -74,7 +75,7 @@ hwloc_opencl_get_device_pci_busid(cl_device_id device,
|
|||||||
unsigned *domain, unsigned *bus, unsigned *dev, unsigned *func)
|
unsigned *domain, unsigned *bus, unsigned *dev, unsigned *func)
|
||||||
{
|
{
|
||||||
hwloc_cl_device_topology_amd amdtopo;
|
hwloc_cl_device_topology_amd amdtopo;
|
||||||
cl_uint nvbus, nvslot;
|
cl_uint nvbus, nvslot, nvdomain;
|
||||||
cl_int clret;
|
cl_int clret;
|
||||||
|
|
||||||
clret = clGetDeviceInfo(device, HWLOC_CL_DEVICE_TOPOLOGY_AMD, sizeof(amdtopo), &amdtopo, NULL);
|
clret = clGetDeviceInfo(device, HWLOC_CL_DEVICE_TOPOLOGY_AMD, sizeof(amdtopo), &amdtopo, NULL);
|
||||||
@@ -91,8 +92,12 @@ hwloc_opencl_get_device_pci_busid(cl_device_id device,
|
|||||||
if (CL_SUCCESS == clret) {
|
if (CL_SUCCESS == clret) {
|
||||||
clret = clGetDeviceInfo(device, HWLOC_CL_DEVICE_PCI_SLOT_ID_NV, sizeof(nvslot), &nvslot, NULL);
|
clret = clGetDeviceInfo(device, HWLOC_CL_DEVICE_PCI_SLOT_ID_NV, sizeof(nvslot), &nvslot, NULL);
|
||||||
if (CL_SUCCESS == clret) {
|
if (CL_SUCCESS == clret) {
|
||||||
/* FIXME: PCI bus only uses 8bit, assume nvidia hardcodes the domain in higher bits */
|
clret = clGetDeviceInfo(device, HWLOC_CL_DEVICE_PCI_DOMAIN_ID_NV, sizeof(nvdomain), &nvdomain, NULL);
|
||||||
*domain = nvbus >> 8;
|
if (CL_SUCCESS == clret) { /* available since CUDA 10.2 */
|
||||||
|
*domain = nvdomain;
|
||||||
|
} else {
|
||||||
|
*domain = 0;
|
||||||
|
}
|
||||||
*bus = nvbus & 0xff;
|
*bus = nvbus & 0xff;
|
||||||
/* non-documented but used in many other projects */
|
/* non-documented but used in many other projects */
|
||||||
*dev = nvslot >> 3;
|
*dev = nvslot >> 3;
|
||||||
|
|||||||
18
src/3rdparty/hwloc/include/hwloc/plugins.h
vendored
18
src/3rdparty/hwloc/include/hwloc/plugins.h
vendored
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright © 2013-2019 Inria. All rights reserved.
|
* Copyright © 2013-2020 Inria. All rights reserved.
|
||||||
* Copyright © 2016 Cisco Systems, Inc. All rights reserved.
|
* Copyright © 2016 Cisco Systems, Inc. All rights reserved.
|
||||||
* See COPYING in top-level directory.
|
* See COPYING in top-level directory.
|
||||||
*/
|
*/
|
||||||
@@ -17,7 +17,11 @@ struct hwloc_backend;
|
|||||||
|
|
||||||
#ifdef HWLOC_INSIDE_PLUGIN
|
#ifdef HWLOC_INSIDE_PLUGIN
|
||||||
/* needed for hwloc_plugin_check_namespace() */
|
/* needed for hwloc_plugin_check_namespace() */
|
||||||
|
#ifdef HWLOC_HAVE_LTDL
|
||||||
#include <ltdl.h>
|
#include <ltdl.h>
|
||||||
|
#else
|
||||||
|
#include <dlfcn.h>
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -418,14 +422,22 @@ static __hwloc_inline int
|
|||||||
hwloc_plugin_check_namespace(const char *pluginname __hwloc_attribute_unused, const char *symbol __hwloc_attribute_unused)
|
hwloc_plugin_check_namespace(const char *pluginname __hwloc_attribute_unused, const char *symbol __hwloc_attribute_unused)
|
||||||
{
|
{
|
||||||
#ifdef HWLOC_INSIDE_PLUGIN
|
#ifdef HWLOC_INSIDE_PLUGIN
|
||||||
lt_dlhandle handle;
|
|
||||||
void *sym;
|
void *sym;
|
||||||
handle = lt_dlopen(NULL);
|
#ifdef HWLOC_HAVE_LTDL
|
||||||
|
lt_dlhandle handle = lt_dlopen(NULL);
|
||||||
|
#else
|
||||||
|
void *handle = dlopen(NULL, RTLD_NOW|RTLD_LOCAL);
|
||||||
|
#endif
|
||||||
if (!handle)
|
if (!handle)
|
||||||
/* cannot check, assume things will work */
|
/* cannot check, assume things will work */
|
||||||
return 0;
|
return 0;
|
||||||
|
#ifdef HWLOC_HAVE_LTDL
|
||||||
sym = lt_dlsym(handle, symbol);
|
sym = lt_dlsym(handle, symbol);
|
||||||
lt_dlclose(handle);
|
lt_dlclose(handle);
|
||||||
|
#else
|
||||||
|
sym = dlsym(handle, symbol);
|
||||||
|
dlclose(handle);
|
||||||
|
#endif
|
||||||
if (!sym) {
|
if (!sym) {
|
||||||
static int verboseenv_checked = 0;
|
static int verboseenv_checked = 0;
|
||||||
static int verboseenv_value = 0;
|
static int verboseenv_value = 0;
|
||||||
|
|||||||
11
src/3rdparty/hwloc/include/hwloc/rename.h
vendored
11
src/3rdparty/hwloc/include/hwloc/rename.h
vendored
@@ -28,6 +28,7 @@ extern "C" {
|
|||||||
#define HWLOC_MUNGE_NAME(a, b) HWLOC_MUNGE_NAME2(a, b)
|
#define HWLOC_MUNGE_NAME(a, b) HWLOC_MUNGE_NAME2(a, b)
|
||||||
#define HWLOC_MUNGE_NAME2(a, b) a ## b
|
#define HWLOC_MUNGE_NAME2(a, b) a ## b
|
||||||
#define HWLOC_NAME(name) HWLOC_MUNGE_NAME(HWLOC_SYM_PREFIX, hwloc_ ## name)
|
#define HWLOC_NAME(name) HWLOC_MUNGE_NAME(HWLOC_SYM_PREFIX, hwloc_ ## name)
|
||||||
|
/* FIXME: should be "HWLOC_ ## name" below, unchanged because it doesn't matter much and could break some embedders hacks */
|
||||||
#define HWLOC_NAME_CAPS(name) HWLOC_MUNGE_NAME(HWLOC_SYM_PREFIX_CAPS, hwloc_ ## name)
|
#define HWLOC_NAME_CAPS(name) HWLOC_MUNGE_NAME(HWLOC_SYM_PREFIX_CAPS, hwloc_ ## name)
|
||||||
|
|
||||||
/* Now define all the "real" names to be the prefixed names. This
|
/* Now define all the "real" names to be the prefixed names. This
|
||||||
@@ -92,9 +93,6 @@ extern "C" {
|
|||||||
|
|
||||||
#define hwloc_compare_types HWLOC_NAME(compare_types)
|
#define hwloc_compare_types HWLOC_NAME(compare_types)
|
||||||
|
|
||||||
#define hwloc_compare_types_e HWLOC_NAME(compare_types_e)
|
|
||||||
#define HWLOC_TYPE_UNORDERED HWLOC_NAME_CAPS(TYPE_UNORDERED)
|
|
||||||
|
|
||||||
#define hwloc_obj HWLOC_NAME(obj)
|
#define hwloc_obj HWLOC_NAME(obj)
|
||||||
#define hwloc_obj_t HWLOC_NAME(obj_t)
|
#define hwloc_obj_t HWLOC_NAME(obj_t)
|
||||||
|
|
||||||
@@ -324,6 +322,7 @@ extern "C" {
|
|||||||
#define hwloc_get_ancestor_obj_by_type HWLOC_NAME(get_ancestor_obj_by_type)
|
#define hwloc_get_ancestor_obj_by_type HWLOC_NAME(get_ancestor_obj_by_type)
|
||||||
#define hwloc_get_next_obj_by_depth HWLOC_NAME(get_next_obj_by_depth)
|
#define hwloc_get_next_obj_by_depth HWLOC_NAME(get_next_obj_by_depth)
|
||||||
#define hwloc_get_next_obj_by_type HWLOC_NAME(get_next_obj_by_type)
|
#define hwloc_get_next_obj_by_type HWLOC_NAME(get_next_obj_by_type)
|
||||||
|
#define hwloc_bitmap_singlify_per_core HWLOC_NAME(bitmap_singlify_by_core)
|
||||||
#define hwloc_get_pu_obj_by_os_index HWLOC_NAME(get_pu_obj_by_os_index)
|
#define hwloc_get_pu_obj_by_os_index HWLOC_NAME(get_pu_obj_by_os_index)
|
||||||
#define hwloc_get_numanode_obj_by_os_index HWLOC_NAME(get_numanode_obj_by_os_index)
|
#define hwloc_get_numanode_obj_by_os_index HWLOC_NAME(get_numanode_obj_by_os_index)
|
||||||
#define hwloc_get_next_child HWLOC_NAME(get_next_child)
|
#define hwloc_get_next_child HWLOC_NAME(get_next_child)
|
||||||
@@ -482,11 +481,6 @@ extern "C" {
|
|||||||
#define hwloc_ibv_get_device_osdev HWLOC_NAME(ibv_get_device_osdev)
|
#define hwloc_ibv_get_device_osdev HWLOC_NAME(ibv_get_device_osdev)
|
||||||
#define hwloc_ibv_get_device_osdev_by_name HWLOC_NAME(ibv_get_device_osdev_by_name)
|
#define hwloc_ibv_get_device_osdev_by_name HWLOC_NAME(ibv_get_device_osdev_by_name)
|
||||||
|
|
||||||
/* intel-mic.h */
|
|
||||||
|
|
||||||
#define hwloc_intel_mic_get_device_cpuset HWLOC_NAME(intel_mic_get_device_cpuset)
|
|
||||||
#define hwloc_intel_mic_get_device_osdev_by_index HWLOC_NAME(intel_mic_get_device_osdev_by_index)
|
|
||||||
|
|
||||||
/* opencl.h */
|
/* opencl.h */
|
||||||
|
|
||||||
#define hwloc_cl_device_topology_amd HWLOC_NAME(cl_device_topology_amd)
|
#define hwloc_cl_device_topology_amd HWLOC_NAME(cl_device_topology_amd)
|
||||||
@@ -709,6 +703,7 @@ extern "C" {
|
|||||||
#define hwloc_get_sysctlbyname HWLOC_NAME(get_sysctlbyname)
|
#define hwloc_get_sysctlbyname HWLOC_NAME(get_sysctlbyname)
|
||||||
#define hwloc_get_sysctl HWLOC_NAME(get_sysctl)
|
#define hwloc_get_sysctl HWLOC_NAME(get_sysctl)
|
||||||
#define hwloc_fallback_nbprocessors HWLOC_NAME(fallback_nbprocessors)
|
#define hwloc_fallback_nbprocessors HWLOC_NAME(fallback_nbprocessors)
|
||||||
|
#define hwloc_fallback_memsize HWLOC_NAME(fallback_memsize)
|
||||||
|
|
||||||
#define hwloc__object_cpusets_compare_first HWLOC_NAME(_object_cpusets_compare_first)
|
#define hwloc__object_cpusets_compare_first HWLOC_NAME(_object_cpusets_compare_first)
|
||||||
#define hwloc__reorder_children HWLOC_NAME(_reorder_children)
|
#define hwloc__reorder_children HWLOC_NAME(_reorder_children)
|
||||||
|
|||||||
6
src/3rdparty/hwloc/include/private/private.h
vendored
6
src/3rdparty/hwloc/include/private/private.h
vendored
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright © 2009 CNRS
|
* Copyright © 2009 CNRS
|
||||||
* Copyright © 2009-2019 Inria. All rights reserved.
|
* Copyright © 2009-2019 Inria. All rights reserved.
|
||||||
* Copyright © 2009-2012 Université Bordeaux
|
* Copyright © 2009-2012, 2020 Université Bordeaux
|
||||||
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
||||||
*
|
*
|
||||||
* See COPYING in top-level directory.
|
* See COPYING in top-level directory.
|
||||||
@@ -224,11 +224,13 @@ struct hwloc_topology {
|
|||||||
extern void hwloc_alloc_root_sets(hwloc_obj_t root);
|
extern void hwloc_alloc_root_sets(hwloc_obj_t root);
|
||||||
extern void hwloc_setup_pu_level(struct hwloc_topology *topology, unsigned nb_pus);
|
extern void hwloc_setup_pu_level(struct hwloc_topology *topology, unsigned nb_pus);
|
||||||
extern int hwloc_get_sysctlbyname(const char *name, int64_t *n);
|
extern int hwloc_get_sysctlbyname(const char *name, int64_t *n);
|
||||||
extern int hwloc_get_sysctl(int name[], unsigned namelen, int *n);
|
extern int hwloc_get_sysctl(int name[], unsigned namelen, int64_t *n);
|
||||||
|
|
||||||
/* returns the number of CPU from the OS (only valid if thissystem) */
|
/* returns the number of CPU from the OS (only valid if thissystem) */
|
||||||
#define HWLOC_FALLBACK_NBPROCESSORS_INCLUDE_OFFLINE 1 /* by default we try to get only the online CPUs */
|
#define HWLOC_FALLBACK_NBPROCESSORS_INCLUDE_OFFLINE 1 /* by default we try to get only the online CPUs */
|
||||||
extern int hwloc_fallback_nbprocessors(unsigned flags);
|
extern int hwloc_fallback_nbprocessors(unsigned flags);
|
||||||
|
/* returns the memory size from the OS (only valid if thissystem) */
|
||||||
|
extern int64_t hwloc_fallback_memsize(void);
|
||||||
|
|
||||||
extern int hwloc__object_cpusets_compare_first(hwloc_obj_t obj1, hwloc_obj_t obj2);
|
extern int hwloc__object_cpusets_compare_first(hwloc_obj_t obj1, hwloc_obj_t obj2);
|
||||||
extern void hwloc__reorder_children(hwloc_obj_t parent);
|
extern void hwloc__reorder_children(hwloc_obj_t parent);
|
||||||
|
|||||||
6
src/3rdparty/hwloc/src/bitmap.c
vendored
6
src/3rdparty/hwloc/src/bitmap.c
vendored
@@ -505,14 +505,16 @@ int hwloc_bitmap_list_sscanf(struct hwloc_bitmap_s *set, const char * __hwloc_re
|
|||||||
|
|
||||||
if (begin != -1) {
|
if (begin != -1) {
|
||||||
/* finishing a range */
|
/* finishing a range */
|
||||||
hwloc_bitmap_set_range(set, begin, val);
|
if (hwloc_bitmap_set_range(set, begin, val) < 0)
|
||||||
|
goto failed;
|
||||||
begin = -1;
|
begin = -1;
|
||||||
|
|
||||||
} else if (*next == '-') {
|
} else if (*next == '-') {
|
||||||
/* starting a new range */
|
/* starting a new range */
|
||||||
if (*(next+1) == '\0') {
|
if (*(next+1) == '\0') {
|
||||||
/* infinite range */
|
/* infinite range */
|
||||||
hwloc_bitmap_set_range(set, val, -1);
|
if (hwloc_bitmap_set_range(set, val, -1) < 0)
|
||||||
|
goto failed;
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
/* normal range */
|
/* normal range */
|
||||||
|
|||||||
153
src/3rdparty/hwloc/src/components.c
vendored
153
src/3rdparty/hwloc/src/components.c
vendored
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright © 2009-2019 Inria. All rights reserved.
|
* Copyright © 2009-2020 Inria. All rights reserved.
|
||||||
* Copyright © 2012 Université Bordeaux
|
* Copyright © 2012 Université Bordeaux
|
||||||
* See COPYING in top-level directory.
|
* See COPYING in top-level directory.
|
||||||
*/
|
*/
|
||||||
@@ -63,14 +63,128 @@ static pthread_mutex_t hwloc_components_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|||||||
|
|
||||||
#ifdef HWLOC_HAVE_PLUGINS
|
#ifdef HWLOC_HAVE_PLUGINS
|
||||||
|
|
||||||
|
#ifdef HWLOC_HAVE_LTDL
|
||||||
|
/* ltdl-based plugin load */
|
||||||
#include <ltdl.h>
|
#include <ltdl.h>
|
||||||
|
typedef lt_dlhandle hwloc_dlhandle;
|
||||||
|
#define hwloc_dlinit lt_dlinit
|
||||||
|
#define hwloc_dlexit lt_dlexit
|
||||||
|
#define hwloc_dlopenext lt_dlopenext
|
||||||
|
#define hwloc_dlclose lt_dlclose
|
||||||
|
#define hwloc_dlerror lt_dlerror
|
||||||
|
#define hwloc_dlsym lt_dlsym
|
||||||
|
#define hwloc_dlforeachfile lt_dlforeachfile
|
||||||
|
|
||||||
|
#else /* !HWLOC_HAVE_LTDL */
|
||||||
|
/* no-ltdl plugin load relies on less portable libdl */
|
||||||
|
#include <dlfcn.h>
|
||||||
|
typedef void * hwloc_dlhandle;
|
||||||
|
static __hwloc_inline int hwloc_dlinit(void) { return 0; }
|
||||||
|
static __hwloc_inline int hwloc_dlexit(void) { return 0; }
|
||||||
|
#define hwloc_dlclose dlclose
|
||||||
|
#define hwloc_dlerror dlerror
|
||||||
|
#define hwloc_dlsym dlsym
|
||||||
|
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
static hwloc_dlhandle hwloc_dlopenext(const char *_filename)
|
||||||
|
{
|
||||||
|
hwloc_dlhandle handle;
|
||||||
|
char *filename = NULL;
|
||||||
|
(void) asprintf(&filename, "%s.so", _filename);
|
||||||
|
if (!filename)
|
||||||
|
return NULL;
|
||||||
|
handle = dlopen(filename, RTLD_NOW|RTLD_LOCAL);
|
||||||
|
free(filename);
|
||||||
|
return handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
hwloc_dlforeachfile(const char *_paths,
|
||||||
|
int (*func)(const char *filename, void *data),
|
||||||
|
void *data)
|
||||||
|
{
|
||||||
|
char *paths = NULL, *path;
|
||||||
|
|
||||||
|
paths = strdup(_paths);
|
||||||
|
if (!paths)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
path = paths;
|
||||||
|
while (*path) {
|
||||||
|
char *colon;
|
||||||
|
DIR *dir;
|
||||||
|
struct dirent *dirent;
|
||||||
|
|
||||||
|
colon = strchr(path, ':');
|
||||||
|
if (colon)
|
||||||
|
*colon = '\0';
|
||||||
|
|
||||||
|
if (hwloc_plugins_verbose)
|
||||||
|
fprintf(stderr, " Looking under %s\n", path);
|
||||||
|
|
||||||
|
dir = opendir(path);
|
||||||
|
if (!dir)
|
||||||
|
goto next;
|
||||||
|
|
||||||
|
while ((dirent = readdir(dir)) != NULL) {
|
||||||
|
char *abs_name, *suffix;
|
||||||
|
struct stat stbuf;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = asprintf(&abs_name, "%s/%s", path, dirent->d_name);
|
||||||
|
if (err < 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
err = stat(abs_name, &stbuf);
|
||||||
|
if (err < 0) {
|
||||||
|
free(abs_name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!S_ISREG(stbuf.st_mode)) {
|
||||||
|
free(abs_name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Only keep .so files, and remove that suffix to get the component basename */
|
||||||
|
suffix = strrchr(abs_name, '.');
|
||||||
|
if (!suffix || strcmp(suffix, ".so")) {
|
||||||
|
free(abs_name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
*suffix = '\0';
|
||||||
|
|
||||||
|
err = func(abs_name, data);
|
||||||
|
if (err) {
|
||||||
|
free(abs_name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(abs_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
closedir(dir);
|
||||||
|
|
||||||
|
next:
|
||||||
|
if (!colon)
|
||||||
|
break;
|
||||||
|
path = colon+1;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(paths);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif /* !HWLOC_HAVE_LTDL */
|
||||||
|
|
||||||
/* array of pointers to dynamically loaded plugins */
|
/* array of pointers to dynamically loaded plugins */
|
||||||
static struct hwloc__plugin_desc {
|
static struct hwloc__plugin_desc {
|
||||||
char *name;
|
char *name;
|
||||||
struct hwloc_component *component;
|
struct hwloc_component *component;
|
||||||
char *filename;
|
char *filename;
|
||||||
lt_dlhandle handle;
|
hwloc_dlhandle handle;
|
||||||
struct hwloc__plugin_desc *next;
|
struct hwloc__plugin_desc *next;
|
||||||
} *hwloc_plugins = NULL;
|
} *hwloc_plugins = NULL;
|
||||||
|
|
||||||
@@ -78,9 +192,10 @@ static int
|
|||||||
hwloc__dlforeach_cb(const char *filename, void *_data __hwloc_attribute_unused)
|
hwloc__dlforeach_cb(const char *filename, void *_data __hwloc_attribute_unused)
|
||||||
{
|
{
|
||||||
const char *basename;
|
const char *basename;
|
||||||
lt_dlhandle handle;
|
hwloc_dlhandle handle;
|
||||||
struct hwloc_component *component;
|
struct hwloc_component *component;
|
||||||
struct hwloc__plugin_desc *desc, **prevdesc;
|
struct hwloc__plugin_desc *desc, **prevdesc;
|
||||||
|
char *componentsymbolname;
|
||||||
|
|
||||||
if (hwloc_plugins_verbose)
|
if (hwloc_plugins_verbose)
|
||||||
fprintf(stderr, "Plugin dlforeach found `%s'\n", filename);
|
fprintf(stderr, "Plugin dlforeach found `%s'\n", filename);
|
||||||
@@ -98,33 +213,40 @@ hwloc__dlforeach_cb(const char *filename, void *_data __hwloc_attribute_unused)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* dlopen and get the component structure */
|
/* dlopen and get the component structure */
|
||||||
handle = lt_dlopenext(filename);
|
handle = hwloc_dlopenext(filename);
|
||||||
if (!handle) {
|
if (!handle) {
|
||||||
if (hwloc_plugins_verbose)
|
if (hwloc_plugins_verbose)
|
||||||
fprintf(stderr, "Failed to load plugin: %s\n", lt_dlerror());
|
fprintf(stderr, "Failed to load plugin: %s\n", hwloc_dlerror());
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
componentsymbolname = malloc(strlen(basename)+10+1);
|
||||||
char componentsymbolname[strlen(basename)+10+1];
|
if (!componentsymbolname) {
|
||||||
|
if (hwloc_plugins_verbose)
|
||||||
|
fprintf(stderr, "Failed to allocation component `%s' symbol\n",
|
||||||
|
basename);
|
||||||
|
goto out_with_handle;
|
||||||
|
}
|
||||||
sprintf(componentsymbolname, "%s_component", basename);
|
sprintf(componentsymbolname, "%s_component", basename);
|
||||||
component = lt_dlsym(handle, componentsymbolname);
|
component = hwloc_dlsym(handle, componentsymbolname);
|
||||||
if (!component) {
|
if (!component) {
|
||||||
if (hwloc_plugins_verbose)
|
if (hwloc_plugins_verbose)
|
||||||
fprintf(stderr, "Failed to find component symbol `%s'\n",
|
fprintf(stderr, "Failed to find component symbol `%s'\n",
|
||||||
componentsymbolname);
|
componentsymbolname);
|
||||||
|
free(componentsymbolname);
|
||||||
goto out_with_handle;
|
goto out_with_handle;
|
||||||
}
|
}
|
||||||
if (component->abi != HWLOC_COMPONENT_ABI) {
|
if (component->abi != HWLOC_COMPONENT_ABI) {
|
||||||
if (hwloc_plugins_verbose)
|
if (hwloc_plugins_verbose)
|
||||||
fprintf(stderr, "Plugin symbol ABI %u instead of %d\n",
|
fprintf(stderr, "Plugin symbol ABI %u instead of %d\n",
|
||||||
component->abi, HWLOC_COMPONENT_ABI);
|
component->abi, HWLOC_COMPONENT_ABI);
|
||||||
|
free(componentsymbolname);
|
||||||
goto out_with_handle;
|
goto out_with_handle;
|
||||||
}
|
}
|
||||||
if (hwloc_plugins_verbose)
|
if (hwloc_plugins_verbose)
|
||||||
fprintf(stderr, "Plugin contains expected symbol `%s'\n",
|
fprintf(stderr, "Plugin contains expected symbol `%s'\n",
|
||||||
componentsymbolname);
|
componentsymbolname);
|
||||||
}
|
free(componentsymbolname);
|
||||||
|
|
||||||
if (HWLOC_COMPONENT_TYPE_DISC == component->type) {
|
if (HWLOC_COMPONENT_TYPE_DISC == component->type) {
|
||||||
if (strncmp(basename, "hwloc_", 6)) {
|
if (strncmp(basename, "hwloc_", 6)) {
|
||||||
@@ -167,7 +289,7 @@ hwloc__dlforeach_cb(const char *filename, void *_data __hwloc_attribute_unused)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out_with_handle:
|
out_with_handle:
|
||||||
lt_dlclose(handle);
|
hwloc_dlclose(handle);
|
||||||
out:
|
out:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -183,7 +305,7 @@ hwloc_plugins_exit(void)
|
|||||||
desc = hwloc_plugins;
|
desc = hwloc_plugins;
|
||||||
while (desc) {
|
while (desc) {
|
||||||
next = desc->next;
|
next = desc->next;
|
||||||
lt_dlclose(desc->handle);
|
hwloc_dlclose(desc->handle);
|
||||||
free(desc->name);
|
free(desc->name);
|
||||||
free(desc->filename);
|
free(desc->filename);
|
||||||
free(desc);
|
free(desc);
|
||||||
@@ -191,7 +313,7 @@ hwloc_plugins_exit(void)
|
|||||||
}
|
}
|
||||||
hwloc_plugins = NULL;
|
hwloc_plugins = NULL;
|
||||||
|
|
||||||
lt_dlexit();
|
hwloc_dlexit();
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@@ -207,7 +329,7 @@ hwloc_plugins_init(void)
|
|||||||
|
|
||||||
hwloc_plugins_blacklist = getenv("HWLOC_PLUGINS_BLACKLIST");
|
hwloc_plugins_blacklist = getenv("HWLOC_PLUGINS_BLACKLIST");
|
||||||
|
|
||||||
err = lt_dlinit();
|
err = hwloc_dlinit();
|
||||||
if (err)
|
if (err)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
@@ -219,7 +341,7 @@ hwloc_plugins_init(void)
|
|||||||
|
|
||||||
if (hwloc_plugins_verbose)
|
if (hwloc_plugins_verbose)
|
||||||
fprintf(stderr, "Starting plugin dlforeach in %s\n", path);
|
fprintf(stderr, "Starting plugin dlforeach in %s\n", path);
|
||||||
err = lt_dlforeachfile(path, hwloc__dlforeach_cb, NULL);
|
err = hwloc_dlforeachfile(path, hwloc__dlforeach_cb, NULL);
|
||||||
if (err)
|
if (err)
|
||||||
goto out_with_init;
|
goto out_with_init;
|
||||||
|
|
||||||
@@ -680,7 +802,8 @@ hwloc_disc_components_enable_others(struct hwloc_topology *topology)
|
|||||||
while (*curenv) {
|
while (*curenv) {
|
||||||
s = strcspn(curenv, HWLOC_COMPONENT_SEPS);
|
s = strcspn(curenv, HWLOC_COMPONENT_SEPS);
|
||||||
if (s) {
|
if (s) {
|
||||||
char c, *name;
|
char c;
|
||||||
|
const char *name;
|
||||||
|
|
||||||
if (!strncmp(curenv, HWLOC_COMPONENT_STOP_NAME, s)) {
|
if (!strncmp(curenv, HWLOC_COMPONENT_STOP_NAME, s)) {
|
||||||
tryall = 0;
|
tryall = 0;
|
||||||
|
|||||||
2
src/3rdparty/hwloc/src/distances.c
vendored
2
src/3rdparty/hwloc/src/distances.c
vendored
@@ -323,6 +323,8 @@ hwloc_internal_distances__add(hwloc_topology_t topology, const char *name,
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_with_dist:
|
err_with_dist:
|
||||||
|
if (name)
|
||||||
|
free(dist->name);
|
||||||
free(dist);
|
free(dist);
|
||||||
err:
|
err:
|
||||||
free(different_types);
|
free(different_types);
|
||||||
|
|||||||
4
src/3rdparty/hwloc/src/pci-common.c
vendored
4
src/3rdparty/hwloc/src/pci-common.c
vendored
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright © 2009-2019 Inria. All rights reserved.
|
* Copyright © 2009-2020 Inria. All rights reserved.
|
||||||
* See COPYING in top-level directory.
|
* See COPYING in top-level directory.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -366,7 +366,7 @@ hwloc_pcidisc_add_hostbridges(struct hwloc_topology *topology,
|
|||||||
struct hwloc_obj **dstnextp;
|
struct hwloc_obj **dstnextp;
|
||||||
struct hwloc_obj **srcnextp;
|
struct hwloc_obj **srcnextp;
|
||||||
struct hwloc_obj *child;
|
struct hwloc_obj *child;
|
||||||
unsigned short current_domain;
|
unsigned current_domain;
|
||||||
unsigned char current_bus;
|
unsigned char current_bus;
|
||||||
unsigned char current_subordinate;
|
unsigned char current_subordinate;
|
||||||
|
|
||||||
|
|||||||
29
src/3rdparty/hwloc/src/topology-noos.c
vendored
29
src/3rdparty/hwloc/src/topology-noos.c
vendored
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright © 2009 CNRS
|
* Copyright © 2009 CNRS
|
||||||
* Copyright © 2009-2019 Inria. All rights reserved.
|
* Copyright © 2009-2019 Inria. All rights reserved.
|
||||||
* Copyright © 2009-2012 Université Bordeaux
|
* Copyright © 2009-2012, 2020 Université Bordeaux
|
||||||
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
||||||
* See COPYING in top-level directory.
|
* See COPYING in top-level directory.
|
||||||
*/
|
*/
|
||||||
@@ -20,22 +20,27 @@ hwloc_look_noos(struct hwloc_backend *backend, struct hwloc_disc_status *dstatus
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
struct hwloc_topology *topology = backend->topology;
|
struct hwloc_topology *topology = backend->topology;
|
||||||
int nbprocs;
|
int64_t memsize;
|
||||||
|
|
||||||
assert(dstatus->phase == HWLOC_DISC_PHASE_CPU);
|
assert(dstatus->phase == HWLOC_DISC_PHASE_CPU);
|
||||||
|
|
||||||
if (topology->levels[0][0]->cpuset)
|
if (!topology->levels[0][0]->cpuset) {
|
||||||
/* somebody discovered things */
|
int nbprocs;
|
||||||
return -1;
|
/* Nobody (even the x86 backend) created objects yet, setup basic objects */
|
||||||
|
|
||||||
nbprocs = hwloc_fallback_nbprocessors(0);
|
nbprocs = hwloc_fallback_nbprocessors(0);
|
||||||
if (nbprocs >= 1)
|
if (nbprocs >= 1)
|
||||||
topology->support.discovery->pu = 1;
|
topology->support.discovery->pu = 1;
|
||||||
else
|
else
|
||||||
nbprocs = 1;
|
nbprocs = 1;
|
||||||
|
hwloc_alloc_root_sets(topology->levels[0][0]);
|
||||||
|
hwloc_setup_pu_level(topology, nbprocs);
|
||||||
|
}
|
||||||
|
|
||||||
|
memsize = hwloc_fallback_memsize();
|
||||||
|
if (memsize > 0)
|
||||||
|
topology->machine_memory.local_memory = memsize;;
|
||||||
|
|
||||||
hwloc_alloc_root_sets(topology->levels[0][0]);
|
|
||||||
hwloc_setup_pu_level(topology, nbprocs);
|
|
||||||
hwloc_add_uname_info(topology, NULL);
|
hwloc_add_uname_info(topology, NULL);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
1
src/3rdparty/hwloc/src/topology-synthetic.c
vendored
1
src/3rdparty/hwloc/src/topology-synthetic.c
vendored
@@ -1503,6 +1503,7 @@ hwloc_topology_export_synthetic(struct hwloc_topology * topology,
|
|||||||
signed pdepth;
|
signed pdepth;
|
||||||
|
|
||||||
node = hwloc_get_obj_by_type(topology, HWLOC_OBJ_NUMANODE, 0);
|
node = hwloc_get_obj_by_type(topology, HWLOC_OBJ_NUMANODE, 0);
|
||||||
|
assert(node);
|
||||||
assert(hwloc__obj_type_is_normal(node->parent->type)); /* only depth-1 memory children for now */
|
assert(hwloc__obj_type_is_normal(node->parent->type)); /* only depth-1 memory children for now */
|
||||||
pdepth = node->parent->depth;
|
pdepth = node->parent->depth;
|
||||||
|
|
||||||
|
|||||||
18
src/3rdparty/hwloc/src/topology-windows.c
vendored
18
src/3rdparty/hwloc/src/topology-windows.c
vendored
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright © 2009 CNRS
|
* Copyright © 2009 CNRS
|
||||||
* Copyright © 2009-2019 Inria. All rights reserved.
|
* Copyright © 2009-2020 Inria. All rights reserved.
|
||||||
* Copyright © 2009-2012 Université Bordeaux
|
* Copyright © 2009-2012, 2020 Université Bordeaux
|
||||||
* Copyright © 2011 Cisco Systems, Inc. All rights reserved.
|
* Copyright © 2011 Cisco Systems, Inc. All rights reserved.
|
||||||
* See COPYING in top-level directory.
|
* See COPYING in top-level directory.
|
||||||
*/
|
*/
|
||||||
@@ -232,6 +232,10 @@ static void hwloc_win_get_function_ptrs(void)
|
|||||||
{
|
{
|
||||||
HMODULE kernel32;
|
HMODULE kernel32;
|
||||||
|
|
||||||
|
#if HWLOC_HAVE_GCC_W_CAST_FUNCTION_TYPE
|
||||||
|
#pragma GCC diagnostic ignored "-Wcast-function-type"
|
||||||
|
#endif
|
||||||
|
|
||||||
kernel32 = LoadLibrary("kernel32.dll");
|
kernel32 = LoadLibrary("kernel32.dll");
|
||||||
if (kernel32) {
|
if (kernel32) {
|
||||||
GetActiveProcessorGroupCountProc =
|
GetActiveProcessorGroupCountProc =
|
||||||
@@ -270,6 +274,10 @@ static void hwloc_win_get_function_ptrs(void)
|
|||||||
if (psapi)
|
if (psapi)
|
||||||
QueryWorkingSetExProc = (PFN_QUERYWORKINGSETEX) GetProcAddress(psapi, "QueryWorkingSetEx");
|
QueryWorkingSetExProc = (PFN_QUERYWORKINGSETEX) GetProcAddress(psapi, "QueryWorkingSetEx");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if HWLOC_HAVE_GCC_W_CAST_FUNCTION_TYPE
|
||||||
|
#pragma GCC diagnostic warning "-Wcast-function-type"
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1199,3 +1207,9 @@ hwloc_fallback_nbprocessors(unsigned flags __hwloc_attribute_unused) {
|
|||||||
|
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64_t
|
||||||
|
hwloc_fallback_memsize(void) {
|
||||||
|
/* Unused */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright © 2009 CNRS
|
* Copyright © 2009 CNRS
|
||||||
* Copyright © 2009-2019 Inria. All rights reserved.
|
* Copyright © 2009-2020 Inria. All rights reserved.
|
||||||
* Copyright © 2009-2011 Université Bordeaux
|
* Copyright © 2009-2011 Université Bordeaux
|
||||||
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
||||||
* See COPYING in top-level directory.
|
* See COPYING in top-level directory.
|
||||||
@@ -34,7 +34,7 @@ struct hwloc__nolibxml_backend_data_s {
|
|||||||
typedef struct hwloc__nolibxml_import_state_data_s {
|
typedef struct hwloc__nolibxml_import_state_data_s {
|
||||||
char *tagbuffer; /* buffer containing the next tag */
|
char *tagbuffer; /* buffer containing the next tag */
|
||||||
char *attrbuffer; /* buffer containing the next attribute of the current node */
|
char *attrbuffer; /* buffer containing the next attribute of the current node */
|
||||||
char *tagname; /* tag name of the current node */
|
const char *tagname; /* tag name of the current node */
|
||||||
int closed; /* set if the current node is auto-closing */
|
int closed; /* set if the current node is auto-closing */
|
||||||
} __hwloc_attribute_may_alias * hwloc__nolibxml_import_state_data_t;
|
} __hwloc_attribute_may_alias * hwloc__nolibxml_import_state_data_t;
|
||||||
|
|
||||||
@@ -137,7 +137,7 @@ hwloc__nolibxml_import_find_child(hwloc__xml_import_state_t state,
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* normal tag */
|
/* normal tag */
|
||||||
tag = nchildstate->tagname = buffer;
|
nchildstate->tagname = tag = buffer;
|
||||||
|
|
||||||
/* find the end, mark it and return it */
|
/* find the end, mark it and return it */
|
||||||
end = strchr(buffer, '>');
|
end = strchr(buffer, '>');
|
||||||
@@ -260,7 +260,7 @@ hwloc_nolibxml_look_init(struct hwloc_xml_backend_data_s *bdata,
|
|||||||
unsigned major, minor;
|
unsigned major, minor;
|
||||||
char *end;
|
char *end;
|
||||||
char *buffer = nbdata->buffer;
|
char *buffer = nbdata->buffer;
|
||||||
char *tagname;
|
const char *tagname;
|
||||||
|
|
||||||
HWLOC_BUILD_ASSERT(sizeof(*nstate) <= sizeof(state->data));
|
HWLOC_BUILD_ASSERT(sizeof(*nstate) <= sizeof(state->data));
|
||||||
|
|
||||||
|
|||||||
68
src/3rdparty/hwloc/src/topology-xml.c
vendored
68
src/3rdparty/hwloc/src/topology-xml.c
vendored
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright © 2009 CNRS
|
* Copyright © 2009 CNRS
|
||||||
* Copyright © 2009-2019 Inria. All rights reserved.
|
* Copyright © 2009-2020 Inria. All rights reserved.
|
||||||
* Copyright © 2009-2011 Université Bordeaux
|
* Copyright © 2009-2011 Université Bordeaux
|
||||||
* Copyright © 2009-2018 Cisco Systems, Inc. All rights reserved.
|
* Copyright © 2009-2018 Cisco Systems, Inc. All rights reserved.
|
||||||
* See COPYING in top-level directory.
|
* See COPYING in top-level directory.
|
||||||
@@ -107,7 +107,8 @@ hwloc__xml_import_object_attr(struct hwloc_topology *topology,
|
|||||||
struct hwloc_xml_backend_data_s *data,
|
struct hwloc_xml_backend_data_s *data,
|
||||||
struct hwloc_obj *obj,
|
struct hwloc_obj *obj,
|
||||||
const char *name, const char *value,
|
const char *name, const char *value,
|
||||||
hwloc__xml_import_state_t state)
|
hwloc__xml_import_state_t state,
|
||||||
|
int *ignore)
|
||||||
{
|
{
|
||||||
if (!strcmp(name, "type")) {
|
if (!strcmp(name, "type")) {
|
||||||
/* already handled */
|
/* already handled */
|
||||||
@@ -252,11 +253,20 @@ hwloc__xml_import_object_attr(struct hwloc_topology *topology,
|
|||||||
case HWLOC_OBJ_PCI_DEVICE:
|
case HWLOC_OBJ_PCI_DEVICE:
|
||||||
case HWLOC_OBJ_BRIDGE: {
|
case HWLOC_OBJ_BRIDGE: {
|
||||||
unsigned domain, bus, dev, func;
|
unsigned domain, bus, dev, func;
|
||||||
if (sscanf(value, "%04x:%02x:%02x.%01x",
|
if (sscanf(value, "%x:%02x:%02x.%01x",
|
||||||
&domain, &bus, &dev, &func) != 4) {
|
&domain, &bus, &dev, &func) != 4) {
|
||||||
if (hwloc__xml_verbose())
|
if (hwloc__xml_verbose())
|
||||||
fprintf(stderr, "%s: ignoring invalid pci_busid format string %s\n",
|
fprintf(stderr, "%s: ignoring invalid pci_busid format string %s\n",
|
||||||
state->global->msgprefix, value);
|
state->global->msgprefix, value);
|
||||||
|
*ignore = 1;
|
||||||
|
#ifndef HWLOC_HAVE_32BITS_PCI_DOMAIN
|
||||||
|
} else if (domain > 0xffff) {
|
||||||
|
static int warned = 0;
|
||||||
|
if (!warned && !hwloc_hide_errors())
|
||||||
|
fprintf(stderr, "Ignoring PCI device with non-16bit domain.\nPass --enable-32bits-pci-domain to configure to support such devices\n(warning: it would break the library ABI, don't enable unless really needed).\n");
|
||||||
|
warned = 1;
|
||||||
|
*ignore = 1;
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
obj->attr->pcidev.domain = domain;
|
obj->attr->pcidev.domain = domain;
|
||||||
obj->attr->pcidev.bus = bus;
|
obj->attr->pcidev.bus = bus;
|
||||||
@@ -278,7 +288,7 @@ hwloc__xml_import_object_attr(struct hwloc_topology *topology,
|
|||||||
case HWLOC_OBJ_PCI_DEVICE:
|
case HWLOC_OBJ_PCI_DEVICE:
|
||||||
case HWLOC_OBJ_BRIDGE: {
|
case HWLOC_OBJ_BRIDGE: {
|
||||||
unsigned classid, vendor, device, subvendor, subdevice, revision;
|
unsigned classid, vendor, device, subvendor, subdevice, revision;
|
||||||
if (sscanf(value, "%04x [%04x:%04x] [%04x:%04x] %02x",
|
if (sscanf(value, "%x [%04x:%04x] [%04x:%04x] %02x",
|
||||||
&classid, &vendor, &device, &subvendor, &subdevice, &revision) != 6) {
|
&classid, &vendor, &device, &subvendor, &subdevice, &revision) != 6) {
|
||||||
if (hwloc__xml_verbose())
|
if (hwloc__xml_verbose())
|
||||||
fprintf(stderr, "%s: ignoring invalid pci_type format string %s\n",
|
fprintf(stderr, "%s: ignoring invalid pci_type format string %s\n",
|
||||||
@@ -342,11 +352,20 @@ hwloc__xml_import_object_attr(struct hwloc_topology *topology,
|
|||||||
switch (obj->type) {
|
switch (obj->type) {
|
||||||
case HWLOC_OBJ_BRIDGE: {
|
case HWLOC_OBJ_BRIDGE: {
|
||||||
unsigned domain, secbus, subbus;
|
unsigned domain, secbus, subbus;
|
||||||
if (sscanf(value, "%04x:[%02x-%02x]",
|
if (sscanf(value, "%x:[%02x-%02x]",
|
||||||
&domain, &secbus, &subbus) != 3) {
|
&domain, &secbus, &subbus) != 3) {
|
||||||
if (hwloc__xml_verbose())
|
if (hwloc__xml_verbose())
|
||||||
fprintf(stderr, "%s: ignoring invalid bridge_pci format string %s\n",
|
fprintf(stderr, "%s: ignoring invalid bridge_pci format string %s\n",
|
||||||
state->global->msgprefix, value);
|
state->global->msgprefix, value);
|
||||||
|
*ignore = 1;
|
||||||
|
#ifndef HWLOC_HAVE_32BITS_PCI_DOMAIN
|
||||||
|
} else if (domain > 0xffff) {
|
||||||
|
static int warned = 0;
|
||||||
|
if (!warned && !hwloc_hide_errors())
|
||||||
|
fprintf(stderr, "Ignoring bridge to PCI with non-16bit domain.\nPass --enable-32bits-pci-domain to configure to support such devices\n(warning: it would break the library ABI, don't enable unless really needed).\n");
|
||||||
|
warned = 1;
|
||||||
|
*ignore = 1;
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
obj->attr->bridge.downstream.pci.domain = domain;
|
obj->attr->bridge.downstream.pci.domain = domain;
|
||||||
obj->attr->bridge.downstream.pci.secondary_bus = secbus;
|
obj->attr->bridge.downstream.pci.secondary_bus = secbus;
|
||||||
@@ -426,6 +445,7 @@ hwloc__xml_import_object_attr(struct hwloc_topology *topology,
|
|||||||
memory->page_types = malloc(sizeof(*memory->page_types));
|
memory->page_types = malloc(sizeof(*memory->page_types));
|
||||||
memory->page_types_len = 1;
|
memory->page_types_len = 1;
|
||||||
}
|
}
|
||||||
|
assert(memory->page_types);
|
||||||
memory->page_types[0].size = lvalue << 10;
|
memory->page_types[0].size = lvalue << 10;
|
||||||
} else if (hwloc__xml_verbose()) {
|
} else if (hwloc__xml_verbose()) {
|
||||||
fprintf(stderr, "%s: ignoring huge_page_size_kB attribute for non-NUMAnode non-root object\n",
|
fprintf(stderr, "%s: ignoring huge_page_size_kB attribute for non-NUMAnode non-root object\n",
|
||||||
@@ -440,6 +460,7 @@ hwloc__xml_import_object_attr(struct hwloc_topology *topology,
|
|||||||
memory->page_types = malloc(sizeof(*memory->page_types));
|
memory->page_types = malloc(sizeof(*memory->page_types));
|
||||||
memory->page_types_len = 1;
|
memory->page_types_len = 1;
|
||||||
}
|
}
|
||||||
|
assert(memory->page_types);
|
||||||
memory->page_types[0].count = lvalue;
|
memory->page_types[0].count = lvalue;
|
||||||
} else if (hwloc__xml_verbose()) {
|
} else if (hwloc__xml_verbose()) {
|
||||||
fprintf(stderr, "%s: ignoring huge_page_free attribute for non-NUMAnode non-root object\n",
|
fprintf(stderr, "%s: ignoring huge_page_free attribute for non-NUMAnode non-root object\n",
|
||||||
@@ -835,7 +856,7 @@ hwloc__xml_import_object(hwloc_topology_t topology,
|
|||||||
state->global->msgprefix, attrname);
|
state->global->msgprefix, attrname);
|
||||||
goto error_with_object;
|
goto error_with_object;
|
||||||
}
|
}
|
||||||
hwloc__xml_import_object_attr(topology, data, obj, attrname, attrvalue, state);
|
hwloc__xml_import_object_attr(topology, data, obj, attrname, attrvalue, state, &ignored);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1140,15 +1161,23 @@ hwloc__xml_import_object(hwloc_topology_t topology,
|
|||||||
ret = -1;
|
ret = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0) {
|
||||||
goto error;
|
if (parent && !ignored)
|
||||||
|
goto error;
|
||||||
|
else
|
||||||
|
goto error_with_object;
|
||||||
|
}
|
||||||
|
|
||||||
state->global->close_child(&childstate);
|
state->global->close_child(&childstate);
|
||||||
|
|
||||||
tag = NULL;
|
tag = NULL;
|
||||||
ret = state->global->find_child(state, &childstate, &tag);
|
ret = state->global->find_child(state, &childstate, &tag);
|
||||||
if (ret < 0)
|
if (ret < 0) {
|
||||||
goto error;
|
if (parent && !ignored)
|
||||||
|
goto error;
|
||||||
|
else
|
||||||
|
goto error_with_object;
|
||||||
|
}
|
||||||
if (!ret)
|
if (!ret)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1548,7 +1577,7 @@ hwloc__xml_import_diff_one(hwloc__xml_import_state_t state,
|
|||||||
memset(&diff->obj_attr.diff, 0, sizeof(diff->obj_attr.diff));
|
memset(&diff->obj_attr.diff, 0, sizeof(diff->obj_attr.diff));
|
||||||
diff->obj_attr.diff.generic.type = obj_attr_type;
|
diff->obj_attr.diff.generic.type = obj_attr_type;
|
||||||
|
|
||||||
switch (atoi(obj_attr_type_s)) {
|
switch (obj_attr_type) {
|
||||||
case HWLOC_TOPOLOGY_DIFF_OBJ_ATTR_SIZE:
|
case HWLOC_TOPOLOGY_DIFF_OBJ_ATTR_SIZE:
|
||||||
diff->obj_attr.diff.uint64.oldvalue = strtoull(obj_attr_oldvalue_s, NULL, 0);
|
diff->obj_attr.diff.uint64.oldvalue = strtoull(obj_attr_oldvalue_s, NULL, 0);
|
||||||
diff->obj_attr.diff.uint64.newvalue = strtoull(obj_attr_newvalue_s, NULL, 0);
|
diff->obj_attr.diff.uint64.newvalue = strtoull(obj_attr_newvalue_s, NULL, 0);
|
||||||
@@ -1732,7 +1761,7 @@ hwloc_look_xml(struct hwloc_backend *backend, struct hwloc_disc_status *dstatus)
|
|||||||
goto failed;
|
goto failed;
|
||||||
} else {
|
} else {
|
||||||
if (hwloc__xml_verbose())
|
if (hwloc__xml_verbose())
|
||||||
fprintf(stderr, "%s: ignoring unknown tag `%s' after root object, expected `distances2'\n",
|
fprintf(stderr, "%s: ignoring unknown tag `%s' after root object.\n",
|
||||||
data->msgprefix, tag);
|
data->msgprefix, tag);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
@@ -1778,6 +1807,8 @@ done:
|
|||||||
if (nbobjs == data->nbnumanodes) {
|
if (nbobjs == data->nbnumanodes) {
|
||||||
hwloc_obj_t *objs = malloc(nbobjs*sizeof(hwloc_obj_t));
|
hwloc_obj_t *objs = malloc(nbobjs*sizeof(hwloc_obj_t));
|
||||||
uint64_t *values = malloc(nbobjs*nbobjs*sizeof(*values));
|
uint64_t *values = malloc(nbobjs*nbobjs*sizeof(*values));
|
||||||
|
assert(data->nbnumanodes > 0); /* v1dist->nbobjs is >0 after import */
|
||||||
|
assert(data->first_numanode);
|
||||||
if (objs && values) {
|
if (objs && values) {
|
||||||
hwloc_obj_t node;
|
hwloc_obj_t node;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
@@ -2051,13 +2082,17 @@ hwloc__xml_export_object_contents (hwloc__xml_export_state_t state, hwloc_topolo
|
|||||||
state->new_prop(state, "online_cpuset", setstring);
|
state->new_prop(state, "online_cpuset", setstring);
|
||||||
free(setstring);
|
free(setstring);
|
||||||
|
|
||||||
if (v1export || !obj->parent) {
|
if (v1export) {
|
||||||
hwloc_bitmap_t allowed_cpuset = hwloc_bitmap_dup(obj->cpuset);
|
hwloc_bitmap_t allowed_cpuset = hwloc_bitmap_dup(obj->cpuset);
|
||||||
hwloc_bitmap_and(allowed_cpuset, allowed_cpuset, topology->allowed_cpuset);
|
hwloc_bitmap_and(allowed_cpuset, allowed_cpuset, topology->allowed_cpuset);
|
||||||
hwloc_bitmap_asprintf(&setstring, allowed_cpuset);
|
hwloc_bitmap_asprintf(&setstring, allowed_cpuset);
|
||||||
state->new_prop(state, "allowed_cpuset", setstring);
|
state->new_prop(state, "allowed_cpuset", setstring);
|
||||||
free(setstring);
|
free(setstring);
|
||||||
hwloc_bitmap_free(allowed_cpuset);
|
hwloc_bitmap_free(allowed_cpuset);
|
||||||
|
} else if (!obj->parent) {
|
||||||
|
hwloc_bitmap_asprintf(&setstring, topology->allowed_cpuset);
|
||||||
|
state->new_prop(state, "allowed_cpuset", setstring);
|
||||||
|
free(setstring);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2072,13 +2107,17 @@ hwloc__xml_export_object_contents (hwloc__xml_export_state_t state, hwloc_topolo
|
|||||||
state->new_prop(state, "complete_nodeset", setstring);
|
state->new_prop(state, "complete_nodeset", setstring);
|
||||||
free(setstring);
|
free(setstring);
|
||||||
|
|
||||||
if (v1export || !obj->parent) {
|
if (v1export) {
|
||||||
hwloc_bitmap_t allowed_nodeset = hwloc_bitmap_dup(obj->nodeset);
|
hwloc_bitmap_t allowed_nodeset = hwloc_bitmap_dup(obj->nodeset);
|
||||||
hwloc_bitmap_and(allowed_nodeset, allowed_nodeset, topology->allowed_nodeset);
|
hwloc_bitmap_and(allowed_nodeset, allowed_nodeset, topology->allowed_nodeset);
|
||||||
hwloc_bitmap_asprintf(&setstring, allowed_nodeset);
|
hwloc_bitmap_asprintf(&setstring, allowed_nodeset);
|
||||||
state->new_prop(state, "allowed_nodeset", setstring);
|
state->new_prop(state, "allowed_nodeset", setstring);
|
||||||
free(setstring);
|
free(setstring);
|
||||||
hwloc_bitmap_free(allowed_nodeset);
|
hwloc_bitmap_free(allowed_nodeset);
|
||||||
|
} else if (!obj->parent) {
|
||||||
|
hwloc_bitmap_asprintf(&setstring, topology->allowed_nodeset);
|
||||||
|
state->new_prop(state, "allowed_nodeset", setstring);
|
||||||
|
free(setstring);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2921,6 +2960,7 @@ hwloc_export_obj_userdata(void *reserved,
|
|||||||
int encoded;
|
int encoded;
|
||||||
size_t encoded_length;
|
size_t encoded_length;
|
||||||
const char *realname;
|
const char *realname;
|
||||||
|
assert(name);
|
||||||
if (!strncmp(name, "base64", 6)) {
|
if (!strncmp(name, "base64", 6)) {
|
||||||
encoded = 1;
|
encoded = 1;
|
||||||
encoded_length = BASE64_ENCODED_LENGTH(length);
|
encoded_length = BASE64_ENCODED_LENGTH(length);
|
||||||
|
|||||||
97
src/3rdparty/hwloc/src/topology.c
vendored
97
src/3rdparty/hwloc/src/topology.c
vendored
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright © 2009 CNRS
|
* Copyright © 2009 CNRS
|
||||||
* Copyright © 2009-2019 Inria. All rights reserved.
|
* Copyright © 2009-2019 Inria. All rights reserved.
|
||||||
* Copyright © 2009-2012 Université Bordeaux
|
* Copyright © 2009-2012, 2020 Université Bordeaux
|
||||||
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
||||||
* See COPYING in top-level directory.
|
* See COPYING in top-level directory.
|
||||||
*/
|
*/
|
||||||
@@ -33,6 +33,9 @@
|
|||||||
#ifdef HAVE_MACH_MACH_INIT_H
|
#ifdef HAVE_MACH_MACH_INIT_H
|
||||||
#include <mach/mach_init.h>
|
#include <mach/mach_init.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_MACH_INIT_H
|
||||||
|
#include <mach_init.h>
|
||||||
|
#endif
|
||||||
#ifdef HAVE_MACH_MACH_HOST_H
|
#ifdef HAVE_MACH_MACH_HOST_H
|
||||||
#include <mach/mach_host.h>
|
#include <mach/mach_host.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -123,15 +126,25 @@ int hwloc_get_sysctlbyname(const char *name, int64_t *ret)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(HAVE_SYSCTL)
|
#if defined(HAVE_SYSCTL)
|
||||||
int hwloc_get_sysctl(int name[], unsigned namelen, int *ret)
|
int hwloc_get_sysctl(int name[], unsigned namelen, int64_t *ret)
|
||||||
{
|
{
|
||||||
int n;
|
union {
|
||||||
|
int32_t i32;
|
||||||
|
int64_t i64;
|
||||||
|
} n;
|
||||||
size_t size = sizeof(n);
|
size_t size = sizeof(n);
|
||||||
if (sysctl(name, namelen, &n, &size, NULL, 0))
|
if (sysctl(name, namelen, &n, &size, NULL, 0))
|
||||||
return -1;
|
return -1;
|
||||||
if (size != sizeof(n))
|
switch (size) {
|
||||||
return -1;
|
case sizeof(n.i32):
|
||||||
*ret = n;
|
*ret = n.i32;
|
||||||
|
break;
|
||||||
|
case sizeof(n.i64):
|
||||||
|
*ret = n.i64;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -178,8 +191,10 @@ hwloc_fallback_nbprocessors(unsigned flags) {
|
|||||||
n = nn;
|
n = nn;
|
||||||
#elif defined(HAVE_SYSCTL) && HAVE_DECL_CTL_HW && HAVE_DECL_HW_NCPU
|
#elif defined(HAVE_SYSCTL) && HAVE_DECL_CTL_HW && HAVE_DECL_HW_NCPU
|
||||||
static int name[2] = {CTL_HW, HW_NCPU};
|
static int name[2] = {CTL_HW, HW_NCPU};
|
||||||
if (hwloc_get_sysctl(name, sizeof(name)/sizeof(*name), &n))
|
int64_t nn;
|
||||||
|
if (hwloc_get_sysctl(name, sizeof(name)/sizeof(*name), &nn))
|
||||||
n = -1;
|
n = -1;
|
||||||
|
n = nn;
|
||||||
#else
|
#else
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
#warning No known way to discover number of available processors on this system
|
#warning No known way to discover number of available processors on this system
|
||||||
@@ -188,6 +203,46 @@ hwloc_fallback_nbprocessors(unsigned flags) {
|
|||||||
#endif
|
#endif
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64_t
|
||||||
|
hwloc_fallback_memsize(void) {
|
||||||
|
int64_t size;
|
||||||
|
#if defined(HAVE_HOST_INFO) && HAVE_HOST_INFO
|
||||||
|
struct host_basic_info info;
|
||||||
|
mach_msg_type_number_t count = HOST_BASIC_INFO_COUNT;
|
||||||
|
host_info(mach_host_self(), HOST_BASIC_INFO, (integer_t*) &info, &count);
|
||||||
|
size = info.memory_size;
|
||||||
|
#elif defined(HAVE_SYSCTL) && HAVE_DECL_CTL_HW && (HAVE_DECL_HW_REALMEM64 || HAVE_DECL_HW_MEMSIZE64 || HAVE_DECL_HW_PHYSMEM64 || HAVE_DECL_HW_USERMEM64 || HAVE_DECL_HW_REALMEM || HAVE_DECL_HW_MEMSIZE || HAVE_DECL_HW_PHYSMEM || HAVE_DECL_HW_USERMEM)
|
||||||
|
#if HAVE_DECL_HW_MEMSIZE64
|
||||||
|
static int name[2] = {CTL_HW, HW_MEMSIZE64};
|
||||||
|
#elif HAVE_DECL_HW_REALMEM64
|
||||||
|
static int name[2] = {CTL_HW, HW_REALMEM64};
|
||||||
|
#elif HAVE_DECL_HW_PHYSMEM64
|
||||||
|
static int name[2] = {CTL_HW, HW_PHYSMEM64};
|
||||||
|
#elif HAVE_DECL_HW_USERMEM64
|
||||||
|
static int name[2] = {CTL_HW, HW_USERMEM64};
|
||||||
|
#elif HAVE_DECL_HW_MEMSIZE
|
||||||
|
static int name[2] = {CTL_HW, HW_MEMSIZE};
|
||||||
|
#elif HAVE_DECL_HW_REALMEM
|
||||||
|
static int name[2] = {CTL_HW, HW_REALMEM};
|
||||||
|
#elif HAVE_DECL_HW_PHYSMEM
|
||||||
|
static int name[2] = {CTL_HW, HW_PHYSMEM};
|
||||||
|
#elif HAVE_DECL_HW_USERMEM
|
||||||
|
static int name[2] = {CTL_HW, HW_USERMEM};
|
||||||
|
#endif
|
||||||
|
if (hwloc_get_sysctl(name, sizeof(name)/sizeof(*name), &size))
|
||||||
|
size = -1;
|
||||||
|
#elif defined(HAVE_SYSCTLBYNAME)
|
||||||
|
if (hwloc_get_sysctlbyname("hw.memsize", &size) &&
|
||||||
|
hwloc_get_sysctlbyname("hw.realmem", &size) &&
|
||||||
|
hwloc_get_sysctlbyname("hw.physmem", &size) &&
|
||||||
|
hwloc_get_sysctlbyname("hw.usermem", &size))
|
||||||
|
size = -1;
|
||||||
|
#else
|
||||||
|
size = -1;
|
||||||
|
#endif
|
||||||
|
return size;
|
||||||
|
}
|
||||||
#endif /* !HWLOC_WIN_SYS */
|
#endif /* !HWLOC_WIN_SYS */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -2043,15 +2098,17 @@ propagate_total_memory(hwloc_obj_t obj)
|
|||||||
if (obj->type == HWLOC_OBJ_NUMANODE) {
|
if (obj->type == HWLOC_OBJ_NUMANODE) {
|
||||||
obj->total_memory += obj->attr->numanode.local_memory;
|
obj->total_memory += obj->attr->numanode.local_memory;
|
||||||
|
|
||||||
/* By the way, sort the page_type array.
|
if (obj->attr->numanode.page_types_len) {
|
||||||
* Cannot do it on insert since some backends (e.g. XML) add page_types after inserting the object.
|
/* By the way, sort the page_type array.
|
||||||
*/
|
* Cannot do it on insert since some backends (e.g. XML) add page_types after inserting the object.
|
||||||
qsort(obj->attr->numanode.page_types, obj->attr->numanode.page_types_len, sizeof(*obj->attr->numanode.page_types), hwloc_memory_page_type_compare);
|
*/
|
||||||
/* Ignore 0-size page_types, they are at the end */
|
qsort(obj->attr->numanode.page_types, obj->attr->numanode.page_types_len, sizeof(*obj->attr->numanode.page_types), hwloc_memory_page_type_compare);
|
||||||
for(i=obj->attr->numanode.page_types_len; i>=1; i--)
|
/* Ignore 0-size page_types, they are at the end */
|
||||||
if (obj->attr->numanode.page_types[i-1].size)
|
for(i=obj->attr->numanode.page_types_len; i>=1; i--)
|
||||||
break;
|
if (obj->attr->numanode.page_types[i-1].size)
|
||||||
obj->attr->numanode.page_types_len = i;
|
break;
|
||||||
|
obj->attr->numanode.page_types_len = i;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2966,7 +3023,8 @@ hwloc_connect_levels(hwloc_topology_t topology)
|
|||||||
if (hwloc_type_cmp(top_obj, objs[i]) == HWLOC_OBJ_EQUAL) {
|
if (hwloc_type_cmp(top_obj, objs[i]) == HWLOC_OBJ_EQUAL) {
|
||||||
/* Take it, add main children. */
|
/* Take it, add main children. */
|
||||||
taken_objs[n_taken_objs++] = objs[i];
|
taken_objs[n_taken_objs++] = objs[i];
|
||||||
memcpy(&new_objs[n_new_objs], objs[i]->children, objs[i]->arity * sizeof(new_objs[0]));
|
if (objs[i]->arity)
|
||||||
|
memcpy(&new_objs[n_new_objs], objs[i]->children, objs[i]->arity * sizeof(new_objs[0]));
|
||||||
n_new_objs += objs[i]->arity;
|
n_new_objs += objs[i]->arity;
|
||||||
} else {
|
} else {
|
||||||
/* Leave it. */
|
/* Leave it. */
|
||||||
@@ -4113,6 +4171,7 @@ hwloc_topology_restrict(struct hwloc_topology *topology, hwloc_const_bitmap_t se
|
|||||||
/* cpuset to clear */
|
/* cpuset to clear */
|
||||||
if (flags & HWLOC_RESTRICT_FLAG_REMOVE_MEMLESS) {
|
if (flags & HWLOC_RESTRICT_FLAG_REMOVE_MEMLESS) {
|
||||||
hwloc_obj_t pu = hwloc_get_obj_by_type(topology, HWLOC_OBJ_PU, 0);
|
hwloc_obj_t pu = hwloc_get_obj_by_type(topology, HWLOC_OBJ_PU, 0);
|
||||||
|
assert(pu);
|
||||||
do {
|
do {
|
||||||
/* PU will be removed if cpuset gets or was empty */
|
/* PU will be removed if cpuset gets or was empty */
|
||||||
if (hwloc_bitmap_iszero(pu->cpuset)
|
if (hwloc_bitmap_iszero(pu->cpuset)
|
||||||
@@ -4148,6 +4207,7 @@ hwloc_topology_restrict(struct hwloc_topology *topology, hwloc_const_bitmap_t se
|
|||||||
/* nodeset to clear */
|
/* nodeset to clear */
|
||||||
if (flags & HWLOC_RESTRICT_FLAG_REMOVE_CPULESS) {
|
if (flags & HWLOC_RESTRICT_FLAG_REMOVE_CPULESS) {
|
||||||
hwloc_obj_t node = hwloc_get_obj_by_type(topology, HWLOC_OBJ_NUMANODE, 0);
|
hwloc_obj_t node = hwloc_get_obj_by_type(topology, HWLOC_OBJ_NUMANODE, 0);
|
||||||
|
assert(node);
|
||||||
do {
|
do {
|
||||||
/* node will be removed if nodeset gets or was empty */
|
/* node will be removed if nodeset gets or was empty */
|
||||||
if (hwloc_bitmap_iszero(node->cpuset)
|
if (hwloc_bitmap_iszero(node->cpuset)
|
||||||
@@ -4242,6 +4302,9 @@ hwloc_topology_allow(struct hwloc_topology *topology,
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
topology->binding_hooks.get_allowed_resources(topology);
|
topology->binding_hooks.get_allowed_resources(topology);
|
||||||
|
/* make sure the backend returned something sane (Linux cpusets may return offline PUs in some cases) */
|
||||||
|
hwloc_bitmap_and(topology->allowed_cpuset, topology->allowed_cpuset, hwloc_get_root_obj(topology)->cpuset);
|
||||||
|
hwloc_bitmap_and(topology->allowed_nodeset, topology->allowed_nodeset, hwloc_get_root_obj(topology)->nodeset);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case HWLOC_ALLOW_FLAG_CUSTOM: {
|
case HWLOC_ALLOW_FLAG_CUSTOM: {
|
||||||
|
|||||||
24
src/3rdparty/libethash/CMakeLists.txt
vendored
Normal file
24
src/3rdparty/libethash/CMakeLists.txt
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
cmake_minimum_required (VERSION 2.8)
|
||||||
|
project (ethash C)
|
||||||
|
|
||||||
|
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Os")
|
||||||
|
|
||||||
|
set(HEADERS
|
||||||
|
data_sizes.h
|
||||||
|
endian.h
|
||||||
|
ethash.h
|
||||||
|
ethash_internal.h
|
||||||
|
fnv.h
|
||||||
|
)
|
||||||
|
|
||||||
|
set(SOURCES
|
||||||
|
ethash_internal.c
|
||||||
|
keccakf800.c
|
||||||
|
)
|
||||||
|
|
||||||
|
include_directories(../..)
|
||||||
|
|
||||||
|
add_library(ethash STATIC
|
||||||
|
${HEADERS}
|
||||||
|
${SOURCES}
|
||||||
|
)
|
||||||
811
src/3rdparty/libethash/data_sizes.h
vendored
Normal file
811
src/3rdparty/libethash/data_sizes.h
vendored
Normal file
@@ -0,0 +1,811 @@
|
|||||||
|
/*
|
||||||
|
This file is part of cpp-ethereum.
|
||||||
|
|
||||||
|
cpp-ethereum 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 FoundationUUU,either version 3 of the LicenseUUU,or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
cpp-ethereum is distributed in the hope that it will be usefulU,
|
||||||
|
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 cpp-ethereum. If notUUU,see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @file data_sizes.h
|
||||||
|
* @author Matthew Wampler-Doty <negacthulhu@gmail.com>
|
||||||
|
* @date 2015
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
// 2048 Epochs (~20 years) worth of tabulated DAG sizes
|
||||||
|
|
||||||
|
// Generated with the following Mathematica Code:
|
||||||
|
|
||||||
|
// GetCacheSizes[n_] := Module[{
|
||||||
|
// CacheSizeBytesInit = 2^24,
|
||||||
|
// CacheGrowth = 2^17,
|
||||||
|
// HashBytes = 64,
|
||||||
|
// j = 0},
|
||||||
|
// Reap[
|
||||||
|
// While[j < n,
|
||||||
|
// Module[{i =
|
||||||
|
// Floor[(CacheSizeBytesInit + CacheGrowth * j) / HashBytes]},
|
||||||
|
// While[! PrimeQ[i], i--];
|
||||||
|
// Sow[i*HashBytes]; j++]]]][[2]][[1]]
|
||||||
|
|
||||||
|
|
||||||
|
static const uint64_t dag_sizes[2048] = {
|
||||||
|
1073739904U, 1082130304U, 1090514816U, 1098906752U, 1107293056U,
|
||||||
|
1115684224U, 1124070016U, 1132461952U, 1140849536U, 1149232768U,
|
||||||
|
1157627776U, 1166013824U, 1174404736U, 1182786944U, 1191180416U,
|
||||||
|
1199568512U, 1207958912U, 1216345216U, 1224732032U, 1233124736U,
|
||||||
|
1241513344U, 1249902464U, 1258290304U, 1266673792U, 1275067264U,
|
||||||
|
1283453312U, 1291844992U, 1300234112U, 1308619904U, 1317010048U,
|
||||||
|
1325397376U, 1333787776U, 1342176128U, 1350561664U, 1358954368U,
|
||||||
|
1367339392U, 1375731584U, 1384118144U, 1392507008U, 1400897408U,
|
||||||
|
1409284736U, 1417673344U, 1426062464U, 1434451072U, 1442839168U,
|
||||||
|
1451229056U, 1459615616U, 1468006016U, 1476394112U, 1484782976U,
|
||||||
|
1493171584U, 1501559168U, 1509948032U, 1518337664U, 1526726528U,
|
||||||
|
1535114624U, 1543503488U, 1551892096U, 1560278656U, 1568669056U,
|
||||||
|
1577056384U, 1585446272U, 1593831296U, 1602219392U, 1610610304U,
|
||||||
|
1619000192U, 1627386752U, 1635773824U, 1644164224U, 1652555648U,
|
||||||
|
1660943488U, 1669332608U, 1677721216U, 1686109312U, 1694497664U,
|
||||||
|
1702886272U, 1711274624U, 1719661184U, 1728047744U, 1736434816U,
|
||||||
|
1744829056U, 1753218944U, 1761606272U, 1769995904U, 1778382464U,
|
||||||
|
1786772864U, 1795157888U, 1803550592U, 1811937664U, 1820327552U,
|
||||||
|
1828711552U, 1837102976U, 1845488768U, 1853879936U, 1862269312U,
|
||||||
|
1870656896U, 1879048064U, 1887431552U, 1895825024U, 1904212096U,
|
||||||
|
1912601216U, 1920988544U, 1929379456U, 1937765504U, 1946156672U,
|
||||||
|
1954543232U, 1962932096U, 1971321728U, 1979707264U, 1988093056U,
|
||||||
|
1996487552U, 2004874624U, 2013262208U, 2021653888U, 2030039936U,
|
||||||
|
2038430848U, 2046819968U, 2055208576U, 2063596672U, 2071981952U,
|
||||||
|
2080373632U, 2088762752U, 2097149056U, 2105539712U, 2113928576U,
|
||||||
|
2122315136U, 2130700672U, 2139092608U, 2147483264U, 2155872128U,
|
||||||
|
2164257664U, 2172642176U, 2181035392U, 2189426048U, 2197814912U,
|
||||||
|
2206203008U, 2214587264U, 2222979712U, 2231367808U, 2239758208U,
|
||||||
|
2248145024U, 2256527744U, 2264922752U, 2273312128U, 2281701248U,
|
||||||
|
2290086272U, 2298476672U, 2306867072U, 2315251072U, 2323639168U,
|
||||||
|
2332032128U, 2340420224U, 2348808064U, 2357196416U, 2365580416U,
|
||||||
|
2373966976U, 2382363008U, 2390748544U, 2399139968U, 2407530368U,
|
||||||
|
2415918976U, 2424307328U, 2432695424U, 2441084288U, 2449472384U,
|
||||||
|
2457861248U, 2466247808U, 2474637184U, 2483026816U, 2491414144U,
|
||||||
|
2499803776U, 2508191872U, 2516582272U, 2524970368U, 2533359232U,
|
||||||
|
2541743488U, 2550134144U, 2558525056U, 2566913408U, 2575301504U,
|
||||||
|
2583686528U, 2592073856U, 2600467328U, 2608856192U, 2617240448U,
|
||||||
|
2625631616U, 2634022016U, 2642407552U, 2650796416U, 2659188352U,
|
||||||
|
2667574912U, 2675965312U, 2684352896U, 2692738688U, 2701130624U,
|
||||||
|
2709518464U, 2717907328U, 2726293376U, 2734685056U, 2743073152U,
|
||||||
|
2751462016U, 2759851648U, 2768232832U, 2776625536U, 2785017728U,
|
||||||
|
2793401984U, 2801794432U, 2810182016U, 2818571648U, 2826959488U,
|
||||||
|
2835349376U, 2843734144U, 2852121472U, 2860514432U, 2868900992U,
|
||||||
|
2877286784U, 2885676928U, 2894069632U, 2902451584U, 2910843008U,
|
||||||
|
2919234688U, 2927622784U, 2936011648U, 2944400768U, 2952789376U,
|
||||||
|
2961177728U, 2969565568U, 2977951616U, 2986338944U, 2994731392U,
|
||||||
|
3003120256U, 3011508352U, 3019895936U, 3028287104U, 3036675968U,
|
||||||
|
3045063808U, 3053452928U, 3061837696U, 3070228352U, 3078615424U,
|
||||||
|
3087003776U, 3095394944U, 3103782272U, 3112173184U, 3120562048U,
|
||||||
|
3128944768U, 3137339264U, 3145725056U, 3154109312U, 3162505088U,
|
||||||
|
3170893184U, 3179280256U, 3187669376U, 3196056704U, 3204445568U,
|
||||||
|
3212836736U, 3221224064U, 3229612928U, 3238002304U, 3246391168U,
|
||||||
|
3254778496U, 3263165824U, 3271556224U, 3279944576U, 3288332416U,
|
||||||
|
3296719232U, 3305110912U, 3313500032U, 3321887104U, 3330273152U,
|
||||||
|
3338658944U, 3347053184U, 3355440512U, 3363827072U, 3372220288U,
|
||||||
|
3380608384U, 3388997504U, 3397384576U, 3405774208U, 3414163072U,
|
||||||
|
3422551936U, 3430937984U, 3439328384U, 3447714176U, 3456104576U,
|
||||||
|
3464493952U, 3472883584U, 3481268864U, 3489655168U, 3498048896U,
|
||||||
|
3506434432U, 3514826368U, 3523213952U, 3531603584U, 3539987072U,
|
||||||
|
3548380288U, 3556763264U, 3565157248U, 3573545344U, 3581934464U,
|
||||||
|
3590324096U, 3598712704U, 3607098752U, 3615488384U, 3623877248U,
|
||||||
|
3632265856U, 3640646528U, 3649043584U, 3657430144U, 3665821568U,
|
||||||
|
3674207872U, 3682597504U, 3690984832U, 3699367808U, 3707764352U,
|
||||||
|
3716152448U, 3724541056U, 3732925568U, 3741318016U, 3749706368U,
|
||||||
|
3758091136U, 3766481536U, 3774872704U, 3783260032U, 3791650432U,
|
||||||
|
3800036224U, 3808427648U, 3816815488U, 3825204608U, 3833592704U,
|
||||||
|
3841981568U, 3850370432U, 3858755968U, 3867147904U, 3875536256U,
|
||||||
|
3883920512U, 3892313728U, 3900702592U, 3909087872U, 3917478784U,
|
||||||
|
3925868416U, 3934256512U, 3942645376U, 3951032192U, 3959422336U,
|
||||||
|
3967809152U, 3976200064U, 3984588416U, 3992974976U, 4001363584U,
|
||||||
|
4009751168U, 4018141312U, 4026530432U, 4034911616U, 4043308928U,
|
||||||
|
4051695488U, 4060084352U, 4068472448U, 4076862848U, 4085249408U,
|
||||||
|
4093640576U, 4102028416U, 4110413696U, 4118805632U, 4127194496U,
|
||||||
|
4135583104U, 4143971968U, 4152360832U, 4160746112U, 4169135744U,
|
||||||
|
4177525888U, 4185912704U, 4194303616U, 4202691968U, 4211076736U,
|
||||||
|
4219463552U, 4227855488U, 4236246656U, 4244633728U, 4253022848U,
|
||||||
|
4261412224U, 4269799808U, 4278184832U, 4286578048U, 4294962304U,
|
||||||
|
4303349632U, 4311743104U, 4320130432U, 4328521088U, 4336909184U,
|
||||||
|
4345295488U, 4353687424U, 4362073472U, 4370458496U, 4378852736U,
|
||||||
|
4387238528U, 4395630208U, 4404019072U, 4412407424U, 4420790656U,
|
||||||
|
4429182848U, 4437571456U, 4445962112U, 4454344064U, 4462738048U,
|
||||||
|
4471119232U, 4479516544U, 4487904128U, 4496289664U, 4504682368U,
|
||||||
|
4513068416U, 4521459584U, 4529846144U, 4538232704U, 4546619776U,
|
||||||
|
4555010176U, 4563402112U, 4571790208U, 4580174464U, 4588567936U,
|
||||||
|
4596957056U, 4605344896U, 4613734016U, 4622119808U, 4630511488U,
|
||||||
|
4638898816U, 4647287936U, 4655675264U, 4664065664U, 4672451968U,
|
||||||
|
4680842624U, 4689231488U, 4697620352U, 4706007424U, 4714397056U,
|
||||||
|
4722786176U, 4731173248U, 4739562368U, 4747951744U, 4756340608U,
|
||||||
|
4764727936U, 4773114496U, 4781504384U, 4789894784U, 4798283648U,
|
||||||
|
4806667648U, 4815059584U, 4823449472U, 4831835776U, 4840226176U,
|
||||||
|
4848612224U, 4857003392U, 4865391488U, 4873780096U, 4882169728U,
|
||||||
|
4890557312U, 4898946944U, 4907333248U, 4915722368U, 4924110976U,
|
||||||
|
4932499328U, 4940889728U, 4949276032U, 4957666432U, 4966054784U,
|
||||||
|
4974438016U, 4982831488U, 4991221376U, 4999607168U, 5007998848U,
|
||||||
|
5016386432U, 5024763776U, 5033164672U, 5041544576U, 5049941888U,
|
||||||
|
5058329728U, 5066717056U, 5075107456U, 5083494272U, 5091883904U,
|
||||||
|
5100273536U, 5108662144U, 5117048192U, 5125436032U, 5133827456U,
|
||||||
|
5142215296U, 5150605184U, 5158993024U, 5167382144U, 5175769472U,
|
||||||
|
5184157568U, 5192543872U, 5200936064U, 5209324928U, 5217711232U,
|
||||||
|
5226102656U, 5234490496U, 5242877312U, 5251263872U, 5259654016U,
|
||||||
|
5268040832U, 5276434304U, 5284819328U, 5293209728U, 5301598592U,
|
||||||
|
5309986688U, 5318374784U, 5326764416U, 5335151488U, 5343542144U,
|
||||||
|
5351929472U, 5360319872U, 5368706944U, 5377096576U, 5385484928U,
|
||||||
|
5393871232U, 5402263424U, 5410650496U, 5419040384U, 5427426944U,
|
||||||
|
5435816576U, 5444205952U, 5452594816U, 5460981376U, 5469367936U,
|
||||||
|
5477760896U, 5486148736U, 5494536832U, 5502925952U, 5511315328U,
|
||||||
|
5519703424U, 5528089984U, 5536481152U, 5544869504U, 5553256064U,
|
||||||
|
5561645696U, 5570032768U, 5578423936U, 5586811264U, 5595193216U,
|
||||||
|
5603585408U, 5611972736U, 5620366208U, 5628750464U, 5637143936U,
|
||||||
|
5645528192U, 5653921408U, 5662310272U, 5670694784U, 5679082624U,
|
||||||
|
5687474048U, 5695864448U, 5704251008U, 5712641408U, 5721030272U,
|
||||||
|
5729416832U, 5737806208U, 5746194304U, 5754583936U, 5762969984U,
|
||||||
|
5771358592U, 5779748224U, 5788137856U, 5796527488U, 5804911232U,
|
||||||
|
5813300608U, 5821692544U, 5830082176U, 5838468992U, 5846855552U,
|
||||||
|
5855247488U, 5863636096U, 5872024448U, 5880411008U, 5888799872U,
|
||||||
|
5897186432U, 5905576832U, 5913966976U, 5922352768U, 5930744704U,
|
||||||
|
5939132288U, 5947522432U, 5955911296U, 5964299392U, 5972688256U,
|
||||||
|
5981074304U, 5989465472U, 5997851008U, 6006241408U, 6014627968U,
|
||||||
|
6023015552U, 6031408256U, 6039796096U, 6048185216U, 6056574848U,
|
||||||
|
6064963456U, 6073351808U, 6081736064U, 6090128768U, 6098517632U,
|
||||||
|
6106906496U, 6115289216U, 6123680896U, 6132070016U, 6140459648U,
|
||||||
|
6148849024U, 6157237376U, 6165624704U, 6174009728U, 6182403712U,
|
||||||
|
6190792064U, 6199176064U, 6207569792U, 6215952256U, 6224345216U,
|
||||||
|
6232732544U, 6241124224U, 6249510272U, 6257899136U, 6266287744U,
|
||||||
|
6274676864U, 6283065728U, 6291454336U, 6299843456U, 6308232064U,
|
||||||
|
6316620928U, 6325006208U, 6333395584U, 6341784704U, 6350174848U,
|
||||||
|
6358562176U, 6366951296U, 6375337856U, 6383729536U, 6392119168U,
|
||||||
|
6400504192U, 6408895616U, 6417283456U, 6425673344U, 6434059136U,
|
||||||
|
6442444672U, 6450837376U, 6459223424U, 6467613056U, 6476004224U,
|
||||||
|
6484393088U, 6492781952U, 6501170048U, 6509555072U, 6517947008U,
|
||||||
|
6526336384U, 6534725504U, 6543112832U, 6551500672U, 6559888768U,
|
||||||
|
6568278656U, 6576662912U, 6585055616U, 6593443456U, 6601834112U,
|
||||||
|
6610219648U, 6618610304U, 6626999168U, 6635385472U, 6643777408U,
|
||||||
|
6652164224U, 6660552832U, 6668941952U, 6677330048U, 6685719424U,
|
||||||
|
6694107776U, 6702493568U, 6710882176U, 6719274112U, 6727662976U,
|
||||||
|
6736052096U, 6744437632U, 6752825984U, 6761213824U, 6769604224U,
|
||||||
|
6777993856U, 6786383488U, 6794770816U, 6803158144U, 6811549312U,
|
||||||
|
6819937664U, 6828326528U, 6836706176U, 6845101696U, 6853491328U,
|
||||||
|
6861880448U, 6870269312U, 6878655104U, 6887046272U, 6895433344U,
|
||||||
|
6903822208U, 6912212864U, 6920596864U, 6928988288U, 6937377152U,
|
||||||
|
6945764992U, 6954149248U, 6962544256U, 6970928768U, 6979317376U,
|
||||||
|
6987709312U, 6996093824U, 7004487296U, 7012875392U, 7021258624U,
|
||||||
|
7029652352U, 7038038912U, 7046427776U, 7054818944U, 7063207808U,
|
||||||
|
7071595136U, 7079980928U, 7088372608U, 7096759424U, 7105149824U,
|
||||||
|
7113536896U, 7121928064U, 7130315392U, 7138699648U, 7147092352U,
|
||||||
|
7155479168U, 7163865728U, 7172249984U, 7180648064U, 7189036672U,
|
||||||
|
7197424768U, 7205810816U, 7214196608U, 7222589824U, 7230975104U,
|
||||||
|
7239367552U, 7247755904U, 7256145536U, 7264533376U, 7272921472U,
|
||||||
|
7281308032U, 7289694848U, 7298088832U, 7306471808U, 7314864512U,
|
||||||
|
7323253888U, 7331643008U, 7340029568U, 7348419712U, 7356808832U,
|
||||||
|
7365196672U, 7373585792U, 7381973888U, 7390362752U, 7398750592U,
|
||||||
|
7407138944U, 7415528576U, 7423915648U, 7432302208U, 7440690304U,
|
||||||
|
7449080192U, 7457472128U, 7465860992U, 7474249088U, 7482635648U,
|
||||||
|
7491023744U, 7499412608U, 7507803008U, 7516192384U, 7524579968U,
|
||||||
|
7532967296U, 7541358464U, 7549745792U, 7558134656U, 7566524032U,
|
||||||
|
7574912896U, 7583300992U, 7591690112U, 7600075136U, 7608466816U,
|
||||||
|
7616854912U, 7625244544U, 7633629824U, 7642020992U, 7650410368U,
|
||||||
|
7658794112U, 7667187328U, 7675574912U, 7683961984U, 7692349568U,
|
||||||
|
7700739712U, 7709130368U, 7717519232U, 7725905536U, 7734295424U,
|
||||||
|
7742683264U, 7751069056U, 7759457408U, 7767849088U, 7776238208U,
|
||||||
|
7784626816U, 7793014912U, 7801405312U, 7809792128U, 7818179968U,
|
||||||
|
7826571136U, 7834957184U, 7843347328U, 7851732352U, 7860124544U,
|
||||||
|
7868512384U, 7876902016U, 7885287808U, 7893679744U, 7902067072U,
|
||||||
|
7910455936U, 7918844288U, 7927230848U, 7935622784U, 7944009344U,
|
||||||
|
7952400256U, 7960786048U, 7969176704U, 7977565312U, 7985953408U,
|
||||||
|
7994339968U, 8002730368U, 8011119488U, 8019508096U, 8027896192U,
|
||||||
|
8036285056U, 8044674688U, 8053062272U, 8061448832U, 8069838464U,
|
||||||
|
8078227328U, 8086616704U, 8095006592U, 8103393664U, 8111783552U,
|
||||||
|
8120171392U, 8128560256U, 8136949376U, 8145336704U, 8153726848U,
|
||||||
|
8162114944U, 8170503296U, 8178891904U, 8187280768U, 8195669632U,
|
||||||
|
8204058496U, 8212444544U, 8220834176U, 8229222272U, 8237612672U,
|
||||||
|
8246000768U, 8254389376U, 8262775168U, 8271167104U, 8279553664U,
|
||||||
|
8287944064U, 8296333184U, 8304715136U, 8313108352U, 8321497984U,
|
||||||
|
8329885568U, 8338274432U, 8346663296U, 8355052928U, 8363441536U,
|
||||||
|
8371828352U, 8380217984U, 8388606592U, 8396996224U, 8405384576U,
|
||||||
|
8413772672U, 8422161536U, 8430549376U, 8438939008U, 8447326592U,
|
||||||
|
8455715456U, 8464104832U, 8472492928U, 8480882048U, 8489270656U,
|
||||||
|
8497659776U, 8506045312U, 8514434944U, 8522823808U, 8531208832U,
|
||||||
|
8539602304U, 8547990656U, 8556378752U, 8564768384U, 8573154176U,
|
||||||
|
8581542784U, 8589933952U, 8598322816U, 8606705024U, 8615099264U,
|
||||||
|
8623487872U, 8631876992U, 8640264064U, 8648653952U, 8657040256U,
|
||||||
|
8665430656U, 8673820544U, 8682209152U, 8690592128U, 8698977152U,
|
||||||
|
8707374464U, 8715763328U, 8724151424U, 8732540032U, 8740928384U,
|
||||||
|
8749315712U, 8757704576U, 8766089344U, 8774480768U, 8782871936U,
|
||||||
|
8791260032U, 8799645824U, 8808034432U, 8816426368U, 8824812928U,
|
||||||
|
8833199488U, 8841591424U, 8849976448U, 8858366336U, 8866757248U,
|
||||||
|
8875147136U, 8883532928U, 8891923328U, 8900306816U, 8908700288U,
|
||||||
|
8917088384U, 8925478784U, 8933867392U, 8942250368U, 8950644608U,
|
||||||
|
8959032704U, 8967420544U, 8975809664U, 8984197504U, 8992584064U,
|
||||||
|
9000976256U, 9009362048U, 9017752448U, 9026141312U, 9034530688U,
|
||||||
|
9042917504U, 9051307904U, 9059694208U, 9068084864U, 9076471424U,
|
||||||
|
9084861824U, 9093250688U, 9101638528U, 9110027648U, 9118416512U,
|
||||||
|
9126803584U, 9135188096U, 9143581312U, 9151969664U, 9160356224U,
|
||||||
|
9168747136U, 9177134464U, 9185525632U, 9193910144U, 9202302848U,
|
||||||
|
9210690688U, 9219079552U, 9227465344U, 9235854464U, 9244244864U,
|
||||||
|
9252633472U, 9261021824U, 9269411456U, 9277799296U, 9286188928U,
|
||||||
|
9294574208U, 9302965888U, 9311351936U, 9319740032U, 9328131968U,
|
||||||
|
9336516736U, 9344907392U, 9353296768U, 9361685888U, 9370074752U,
|
||||||
|
9378463616U, 9386849408U, 9395239808U, 9403629184U, 9412016512U,
|
||||||
|
9420405376U, 9428795008U, 9437181568U, 9445570688U, 9453960832U,
|
||||||
|
9462346624U, 9470738048U, 9479121536U, 9487515008U, 9495903616U,
|
||||||
|
9504289664U, 9512678528U, 9521067904U, 9529456256U, 9537843584U,
|
||||||
|
9546233728U, 9554621312U, 9563011456U, 9571398784U, 9579788672U,
|
||||||
|
9588178304U, 9596567168U, 9604954496U, 9613343104U, 9621732992U,
|
||||||
|
9630121856U, 9638508416U, 9646898816U, 9655283584U, 9663675776U,
|
||||||
|
9672061312U, 9680449664U, 9688840064U, 9697230464U, 9705617536U,
|
||||||
|
9714003584U, 9722393984U, 9730772608U, 9739172224U, 9747561088U,
|
||||||
|
9755945344U, 9764338816U, 9772726144U, 9781116544U, 9789503872U,
|
||||||
|
9797892992U, 9806282624U, 9814670464U, 9823056512U, 9831439232U,
|
||||||
|
9839833984U, 9848224384U, 9856613504U, 9865000576U, 9873391232U,
|
||||||
|
9881772416U, 9890162816U, 9898556288U, 9906940544U, 9915333248U,
|
||||||
|
9923721088U, 9932108672U, 9940496512U, 9948888448U, 9957276544U,
|
||||||
|
9965666176U, 9974048384U, 9982441088U, 9990830464U, 9999219584U,
|
||||||
|
10007602816U, 10015996544U, 10024385152U, 10032774016U, 10041163648U,
|
||||||
|
10049548928U, 10057940096U, 10066329472U, 10074717824U, 10083105152U,
|
||||||
|
10091495296U, 10099878784U, 10108272256U, 10116660608U, 10125049216U,
|
||||||
|
10133437312U, 10141825664U, 10150213504U, 10158601088U, 10166991232U,
|
||||||
|
10175378816U, 10183766144U, 10192157312U, 10200545408U, 10208935552U,
|
||||||
|
10217322112U, 10225712768U, 10234099328U, 10242489472U, 10250876032U,
|
||||||
|
10259264896U, 10267656064U, 10276042624U, 10284429184U, 10292820352U,
|
||||||
|
10301209472U, 10309598848U, 10317987712U, 10326375296U, 10334763392U,
|
||||||
|
10343153536U, 10351541632U, 10359930752U, 10368318592U, 10376707456U,
|
||||||
|
10385096576U, 10393484672U, 10401867136U, 10410262144U, 10418647424U,
|
||||||
|
10427039104U, 10435425664U, 10443810176U, 10452203648U, 10460589952U,
|
||||||
|
10468982144U, 10477369472U, 10485759104U, 10494147712U, 10502533504U,
|
||||||
|
10510923392U, 10519313536U, 10527702656U, 10536091264U, 10544478592U,
|
||||||
|
10552867712U, 10561255808U, 10569642368U, 10578032768U, 10586423168U,
|
||||||
|
10594805632U, 10603200128U, 10611588992U, 10619976064U, 10628361344U,
|
||||||
|
10636754048U, 10645143424U, 10653531776U, 10661920384U, 10670307968U,
|
||||||
|
10678696832U, 10687086464U, 10695475072U, 10703863168U, 10712246144U,
|
||||||
|
10720639616U, 10729026688U, 10737414784U, 10745806208U, 10754190976U,
|
||||||
|
10762581376U, 10770971264U, 10779356288U, 10787747456U, 10796135552U,
|
||||||
|
10804525184U, 10812915584U, 10821301888U, 10829692288U, 10838078336U,
|
||||||
|
10846469248U, 10854858368U, 10863247232U, 10871631488U, 10880023424U,
|
||||||
|
10888412032U, 10896799616U, 10905188992U, 10913574016U, 10921964672U,
|
||||||
|
10930352768U, 10938742912U, 10947132544U, 10955518592U, 10963909504U,
|
||||||
|
10972298368U, 10980687488U, 10989074816U, 10997462912U, 11005851776U,
|
||||||
|
11014241152U, 11022627712U, 11031017344U, 11039403904U, 11047793024U,
|
||||||
|
11056184704U, 11064570752U, 11072960896U, 11081343872U, 11089737856U,
|
||||||
|
11098128256U, 11106514816U, 11114904448U, 11123293568U, 11131680128U,
|
||||||
|
11140065152U, 11148458368U, 11156845696U, 11165236864U, 11173624192U,
|
||||||
|
11182013824U, 11190402688U, 11198790784U, 11207179136U, 11215568768U,
|
||||||
|
11223957376U, 11232345728U, 11240734592U, 11249122688U, 11257511296U,
|
||||||
|
11265899648U, 11274285952U, 11282675584U, 11291065472U, 11299452544U,
|
||||||
|
11307842432U, 11316231296U, 11324616832U, 11333009024U, 11341395584U,
|
||||||
|
11349782656U, 11358172288U, 11366560384U, 11374950016U, 11383339648U,
|
||||||
|
11391721856U, 11400117376U, 11408504192U, 11416893568U, 11425283456U,
|
||||||
|
11433671552U, 11442061184U, 11450444672U, 11458837888U, 11467226752U,
|
||||||
|
11475611776U, 11484003968U, 11492392064U, 11500780672U, 11509169024U,
|
||||||
|
11517550976U, 11525944448U, 11534335616U, 11542724224U, 11551111808U,
|
||||||
|
11559500672U, 11567890304U, 11576277376U, 11584667008U, 11593056128U,
|
||||||
|
11601443456U, 11609830016U, 11618221952U, 11626607488U, 11634995072U,
|
||||||
|
11643387776U, 11651775104U, 11660161664U, 11668552576U, 11676940928U,
|
||||||
|
11685330304U, 11693718656U, 11702106496U, 11710496128U, 11718882688U,
|
||||||
|
11727273088U, 11735660416U, 11744050048U, 11752437376U, 11760824704U,
|
||||||
|
11769216128U, 11777604736U, 11785991296U, 11794381952U, 11802770048U,
|
||||||
|
11811157888U, 11819548544U, 11827932544U, 11836324736U, 11844713344U,
|
||||||
|
11853100928U, 11861486464U, 11869879936U, 11878268032U, 11886656896U,
|
||||||
|
11895044992U, 11903433088U, 11911822976U, 11920210816U, 11928600448U,
|
||||||
|
11936987264U, 11945375872U, 11953761152U, 11962151296U, 11970543488U,
|
||||||
|
11978928512U, 11987320448U, 11995708288U, 12004095104U, 12012486272U,
|
||||||
|
12020875136U, 12029255552U, 12037652096U, 12046039168U, 12054429568U,
|
||||||
|
12062813824U, 12071206528U, 12079594624U, 12087983744U, 12096371072U,
|
||||||
|
12104759936U, 12113147264U, 12121534592U, 12129924992U, 12138314624U,
|
||||||
|
12146703232U, 12155091584U, 12163481216U, 12171864704U, 12180255872U,
|
||||||
|
12188643968U, 12197034112U, 12205424512U, 12213811328U, 12222199424U,
|
||||||
|
12230590336U, 12238977664U, 12247365248U, 12255755392U, 12264143488U,
|
||||||
|
12272531584U, 12280920448U, 12289309568U, 12297694592U, 12306086528U,
|
||||||
|
12314475392U, 12322865024U, 12331253632U, 12339640448U, 12348029312U,
|
||||||
|
12356418944U, 12364805248U, 12373196672U, 12381580928U, 12389969024U,
|
||||||
|
12398357632U, 12406750592U, 12415138432U, 12423527552U, 12431916416U,
|
||||||
|
12440304512U, 12448692352U, 12457081216U, 12465467776U, 12473859968U,
|
||||||
|
12482245504U, 12490636672U, 12499025536U, 12507411584U, 12515801728U,
|
||||||
|
12524190592U, 12532577152U, 12540966272U, 12549354368U, 12557743232U,
|
||||||
|
12566129536U, 12574523264U, 12582911872U, 12591299456U, 12599688064U,
|
||||||
|
12608074624U, 12616463488U, 12624845696U, 12633239936U, 12641631616U,
|
||||||
|
12650019968U, 12658407296U, 12666795136U, 12675183232U, 12683574656U,
|
||||||
|
12691960192U, 12700350592U, 12708740224U, 12717128576U, 12725515904U,
|
||||||
|
12733906816U, 12742295168U, 12750680192U, 12759071872U, 12767460736U,
|
||||||
|
12775848832U, 12784236928U, 12792626816U, 12801014656U, 12809404288U,
|
||||||
|
12817789312U, 12826181504U, 12834568832U, 12842954624U, 12851345792U,
|
||||||
|
12859732352U, 12868122496U, 12876512128U, 12884901248U, 12893289088U,
|
||||||
|
12901672832U, 12910067584U, 12918455168U, 12926842496U, 12935232896U,
|
||||||
|
12943620736U, 12952009856U, 12960396928U, 12968786816U, 12977176192U,
|
||||||
|
12985563776U, 12993951104U, 13002341504U, 13010730368U, 13019115392U,
|
||||||
|
13027506304U, 13035895168U, 13044272512U, 13052673152U, 13061062528U,
|
||||||
|
13069446272U, 13077838976U, 13086227072U, 13094613632U, 13103000192U,
|
||||||
|
13111393664U, 13119782528U, 13128157568U, 13136559232U, 13144945024U,
|
||||||
|
13153329536U, 13161724288U, 13170111872U, 13178502784U, 13186884736U,
|
||||||
|
13195279744U, 13203667072U, 13212057472U, 13220445824U, 13228832128U,
|
||||||
|
13237221248U, 13245610624U, 13254000512U, 13262388352U, 13270777472U,
|
||||||
|
13279166336U, 13287553408U, 13295943296U, 13304331904U, 13312719488U,
|
||||||
|
13321108096U, 13329494656U, 13337885824U, 13346274944U, 13354663808U,
|
||||||
|
13363051136U, 13371439232U, 13379825024U, 13388210816U, 13396605056U,
|
||||||
|
13404995456U, 13413380224U, 13421771392U, 13430159744U, 13438546048U,
|
||||||
|
13446937216U, 13455326848U, 13463708288U, 13472103808U, 13480492672U,
|
||||||
|
13488875648U, 13497269888U, 13505657728U, 13514045312U, 13522435712U,
|
||||||
|
13530824576U, 13539210112U, 13547599232U, 13555989376U, 13564379008U,
|
||||||
|
13572766336U, 13581154432U, 13589544832U, 13597932928U, 13606320512U,
|
||||||
|
13614710656U, 13623097472U, 13631477632U, 13639874944U, 13648264064U,
|
||||||
|
13656652928U, 13665041792U, 13673430656U, 13681818496U, 13690207616U,
|
||||||
|
13698595712U, 13706982272U, 13715373184U, 13723762048U, 13732150144U,
|
||||||
|
13740536704U, 13748926592U, 13757316224U, 13765700992U, 13774090112U,
|
||||||
|
13782477952U, 13790869376U, 13799259008U, 13807647872U, 13816036736U,
|
||||||
|
13824425344U, 13832814208U, 13841202304U, 13849591424U, 13857978752U,
|
||||||
|
13866368896U, 13874754688U, 13883145344U, 13891533184U, 13899919232U,
|
||||||
|
13908311168U, 13916692096U, 13925085056U, 13933473152U, 13941866368U,
|
||||||
|
13950253696U, 13958643584U, 13967032192U, 13975417216U, 13983807616U,
|
||||||
|
13992197504U, 14000582272U, 14008973696U, 14017363072U, 14025752192U,
|
||||||
|
14034137984U, 14042528384U, 14050918016U, 14059301504U, 14067691648U,
|
||||||
|
14076083584U, 14084470144U, 14092852352U, 14101249664U, 14109635968U,
|
||||||
|
14118024832U, 14126407552U, 14134804352U, 14143188608U, 14151577984U,
|
||||||
|
14159968384U, 14168357248U, 14176741504U, 14185127296U, 14193521024U,
|
||||||
|
14201911424U, 14210301824U, 14218685056U, 14227067264U, 14235467392U,
|
||||||
|
14243855488U, 14252243072U, 14260630144U, 14269021568U, 14277409408U,
|
||||||
|
14285799296U, 14294187904U, 14302571392U, 14310961792U, 14319353728U,
|
||||||
|
14327738752U, 14336130944U, 14344518784U, 14352906368U, 14361296512U,
|
||||||
|
14369685376U, 14378071424U, 14386462592U, 14394848128U, 14403230848U,
|
||||||
|
14411627392U, 14420013952U, 14428402304U, 14436793472U, 14445181568U,
|
||||||
|
14453569664U, 14461959808U, 14470347904U, 14478737024U, 14487122816U,
|
||||||
|
14495511424U, 14503901824U, 14512291712U, 14520677504U, 14529064832U,
|
||||||
|
14537456768U, 14545845632U, 14554234496U, 14562618496U, 14571011456U,
|
||||||
|
14579398784U, 14587789184U, 14596172672U, 14604564608U, 14612953984U,
|
||||||
|
14621341312U, 14629724288U, 14638120832U, 14646503296U, 14654897536U,
|
||||||
|
14663284864U, 14671675264U, 14680061056U, 14688447616U, 14696835968U,
|
||||||
|
14705228416U, 14713616768U, 14722003328U, 14730392192U, 14738784128U,
|
||||||
|
14747172736U, 14755561088U, 14763947648U, 14772336512U, 14780725376U,
|
||||||
|
14789110144U, 14797499776U, 14805892736U, 14814276992U, 14822670208U,
|
||||||
|
14831056256U, 14839444352U, 14847836032U, 14856222848U, 14864612992U,
|
||||||
|
14872997504U, 14881388672U, 14889775744U, 14898165376U, 14906553472U,
|
||||||
|
14914944896U, 14923329664U, 14931721856U, 14940109696U, 14948497024U,
|
||||||
|
14956887424U, 14965276544U, 14973663616U, 14982053248U, 14990439808U,
|
||||||
|
14998830976U, 15007216768U, 15015605888U, 15023995264U, 15032385152U,
|
||||||
|
15040768384U, 15049154944U, 15057549184U, 15065939072U, 15074328448U,
|
||||||
|
15082715008U, 15091104128U, 15099493504U, 15107879296U, 15116269184U,
|
||||||
|
15124659584U, 15133042304U, 15141431936U, 15149824384U, 15158214272U,
|
||||||
|
15166602368U, 15174991232U, 15183378304U, 15191760512U, 15200154496U,
|
||||||
|
15208542592U, 15216931712U, 15225323392U, 15233708416U, 15242098048U,
|
||||||
|
15250489216U, 15258875264U, 15267265408U, 15275654528U, 15284043136U,
|
||||||
|
15292431488U, 15300819584U, 15309208192U, 15317596544U, 15325986176U,
|
||||||
|
15334374784U, 15342763648U, 15351151744U, 15359540608U, 15367929728U,
|
||||||
|
15376318336U, 15384706432U, 15393092992U, 15401481856U, 15409869952U,
|
||||||
|
15418258816U, 15426649984U, 15435037568U, 15443425664U, 15451815296U,
|
||||||
|
15460203392U, 15468589184U, 15476979328U, 15485369216U, 15493755776U,
|
||||||
|
15502146944U, 15510534272U, 15518924416U, 15527311232U, 15535699072U,
|
||||||
|
15544089472U, 15552478336U, 15560866688U, 15569254528U, 15577642624U,
|
||||||
|
15586031488U, 15594419072U, 15602809472U, 15611199104U, 15619586432U,
|
||||||
|
15627975296U, 15636364928U, 15644753792U, 15653141888U, 15661529216U,
|
||||||
|
15669918848U, 15678305152U, 15686696576U, 15695083136U, 15703474048U,
|
||||||
|
15711861632U, 15720251264U, 15728636288U, 15737027456U, 15745417088U,
|
||||||
|
15753804928U, 15762194048U, 15770582656U, 15778971008U, 15787358336U,
|
||||||
|
15795747712U, 15804132224U, 15812523392U, 15820909696U, 15829300096U,
|
||||||
|
15837691264U, 15846071936U, 15854466944U, 15862855808U, 15871244672U,
|
||||||
|
15879634816U, 15888020608U, 15896409728U, 15904799104U, 15913185152U,
|
||||||
|
15921577088U, 15929966464U, 15938354816U, 15946743424U, 15955129472U,
|
||||||
|
15963519872U, 15971907968U, 15980296064U, 15988684928U, 15997073024U,
|
||||||
|
16005460864U, 16013851264U, 16022241152U, 16030629248U, 16039012736U,
|
||||||
|
16047406976U, 16055794816U, 16064181376U, 16072571264U, 16080957824U,
|
||||||
|
16089346688U, 16097737856U, 16106125184U, 16114514816U, 16122904192U,
|
||||||
|
16131292544U, 16139678848U, 16148066944U, 16156453504U, 16164839552U,
|
||||||
|
16173236096U, 16181623424U, 16190012032U, 16198401152U, 16206790528U,
|
||||||
|
16215177344U, 16223567744U, 16231956352U, 16240344704U, 16248731008U,
|
||||||
|
16257117824U, 16265504384U, 16273898624U, 16282281856U, 16290668672U,
|
||||||
|
16299064192U, 16307449216U, 16315842176U, 16324230016U, 16332613504U,
|
||||||
|
16341006464U, 16349394304U, 16357783168U, 16366172288U, 16374561664U,
|
||||||
|
16382951296U, 16391337856U, 16399726208U, 16408116352U, 16416505472U,
|
||||||
|
16424892032U, 16433282176U, 16441668224U, 16450058624U, 16458448768U,
|
||||||
|
16466836864U, 16475224448U, 16483613056U, 16492001408U, 16500391808U,
|
||||||
|
16508779648U, 16517166976U, 16525555328U, 16533944192U, 16542330752U,
|
||||||
|
16550719616U, 16559110528U, 16567497088U, 16575888512U, 16584274816U,
|
||||||
|
16592665472U, 16601051008U, 16609442944U, 16617832064U, 16626218624U,
|
||||||
|
16634607488U, 16642996096U, 16651385728U, 16659773824U, 16668163712U,
|
||||||
|
16676552576U, 16684938112U, 16693328768U, 16701718144U, 16710095488U,
|
||||||
|
16718492288U, 16726883968U, 16735272832U, 16743661184U, 16752049792U,
|
||||||
|
16760436608U, 16768827008U, 16777214336U, 16785599104U, 16793992832U,
|
||||||
|
16802381696U, 16810768768U, 16819151744U, 16827542656U, 16835934848U,
|
||||||
|
16844323712U, 16852711552U, 16861101952U, 16869489536U, 16877876864U,
|
||||||
|
16886265728U, 16894653056U, 16903044736U, 16911431296U, 16919821696U,
|
||||||
|
16928207488U, 16936592768U, 16944987776U, 16953375616U, 16961763968U,
|
||||||
|
16970152832U, 16978540928U, 16986929536U, 16995319168U, 17003704448U,
|
||||||
|
17012096896U, 17020481152U, 17028870784U, 17037262208U, 17045649536U,
|
||||||
|
17054039936U, 17062426496U, 17070814336U, 17079205504U, 17087592064U,
|
||||||
|
17095978112U, 17104369024U, 17112759424U, 17121147776U, 17129536384U,
|
||||||
|
17137926016U, 17146314368U, 17154700928U, 17163089792U, 17171480192U,
|
||||||
|
17179864192U, 17188256896U, 17196644992U, 17205033856U, 17213423488U,
|
||||||
|
17221811072U, 17230198912U, 17238588032U, 17246976896U, 17255360384U,
|
||||||
|
17263754624U, 17272143232U, 17280530048U, 17288918912U, 17297309312U,
|
||||||
|
17305696384U, 17314085504U, 17322475136U, 17330863744U, 17339252096U,
|
||||||
|
17347640192U, 17356026496U, 17364413824U, 17372796544U, 17381190016U,
|
||||||
|
17389583488U, 17397972608U, 17406360704U, 17414748544U, 17423135872U,
|
||||||
|
17431527296U, 17439915904U, 17448303232U, 17456691584U, 17465081728U,
|
||||||
|
17473468288U, 17481857408U, 17490247552U, 17498635904U, 17507022464U,
|
||||||
|
17515409024U, 17523801728U, 17532189824U, 17540577664U, 17548966016U,
|
||||||
|
17557353344U, 17565741184U, 17574131584U, 17582519168U, 17590907008U,
|
||||||
|
17599296128U, 17607687808U, 17616076672U, 17624455808U, 17632852352U,
|
||||||
|
17641238656U, 17649630848U, 17658018944U, 17666403968U, 17674794112U,
|
||||||
|
17683178368U, 17691573376U, 17699962496U, 17708350592U, 17716739968U,
|
||||||
|
17725126528U, 17733517184U, 17741898112U, 17750293888U, 17758673024U,
|
||||||
|
17767070336U, 17775458432U, 17783848832U, 17792236928U, 17800625536U,
|
||||||
|
17809012352U, 17817402752U, 17825785984U, 17834178944U, 17842563968U,
|
||||||
|
17850955648U, 17859344512U, 17867732864U, 17876119424U, 17884511872U,
|
||||||
|
17892900224U, 17901287296U, 17909677696U, 17918058112U, 17926451072U,
|
||||||
|
17934843776U, 17943230848U, 17951609216U, 17960008576U, 17968397696U,
|
||||||
|
17976784256U, 17985175424U, 17993564032U, 18001952128U, 18010339712U,
|
||||||
|
18018728576U, 18027116672U, 18035503232U, 18043894144U, 18052283264U,
|
||||||
|
18060672128U, 18069056384U, 18077449856U, 18085837184U, 18094225792U,
|
||||||
|
18102613376U, 18111004544U, 18119388544U, 18127781248U, 18136170368U,
|
||||||
|
18144558976U, 18152947328U, 18161336192U, 18169724288U, 18178108544U,
|
||||||
|
18186498944U, 18194886784U, 18203275648U, 18211666048U, 18220048768U,
|
||||||
|
18228444544U, 18236833408U, 18245220736U
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Generated with the following Mathematica Code:
|
||||||
|
|
||||||
|
// GetCacheSizes[n_] := Module[{
|
||||||
|
// DataSetSizeBytesInit = 2^30,
|
||||||
|
// MixBytes = 128,
|
||||||
|
// DataSetGrowth = 2^23,
|
||||||
|
// HashBytes = 64,
|
||||||
|
// CacheMultiplier = 1024,
|
||||||
|
// j = 0},
|
||||||
|
// Reap[
|
||||||
|
// While[j < n,
|
||||||
|
// Module[{i = Floor[(DataSetSizeBytesInit + DataSetGrowth * j) / (CacheMultiplier * HashBytes)]},
|
||||||
|
// While[! PrimeQ[i], i--];
|
||||||
|
// Sow[i*HashBytes]; j++]]]][[2]][[1]]
|
||||||
|
|
||||||
|
const uint64_t cache_sizes[2048] = {
|
||||||
|
16776896U, 16907456U, 17039296U, 17170112U, 17301056U, 17432512U, 17563072U,
|
||||||
|
17693888U, 17824192U, 17955904U, 18087488U, 18218176U, 18349504U, 18481088U,
|
||||||
|
18611392U, 18742336U, 18874304U, 19004224U, 19135936U, 19267264U, 19398208U,
|
||||||
|
19529408U, 19660096U, 19791424U, 19922752U, 20053952U, 20184896U, 20315968U,
|
||||||
|
20446912U, 20576576U, 20709184U, 20840384U, 20971072U, 21102272U, 21233216U,
|
||||||
|
21364544U, 21494848U, 21626816U, 21757376U, 21887552U, 22019392U, 22151104U,
|
||||||
|
22281536U, 22412224U, 22543936U, 22675264U, 22806464U, 22935872U, 23068096U,
|
||||||
|
23198272U, 23330752U, 23459008U, 23592512U, 23723968U, 23854912U, 23986112U,
|
||||||
|
24116672U, 24247616U, 24378688U, 24509504U, 24640832U, 24772544U, 24903488U,
|
||||||
|
25034432U, 25165376U, 25296704U, 25427392U, 25558592U, 25690048U, 25820096U,
|
||||||
|
25951936U, 26081728U, 26214208U, 26345024U, 26476096U, 26606656U, 26737472U,
|
||||||
|
26869184U, 26998208U, 27131584U, 27262528U, 27393728U, 27523904U, 27655744U,
|
||||||
|
27786688U, 27917888U, 28049344U, 28179904U, 28311488U, 28441792U, 28573504U,
|
||||||
|
28700864U, 28835648U, 28966208U, 29096768U, 29228608U, 29359808U, 29490752U,
|
||||||
|
29621824U, 29752256U, 29882816U, 30014912U, 30144448U, 30273728U, 30406976U,
|
||||||
|
30538432U, 30670784U, 30799936U, 30932672U, 31063744U, 31195072U, 31325248U,
|
||||||
|
31456192U, 31588288U, 31719232U, 31850432U, 31981504U, 32110784U, 32243392U,
|
||||||
|
32372672U, 32505664U, 32636608U, 32767808U, 32897344U, 33029824U, 33160768U,
|
||||||
|
33289664U, 33423296U, 33554368U, 33683648U, 33816512U, 33947456U, 34076992U,
|
||||||
|
34208704U, 34340032U, 34471744U, 34600256U, 34734016U, 34864576U, 34993984U,
|
||||||
|
35127104U, 35258176U, 35386688U, 35518528U, 35650624U, 35782336U, 35910976U,
|
||||||
|
36044608U, 36175808U, 36305728U, 36436672U, 36568384U, 36699968U, 36830656U,
|
||||||
|
36961984U, 37093312U, 37223488U, 37355072U, 37486528U, 37617472U, 37747904U,
|
||||||
|
37879232U, 38009792U, 38141888U, 38272448U, 38403392U, 38535104U, 38660672U,
|
||||||
|
38795584U, 38925632U, 39059264U, 39190336U, 39320768U, 39452096U, 39581632U,
|
||||||
|
39713984U, 39844928U, 39974848U, 40107968U, 40238144U, 40367168U, 40500032U,
|
||||||
|
40631744U, 40762816U, 40894144U, 41023552U, 41155904U, 41286208U, 41418304U,
|
||||||
|
41547712U, 41680448U, 41811904U, 41942848U, 42073792U, 42204992U, 42334912U,
|
||||||
|
42467008U, 42597824U, 42729152U, 42860096U, 42991552U, 43122368U, 43253696U,
|
||||||
|
43382848U, 43515712U, 43646912U, 43777088U, 43907648U, 44039104U, 44170432U,
|
||||||
|
44302144U, 44433344U, 44564288U, 44694976U, 44825152U, 44956864U, 45088448U,
|
||||||
|
45219008U, 45350464U, 45481024U, 45612608U, 45744064U, 45874496U, 46006208U,
|
||||||
|
46136768U, 46267712U, 46399424U, 46529344U, 46660672U, 46791488U, 46923328U,
|
||||||
|
47053504U, 47185856U, 47316928U, 47447872U, 47579072U, 47710144U, 47839936U,
|
||||||
|
47971648U, 48103232U, 48234176U, 48365248U, 48496192U, 48627136U, 48757312U,
|
||||||
|
48889664U, 49020736U, 49149248U, 49283008U, 49413824U, 49545152U, 49675712U,
|
||||||
|
49807168U, 49938368U, 50069056U, 50200256U, 50331584U, 50462656U, 50593472U,
|
||||||
|
50724032U, 50853952U, 50986048U, 51117632U, 51248576U, 51379904U, 51510848U,
|
||||||
|
51641792U, 51773248U, 51903296U, 52035136U, 52164032U, 52297664U, 52427968U,
|
||||||
|
52557376U, 52690112U, 52821952U, 52952896U, 53081536U, 53213504U, 53344576U,
|
||||||
|
53475776U, 53608384U, 53738816U, 53870528U, 54000832U, 54131776U, 54263744U,
|
||||||
|
54394688U, 54525248U, 54655936U, 54787904U, 54918592U, 55049152U, 55181248U,
|
||||||
|
55312064U, 55442752U, 55574336U, 55705024U, 55836224U, 55967168U, 56097856U,
|
||||||
|
56228672U, 56358592U, 56490176U, 56621888U, 56753728U, 56884928U, 57015488U,
|
||||||
|
57146816U, 57278272U, 57409216U, 57540416U, 57671104U, 57802432U, 57933632U,
|
||||||
|
58064576U, 58195264U, 58326976U, 58457408U, 58588864U, 58720192U, 58849984U,
|
||||||
|
58981696U, 59113024U, 59243456U, 59375552U, 59506624U, 59637568U, 59768512U,
|
||||||
|
59897792U, 60030016U, 60161984U, 60293056U, 60423872U, 60554432U, 60683968U,
|
||||||
|
60817216U, 60948032U, 61079488U, 61209664U, 61341376U, 61471936U, 61602752U,
|
||||||
|
61733696U, 61865792U, 61996736U, 62127808U, 62259136U, 62389568U, 62520512U,
|
||||||
|
62651584U, 62781632U, 62910784U, 63045056U, 63176128U, 63307072U, 63438656U,
|
||||||
|
63569216U, 63700928U, 63831616U, 63960896U, 64093888U, 64225088U, 64355392U,
|
||||||
|
64486976U, 64617664U, 64748608U, 64879424U, 65009216U, 65142464U, 65273792U,
|
||||||
|
65402816U, 65535424U, 65666752U, 65797696U, 65927744U, 66060224U, 66191296U,
|
||||||
|
66321344U, 66453056U, 66584384U, 66715328U, 66846656U, 66977728U, 67108672U,
|
||||||
|
67239104U, 67370432U, 67501888U, 67631296U, 67763776U, 67895104U, 68026304U,
|
||||||
|
68157248U, 68287936U, 68419264U, 68548288U, 68681408U, 68811968U, 68942912U,
|
||||||
|
69074624U, 69205568U, 69337024U, 69467584U, 69599168U, 69729472U, 69861184U,
|
||||||
|
69989824U, 70122944U, 70253888U, 70385344U, 70515904U, 70647232U, 70778816U,
|
||||||
|
70907968U, 71040832U, 71171648U, 71303104U, 71432512U, 71564992U, 71695168U,
|
||||||
|
71826368U, 71958464U, 72089536U, 72219712U, 72350144U, 72482624U, 72613568U,
|
||||||
|
72744512U, 72875584U, 73006144U, 73138112U, 73268672U, 73400128U, 73530944U,
|
||||||
|
73662272U, 73793344U, 73924544U, 74055104U, 74185792U, 74316992U, 74448832U,
|
||||||
|
74579392U, 74710976U, 74841664U, 74972864U, 75102784U, 75233344U, 75364544U,
|
||||||
|
75497024U, 75627584U, 75759296U, 75890624U, 76021696U, 76152256U, 76283072U,
|
||||||
|
76414144U, 76545856U, 76676672U, 76806976U, 76937792U, 77070016U, 77200832U,
|
||||||
|
77331392U, 77462464U, 77593664U, 77725376U, 77856448U, 77987776U, 78118336U,
|
||||||
|
78249664U, 78380992U, 78511424U, 78642496U, 78773056U, 78905152U, 79033664U,
|
||||||
|
79166656U, 79297472U, 79429568U, 79560512U, 79690816U, 79822784U, 79953472U,
|
||||||
|
80084672U, 80214208U, 80346944U, 80477632U, 80608576U, 80740288U, 80870848U,
|
||||||
|
81002048U, 81133504U, 81264448U, 81395648U, 81525952U, 81657536U, 81786304U,
|
||||||
|
81919808U, 82050112U, 82181312U, 82311616U, 82443968U, 82573376U, 82705984U,
|
||||||
|
82835776U, 82967744U, 83096768U, 83230528U, 83359552U, 83491264U, 83622464U,
|
||||||
|
83753536U, 83886016U, 84015296U, 84147776U, 84277184U, 84409792U, 84540608U,
|
||||||
|
84672064U, 84803008U, 84934336U, 85065152U, 85193792U, 85326784U, 85458496U,
|
||||||
|
85589312U, 85721024U, 85851968U, 85982656U, 86112448U, 86244416U, 86370112U,
|
||||||
|
86506688U, 86637632U, 86769344U, 86900672U, 87031744U, 87162304U, 87293632U,
|
||||||
|
87424576U, 87555392U, 87687104U, 87816896U, 87947968U, 88079168U, 88211264U,
|
||||||
|
88341824U, 88473152U, 88603712U, 88735424U, 88862912U, 88996672U, 89128384U,
|
||||||
|
89259712U, 89390272U, 89521984U, 89652544U, 89783872U, 89914816U, 90045376U,
|
||||||
|
90177088U, 90307904U, 90438848U, 90569152U, 90700096U, 90832832U, 90963776U,
|
||||||
|
91093696U, 91223744U, 91356992U, 91486784U, 91618496U, 91749824U, 91880384U,
|
||||||
|
92012224U, 92143552U, 92273344U, 92405696U, 92536768U, 92666432U, 92798912U,
|
||||||
|
92926016U, 93060544U, 93192128U, 93322816U, 93453632U, 93583936U, 93715136U,
|
||||||
|
93845056U, 93977792U, 94109504U, 94240448U, 94371776U, 94501184U, 94632896U,
|
||||||
|
94764224U, 94895552U, 95023424U, 95158208U, 95287744U, 95420224U, 95550016U,
|
||||||
|
95681216U, 95811904U, 95943872U, 96075328U, 96203584U, 96337856U, 96468544U,
|
||||||
|
96599744U, 96731072U, 96860992U, 96992576U, 97124288U, 97254848U, 97385536U,
|
||||||
|
97517248U, 97647808U, 97779392U, 97910464U, 98041408U, 98172608U, 98303168U,
|
||||||
|
98434496U, 98565568U, 98696768U, 98827328U, 98958784U, 99089728U, 99220928U,
|
||||||
|
99352384U, 99482816U, 99614272U, 99745472U, 99876416U, 100007104U,
|
||||||
|
100138048U, 100267072U, 100401088U, 100529984U, 100662592U, 100791872U,
|
||||||
|
100925248U, 101056064U, 101187392U, 101317952U, 101449408U, 101580608U,
|
||||||
|
101711296U, 101841728U, 101973824U, 102104896U, 102235712U, 102366016U,
|
||||||
|
102498112U, 102628672U, 102760384U, 102890432U, 103021888U, 103153472U,
|
||||||
|
103284032U, 103415744U, 103545152U, 103677248U, 103808576U, 103939648U,
|
||||||
|
104070976U, 104201792U, 104332736U, 104462528U, 104594752U, 104725952U,
|
||||||
|
104854592U, 104988608U, 105118912U, 105247808U, 105381184U, 105511232U,
|
||||||
|
105643072U, 105774784U, 105903296U, 106037056U, 106167872U, 106298944U,
|
||||||
|
106429504U, 106561472U, 106691392U, 106822592U, 106954304U, 107085376U,
|
||||||
|
107216576U, 107346368U, 107478464U, 107609792U, 107739712U, 107872192U,
|
||||||
|
108003136U, 108131392U, 108265408U, 108396224U, 108527168U, 108657344U,
|
||||||
|
108789568U, 108920384U, 109049792U, 109182272U, 109312576U, 109444928U,
|
||||||
|
109572928U, 109706944U, 109837888U, 109969088U, 110099648U, 110230976U,
|
||||||
|
110362432U, 110492992U, 110624704U, 110755264U, 110886208U, 111017408U,
|
||||||
|
111148864U, 111279296U, 111410752U, 111541952U, 111673024U, 111803456U,
|
||||||
|
111933632U, 112066496U, 112196416U, 112328512U, 112457792U, 112590784U,
|
||||||
|
112715968U, 112852672U, 112983616U, 113114944U, 113244224U, 113376448U,
|
||||||
|
113505472U, 113639104U, 113770304U, 113901376U, 114031552U, 114163264U,
|
||||||
|
114294592U, 114425536U, 114556864U, 114687424U, 114818624U, 114948544U,
|
||||||
|
115080512U, 115212224U, 115343296U, 115473472U, 115605184U, 115736128U,
|
||||||
|
115867072U, 115997248U, 116128576U, 116260288U, 116391488U, 116522944U,
|
||||||
|
116652992U, 116784704U, 116915648U, 117046208U, 117178304U, 117308608U,
|
||||||
|
117440192U, 117569728U, 117701824U, 117833024U, 117964096U, 118094656U,
|
||||||
|
118225984U, 118357312U, 118489024U, 118617536U, 118749632U, 118882112U,
|
||||||
|
119012416U, 119144384U, 119275328U, 119406016U, 119537344U, 119668672U,
|
||||||
|
119798464U, 119928896U, 120061376U, 120192832U, 120321728U, 120454336U,
|
||||||
|
120584512U, 120716608U, 120848192U, 120979136U, 121109056U, 121241408U,
|
||||||
|
121372352U, 121502912U, 121634752U, 121764416U, 121895744U, 122027072U,
|
||||||
|
122157632U, 122289088U, 122421184U, 122550592U, 122682944U, 122813888U,
|
||||||
|
122945344U, 123075776U, 123207488U, 123338048U, 123468736U, 123600704U,
|
||||||
|
123731264U, 123861952U, 123993664U, 124124608U, 124256192U, 124386368U,
|
||||||
|
124518208U, 124649024U, 124778048U, 124911296U, 125041088U, 125173696U,
|
||||||
|
125303744U, 125432896U, 125566912U, 125696576U, 125829056U, 125958592U,
|
||||||
|
126090304U, 126221248U, 126352832U, 126483776U, 126615232U, 126746432U,
|
||||||
|
126876608U, 127008704U, 127139392U, 127270336U, 127401152U, 127532224U,
|
||||||
|
127663552U, 127794752U, 127925696U, 128055232U, 128188096U, 128319424U,
|
||||||
|
128449856U, 128581312U, 128712256U, 128843584U, 128973632U, 129103808U,
|
||||||
|
129236288U, 129365696U, 129498944U, 129629888U, 129760832U, 129892288U,
|
||||||
|
130023104U, 130154048U, 130283968U, 130416448U, 130547008U, 130678336U,
|
||||||
|
130807616U, 130939456U, 131071552U, 131202112U, 131331776U, 131464384U,
|
||||||
|
131594048U, 131727296U, 131858368U, 131987392U, 132120256U, 132250816U,
|
||||||
|
132382528U, 132513728U, 132644672U, 132774976U, 132905792U, 133038016U,
|
||||||
|
133168832U, 133299392U, 133429312U, 133562048U, 133692992U, 133823296U,
|
||||||
|
133954624U, 134086336U, 134217152U, 134348608U, 134479808U, 134607296U,
|
||||||
|
134741056U, 134872384U, 135002944U, 135134144U, 135265472U, 135396544U,
|
||||||
|
135527872U, 135659072U, 135787712U, 135921472U, 136052416U, 136182848U,
|
||||||
|
136313792U, 136444864U, 136576448U, 136707904U, 136837952U, 136970048U,
|
||||||
|
137099584U, 137232064U, 137363392U, 137494208U, 137625536U, 137755712U,
|
||||||
|
137887424U, 138018368U, 138149824U, 138280256U, 138411584U, 138539584U,
|
||||||
|
138672832U, 138804928U, 138936128U, 139066688U, 139196864U, 139328704U,
|
||||||
|
139460032U, 139590208U, 139721024U, 139852864U, 139984576U, 140115776U,
|
||||||
|
140245696U, 140376512U, 140508352U, 140640064U, 140769856U, 140902336U,
|
||||||
|
141032768U, 141162688U, 141294016U, 141426496U, 141556544U, 141687488U,
|
||||||
|
141819584U, 141949888U, 142080448U, 142212544U, 142342336U, 142474432U,
|
||||||
|
142606144U, 142736192U, 142868288U, 142997824U, 143129408U, 143258944U,
|
||||||
|
143392448U, 143523136U, 143653696U, 143785024U, 143916992U, 144045632U,
|
||||||
|
144177856U, 144309184U, 144440768U, 144570688U, 144701888U, 144832448U,
|
||||||
|
144965056U, 145096384U, 145227584U, 145358656U, 145489856U, 145620928U,
|
||||||
|
145751488U, 145883072U, 146011456U, 146144704U, 146275264U, 146407232U,
|
||||||
|
146538176U, 146668736U, 146800448U, 146931392U, 147062336U, 147193664U,
|
||||||
|
147324224U, 147455936U, 147586624U, 147717056U, 147848768U, 147979456U,
|
||||||
|
148110784U, 148242368U, 148373312U, 148503232U, 148635584U, 148766144U,
|
||||||
|
148897088U, 149028416U, 149159488U, 149290688U, 149420224U, 149551552U,
|
||||||
|
149683136U, 149814976U, 149943616U, 150076352U, 150208064U, 150338624U,
|
||||||
|
150470464U, 150600256U, 150732224U, 150862784U, 150993088U, 151125952U,
|
||||||
|
151254976U, 151388096U, 151519168U, 151649728U, 151778752U, 151911104U,
|
||||||
|
152042944U, 152174144U, 152304704U, 152435648U, 152567488U, 152698816U,
|
||||||
|
152828992U, 152960576U, 153091648U, 153222976U, 153353792U, 153484096U,
|
||||||
|
153616192U, 153747008U, 153878336U, 154008256U, 154139968U, 154270912U,
|
||||||
|
154402624U, 154533824U, 154663616U, 154795712U, 154926272U, 155057984U,
|
||||||
|
155188928U, 155319872U, 155450816U, 155580608U, 155712064U, 155843392U,
|
||||||
|
155971136U, 156106688U, 156237376U, 156367424U, 156499264U, 156630976U,
|
||||||
|
156761536U, 156892352U, 157024064U, 157155008U, 157284416U, 157415872U,
|
||||||
|
157545536U, 157677248U, 157810496U, 157938112U, 158071744U, 158203328U,
|
||||||
|
158334656U, 158464832U, 158596288U, 158727616U, 158858048U, 158988992U,
|
||||||
|
159121216U, 159252416U, 159381568U, 159513152U, 159645632U, 159776192U,
|
||||||
|
159906496U, 160038464U, 160169536U, 160300352U, 160430656U, 160563008U,
|
||||||
|
160693952U, 160822208U, 160956352U, 161086784U, 161217344U, 161349184U,
|
||||||
|
161480512U, 161611456U, 161742272U, 161873216U, 162002752U, 162135872U,
|
||||||
|
162266432U, 162397888U, 162529216U, 162660032U, 162790976U, 162922048U,
|
||||||
|
163052096U, 163184576U, 163314752U, 163446592U, 163577408U, 163707968U,
|
||||||
|
163839296U, 163969984U, 164100928U, 164233024U, 164364224U, 164494912U,
|
||||||
|
164625856U, 164756672U, 164887616U, 165019072U, 165150016U, 165280064U,
|
||||||
|
165412672U, 165543104U, 165674944U, 165805888U, 165936832U, 166067648U,
|
||||||
|
166198336U, 166330048U, 166461248U, 166591552U, 166722496U, 166854208U,
|
||||||
|
166985408U, 167116736U, 167246656U, 167378368U, 167508416U, 167641024U,
|
||||||
|
167771584U, 167903168U, 168034112U, 168164032U, 168295744U, 168427456U,
|
||||||
|
168557632U, 168688448U, 168819136U, 168951616U, 169082176U, 169213504U,
|
||||||
|
169344832U, 169475648U, 169605952U, 169738048U, 169866304U, 169999552U,
|
||||||
|
170131264U, 170262464U, 170393536U, 170524352U, 170655424U, 170782016U,
|
||||||
|
170917696U, 171048896U, 171179072U, 171310784U, 171439936U, 171573184U,
|
||||||
|
171702976U, 171835072U, 171966272U, 172097216U, 172228288U, 172359232U,
|
||||||
|
172489664U, 172621376U, 172747712U, 172883264U, 173014208U, 173144512U,
|
||||||
|
173275072U, 173407424U, 173539136U, 173669696U, 173800768U, 173931712U,
|
||||||
|
174063424U, 174193472U, 174325696U, 174455744U, 174586816U, 174718912U,
|
||||||
|
174849728U, 174977728U, 175109696U, 175242688U, 175374272U, 175504832U,
|
||||||
|
175636288U, 175765696U, 175898432U, 176028992U, 176159936U, 176291264U,
|
||||||
|
176422592U, 176552512U, 176684864U, 176815424U, 176946496U, 177076544U,
|
||||||
|
177209152U, 177340096U, 177470528U, 177600704U, 177731648U, 177864256U,
|
||||||
|
177994816U, 178126528U, 178257472U, 178387648U, 178518464U, 178650176U,
|
||||||
|
178781888U, 178912064U, 179044288U, 179174848U, 179305024U, 179436736U,
|
||||||
|
179568448U, 179698496U, 179830208U, 179960512U, 180092608U, 180223808U,
|
||||||
|
180354752U, 180485696U, 180617152U, 180748096U, 180877504U, 181009984U,
|
||||||
|
181139264U, 181272512U, 181402688U, 181532608U, 181663168U, 181795136U,
|
||||||
|
181926592U, 182057536U, 182190016U, 182320192U, 182451904U, 182582336U,
|
||||||
|
182713792U, 182843072U, 182976064U, 183107264U, 183237056U, 183368384U,
|
||||||
|
183494848U, 183631424U, 183762752U, 183893824U, 184024768U, 184154816U,
|
||||||
|
184286656U, 184417984U, 184548928U, 184680128U, 184810816U, 184941248U,
|
||||||
|
185072704U, 185203904U, 185335616U, 185465408U, 185596352U, 185727296U,
|
||||||
|
185859904U, 185989696U, 186121664U, 186252992U, 186383552U, 186514112U,
|
||||||
|
186645952U, 186777152U, 186907328U, 187037504U, 187170112U, 187301824U,
|
||||||
|
187429184U, 187562048U, 187693504U, 187825472U, 187957184U, 188087104U,
|
||||||
|
188218304U, 188349376U, 188481344U, 188609728U, 188743616U, 188874304U,
|
||||||
|
189005248U, 189136448U, 189265088U, 189396544U, 189528128U, 189660992U,
|
||||||
|
189791936U, 189923264U, 190054208U, 190182848U, 190315072U, 190447424U,
|
||||||
|
190577984U, 190709312U, 190840768U, 190971328U, 191102656U, 191233472U,
|
||||||
|
191364032U, 191495872U, 191626816U, 191758016U, 191888192U, 192020288U,
|
||||||
|
192148928U, 192282176U, 192413504U, 192542528U, 192674752U, 192805952U,
|
||||||
|
192937792U, 193068608U, 193198912U, 193330496U, 193462208U, 193592384U,
|
||||||
|
193723456U, 193854272U, 193985984U, 194116672U, 194247232U, 194379712U,
|
||||||
|
194508352U, 194641856U, 194772544U, 194900672U, 195035072U, 195166016U,
|
||||||
|
195296704U, 195428032U, 195558592U, 195690304U, 195818176U, 195952576U,
|
||||||
|
196083392U, 196214336U, 196345792U, 196476736U, 196607552U, 196739008U,
|
||||||
|
196869952U, 197000768U, 197130688U, 197262784U, 197394368U, 197523904U,
|
||||||
|
197656384U, 197787584U, 197916608U, 198049472U, 198180544U, 198310208U,
|
||||||
|
198442432U, 198573632U, 198705088U, 198834368U, 198967232U, 199097792U,
|
||||||
|
199228352U, 199360192U, 199491392U, 199621696U, 199751744U, 199883968U,
|
||||||
|
200014016U, 200146624U, 200276672U, 200408128U, 200540096U, 200671168U,
|
||||||
|
200801984U, 200933312U, 201062464U, 201194944U, 201326144U, 201457472U,
|
||||||
|
201588544U, 201719744U, 201850816U, 201981632U, 202111552U, 202244032U,
|
||||||
|
202374464U, 202505152U, 202636352U, 202767808U, 202898368U, 203030336U,
|
||||||
|
203159872U, 203292608U, 203423296U, 203553472U, 203685824U, 203816896U,
|
||||||
|
203947712U, 204078272U, 204208192U, 204341056U, 204472256U, 204603328U,
|
||||||
|
204733888U, 204864448U, 204996544U, 205125568U, 205258304U, 205388864U,
|
||||||
|
205517632U, 205650112U, 205782208U, 205913536U, 206044736U, 206176192U,
|
||||||
|
206307008U, 206434496U, 206569024U, 206700224U, 206831168U, 206961856U,
|
||||||
|
207093056U, 207223616U, 207355328U, 207486784U, 207616832U, 207749056U,
|
||||||
|
207879104U, 208010048U, 208141888U, 208273216U, 208404032U, 208534336U,
|
||||||
|
208666048U, 208796864U, 208927424U, 209059264U, 209189824U, 209321792U,
|
||||||
|
209451584U, 209582656U, 209715136U, 209845568U, 209976896U, 210106432U,
|
||||||
|
210239296U, 210370112U, 210501568U, 210630976U, 210763712U, 210894272U,
|
||||||
|
211024832U, 211156672U, 211287616U, 211418176U, 211549376U, 211679296U,
|
||||||
|
211812032U, 211942592U, 212074432U, 212204864U, 212334016U, 212467648U,
|
||||||
|
212597824U, 212727616U, 212860352U, 212991424U, 213120832U, 213253952U,
|
||||||
|
213385024U, 213515584U, 213645632U, 213777728U, 213909184U, 214040128U,
|
||||||
|
214170688U, 214302656U, 214433728U, 214564544U, 214695232U, 214826048U,
|
||||||
|
214956992U, 215089088U, 215219776U, 215350592U, 215482304U, 215613248U,
|
||||||
|
215743552U, 215874752U, 216005312U, 216137024U, 216267328U, 216399296U,
|
||||||
|
216530752U, 216661696U, 216790592U, 216923968U, 217054528U, 217183168U,
|
||||||
|
217316672U, 217448128U, 217579072U, 217709504U, 217838912U, 217972672U,
|
||||||
|
218102848U, 218233024U, 218364736U, 218496832U, 218627776U, 218759104U,
|
||||||
|
218888896U, 219021248U, 219151936U, 219281728U, 219413056U, 219545024U,
|
||||||
|
219675968U, 219807296U, 219938624U, 220069312U, 220200128U, 220331456U,
|
||||||
|
220461632U, 220592704U, 220725184U, 220855744U, 220987072U, 221117888U,
|
||||||
|
221249216U, 221378368U, 221510336U, 221642048U, 221772736U, 221904832U,
|
||||||
|
222031808U, 222166976U, 222297536U, 222428992U, 222559936U, 222690368U,
|
||||||
|
222820672U, 222953152U, 223083968U, 223213376U, 223345984U, 223476928U,
|
||||||
|
223608512U, 223738688U, 223869376U, 224001472U, 224132672U, 224262848U,
|
||||||
|
224394944U, 224524864U, 224657344U, 224788288U, 224919488U, 225050432U,
|
||||||
|
225181504U, 225312704U, 225443776U, 225574592U, 225704768U, 225834176U,
|
||||||
|
225966784U, 226097216U, 226229824U, 226360384U, 226491712U, 226623424U,
|
||||||
|
226754368U, 226885312U, 227015104U, 227147456U, 227278528U, 227409472U,
|
||||||
|
227539904U, 227669696U, 227802944U, 227932352U, 228065216U, 228196288U,
|
||||||
|
228326464U, 228457792U, 228588736U, 228720064U, 228850112U, 228981056U,
|
||||||
|
229113152U, 229243328U, 229375936U, 229505344U, 229636928U, 229769152U,
|
||||||
|
229894976U, 230030272U, 230162368U, 230292416U, 230424512U, 230553152U,
|
||||||
|
230684864U, 230816704U, 230948416U, 231079616U, 231210944U, 231342016U,
|
||||||
|
231472448U, 231603776U, 231733952U, 231866176U, 231996736U, 232127296U,
|
||||||
|
232259392U, 232388672U, 232521664U, 232652608U, 232782272U, 232914496U,
|
||||||
|
233043904U, 233175616U, 233306816U, 233438528U, 233569984U, 233699776U,
|
||||||
|
233830592U, 233962688U, 234092224U, 234221888U, 234353984U, 234485312U,
|
||||||
|
234618304U, 234749888U, 234880832U, 235011776U, 235142464U, 235274048U,
|
||||||
|
235403456U, 235535936U, 235667392U, 235797568U, 235928768U, 236057152U,
|
||||||
|
236190272U, 236322752U, 236453312U, 236583616U, 236715712U, 236846528U,
|
||||||
|
236976448U, 237108544U, 237239104U, 237371072U, 237501632U, 237630784U,
|
||||||
|
237764416U, 237895232U, 238026688U, 238157632U, 238286912U, 238419392U,
|
||||||
|
238548032U, 238681024U, 238812608U, 238941632U, 239075008U, 239206336U,
|
||||||
|
239335232U, 239466944U, 239599168U, 239730496U, 239861312U, 239992384U,
|
||||||
|
240122816U, 240254656U, 240385856U, 240516928U, 240647872U, 240779072U,
|
||||||
|
240909632U, 241040704U, 241171904U, 241302848U, 241433408U, 241565248U,
|
||||||
|
241696192U, 241825984U, 241958848U, 242088256U, 242220224U, 242352064U,
|
||||||
|
242481856U, 242611648U, 242744896U, 242876224U, 243005632U, 243138496U,
|
||||||
|
243268672U, 243400384U, 243531712U, 243662656U, 243793856U, 243924544U,
|
||||||
|
244054592U, 244187072U, 244316608U, 244448704U, 244580032U, 244710976U,
|
||||||
|
244841536U, 244972864U, 245104448U, 245233984U, 245365312U, 245497792U,
|
||||||
|
245628736U, 245759936U, 245889856U, 246021056U, 246152512U, 246284224U,
|
||||||
|
246415168U, 246545344U, 246675904U, 246808384U, 246939584U, 247070144U,
|
||||||
|
247199552U, 247331648U, 247463872U, 247593536U, 247726016U, 247857088U,
|
||||||
|
247987648U, 248116928U, 248249536U, 248380736U, 248512064U, 248643008U,
|
||||||
|
248773312U, 248901056U, 249036608U, 249167552U, 249298624U, 249429184U,
|
||||||
|
249560512U, 249692096U, 249822784U, 249954112U, 250085312U, 250215488U,
|
||||||
|
250345792U, 250478528U, 250608704U, 250739264U, 250870976U, 251002816U,
|
||||||
|
251133632U, 251263552U, 251395136U, 251523904U, 251657792U, 251789248U,
|
||||||
|
251919424U, 252051392U, 252182464U, 252313408U, 252444224U, 252575552U,
|
||||||
|
252706624U, 252836032U, 252968512U, 253099712U, 253227584U, 253361728U,
|
||||||
|
253493056U, 253623488U, 253754432U, 253885504U, 254017216U, 254148032U,
|
||||||
|
254279488U, 254410432U, 254541376U, 254672576U, 254803264U, 254933824U,
|
||||||
|
255065792U, 255196736U, 255326528U, 255458752U, 255589952U, 255721408U,
|
||||||
|
255851072U, 255983296U, 256114624U, 256244416U, 256374208U, 256507712U,
|
||||||
|
256636096U, 256768832U, 256900544U, 257031616U, 257162176U, 257294272U,
|
||||||
|
257424448U, 257555776U, 257686976U, 257818432U, 257949632U, 258079552U,
|
||||||
|
258211136U, 258342464U, 258473408U, 258603712U, 258734656U, 258867008U,
|
||||||
|
258996544U, 259127744U, 259260224U, 259391296U, 259522112U, 259651904U,
|
||||||
|
259784384U, 259915328U, 260045888U, 260175424U, 260308544U, 260438336U,
|
||||||
|
260570944U, 260700992U, 260832448U, 260963776U, 261092672U, 261226304U,
|
||||||
|
261356864U, 261487936U, 261619648U, 261750592U, 261879872U, 262011968U,
|
||||||
|
262143424U, 262274752U, 262404416U, 262537024U, 262667968U, 262799296U,
|
||||||
|
262928704U, 263061184U, 263191744U, 263322944U, 263454656U, 263585216U,
|
||||||
|
263716672U, 263847872U, 263978944U, 264108608U, 264241088U, 264371648U,
|
||||||
|
264501184U, 264632768U, 264764096U, 264895936U, 265024576U, 265158464U,
|
||||||
|
265287488U, 265418432U, 265550528U, 265681216U, 265813312U, 265943488U,
|
||||||
|
266075968U, 266206144U, 266337728U, 266468032U, 266600384U, 266731072U,
|
||||||
|
266862272U, 266993344U, 267124288U, 267255616U, 267386432U, 267516992U,
|
||||||
|
267648704U, 267777728U, 267910592U, 268040512U, 268172096U, 268302784U,
|
||||||
|
268435264U, 268566208U, 268696256U, 268828096U, 268959296U, 269090368U,
|
||||||
|
269221312U, 269352256U, 269482688U, 269614784U, 269745856U, 269876416U,
|
||||||
|
270007616U, 270139328U, 270270272U, 270401216U, 270531904U, 270663616U,
|
||||||
|
270791744U, 270924736U, 271056832U, 271186112U, 271317184U, 271449536U,
|
||||||
|
271580992U, 271711936U, 271843136U, 271973056U, 272105408U, 272236352U,
|
||||||
|
272367296U, 272498368U, 272629568U, 272759488U, 272891456U, 273022784U,
|
||||||
|
273153856U, 273284672U, 273415616U, 273547072U, 273677632U, 273808448U,
|
||||||
|
273937088U, 274071488U, 274200896U, 274332992U, 274463296U, 274595392U,
|
||||||
|
274726208U, 274857536U, 274988992U, 275118656U, 275250496U, 275382208U,
|
||||||
|
275513024U, 275643968U, 275775296U, 275906368U, 276037184U, 276167872U,
|
||||||
|
276297664U, 276429376U, 276560576U, 276692672U, 276822976U, 276955072U,
|
||||||
|
277085632U, 277216832U, 277347008U, 277478848U, 277609664U, 277740992U,
|
||||||
|
277868608U, 278002624U, 278134336U, 278265536U, 278395328U, 278526784U,
|
||||||
|
278657728U, 278789824U, 278921152U, 279052096U, 279182912U, 279313088U,
|
||||||
|
279443776U, 279576256U, 279706048U, 279838528U, 279969728U, 280099648U,
|
||||||
|
280230976U, 280361408U, 280493632U, 280622528U, 280755392U, 280887104U,
|
||||||
|
281018176U, 281147968U, 281278912U, 281411392U, 281542592U, 281673152U,
|
||||||
|
281803712U, 281935552U, 282066496U, 282197312U, 282329024U, 282458816U,
|
||||||
|
282590272U, 282720832U, 282853184U, 282983744U, 283115072U, 283246144U,
|
||||||
|
283377344U, 283508416U, 283639744U, 283770304U, 283901504U, 284032576U,
|
||||||
|
284163136U, 284294848U, 284426176U, 284556992U, 284687296U, 284819264U,
|
||||||
|
284950208U, 285081536U
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
77
src/3rdparty/libethash/endian.h
vendored
Normal file
77
src/3rdparty/libethash/endian.h
vendored
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#if defined(__MINGW32__) || defined(_WIN32)
|
||||||
|
# define LITTLE_ENDIAN 1234
|
||||||
|
# define BYTE_ORDER LITTLE_ENDIAN
|
||||||
|
#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__)
|
||||||
|
# include <sys/endian.h>
|
||||||
|
#elif defined(__OpenBSD__) || defined(__SVR4)
|
||||||
|
# include <sys/types.h>
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
# include <machine/endian.h>
|
||||||
|
#elif defined( BSD ) && (BSD >= 199103)
|
||||||
|
# include <machine/endian.h>
|
||||||
|
#elif defined( __QNXNTO__ ) && defined( __LITTLEENDIAN__ )
|
||||||
|
# define LITTLE_ENDIAN 1234
|
||||||
|
# define BYTE_ORDER LITTLE_ENDIAN
|
||||||
|
#elif defined( __QNXNTO__ ) && defined( __BIGENDIAN__ )
|
||||||
|
# define BIG_ENDIAN 1234
|
||||||
|
# define BYTE_ORDER BIG_ENDIAN
|
||||||
|
#else
|
||||||
|
# include <endian.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_WIN32)
|
||||||
|
#include <stdlib.h>
|
||||||
|
#define ethash_swap_u32(input_) _byteswap_ulong(input_)
|
||||||
|
#define ethash_swap_u64(input_) _byteswap_uint64(input_)
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
#include <libkern/OSByteOrder.h>
|
||||||
|
#define ethash_swap_u32(input_) OSSwapInt32(input_)
|
||||||
|
#define ethash_swap_u64(input_) OSSwapInt64(input_)
|
||||||
|
#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__)
|
||||||
|
#define ethash_swap_u32(input_) bswap32(input_)
|
||||||
|
#define ethash_swap_u64(input_) bswap64(input_)
|
||||||
|
#elif defined(__OpenBSD__)
|
||||||
|
#include <endian.h>
|
||||||
|
#define ethash_swap_u32(input_) swap32(input_)
|
||||||
|
#define ethash_swap_u64(input_) swap64(input_)
|
||||||
|
#else // posix
|
||||||
|
#include <byteswap.h>
|
||||||
|
#define ethash_swap_u32(input_) bswap_32(input_)
|
||||||
|
#define ethash_swap_u64(input_) bswap_64(input_)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if LITTLE_ENDIAN == BYTE_ORDER
|
||||||
|
|
||||||
|
#define fix_endian32(dst_ ,src_) dst_ = src_
|
||||||
|
#define fix_endian32_same(val_)
|
||||||
|
#define fix_endian64(dst_, src_) dst_ = src_
|
||||||
|
#define fix_endian64_same(val_)
|
||||||
|
#define fix_endian_arr32(arr_, size_)
|
||||||
|
#define fix_endian_arr64(arr_, size_)
|
||||||
|
|
||||||
|
#elif BIG_ENDIAN == BYTE_ORDER
|
||||||
|
|
||||||
|
#define fix_endian32(dst_, src_) dst_ = ethash_swap_u32(src_)
|
||||||
|
#define fix_endian32_same(val_) val_ = ethash_swap_u32(val_)
|
||||||
|
#define fix_endian64(dst_, src_) dst_ = ethash_swap_u64(src_)
|
||||||
|
#define fix_endian64_same(val_) val_ = ethash_swap_u64(val_)
|
||||||
|
#define fix_endian_arr32(arr_, size_) \
|
||||||
|
do { \
|
||||||
|
for (unsigned i_ = 0; i_ < (size_); ++i_) { \
|
||||||
|
arr_[i_] = ethash_swap_u32(arr_[i_]); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
#define fix_endian_arr64(arr_, size_) \
|
||||||
|
do { \
|
||||||
|
for (unsigned i_ = 0; i_ < (size_); ++i_) { \
|
||||||
|
arr_[i_] = ethash_swap_u64(arr_[i_]); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
#else
|
||||||
|
# error "endian not supported"
|
||||||
|
#endif // BYTE_ORDER
|
||||||
158
src/3rdparty/libethash/ethash.h
vendored
Normal file
158
src/3rdparty/libethash/ethash.h
vendored
Normal file
@@ -0,0 +1,158 @@
|
|||||||
|
/*
|
||||||
|
This file is part of ethash.
|
||||||
|
|
||||||
|
ethash 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.
|
||||||
|
|
||||||
|
ethash 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 ethash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @file ethash.h
|
||||||
|
* @date 2015
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#define ETHASH_REVISION 23
|
||||||
|
#define ETHASH_DATASET_BYTES_INIT 1073741824U // 2**30
|
||||||
|
#define ETHASH_DATASET_BYTES_GROWTH 8388608U // 2**23
|
||||||
|
#define ETHASH_CACHE_BYTES_INIT 1073741824U // 2**24
|
||||||
|
#define ETHASH_CACHE_BYTES_GROWTH 131072U // 2**17
|
||||||
|
#define ETHASH_EPOCH_LENGTH 30000U
|
||||||
|
#define ETHASH_MIX_BYTES 128
|
||||||
|
#define ETHASH_HASH_BYTES 64
|
||||||
|
#define ETHASH_DATASET_PARENTS 256
|
||||||
|
#define ETHASH_CACHE_ROUNDS 3
|
||||||
|
#define ETHASH_ACCESSES 64
|
||||||
|
#define ETHASH_DAG_MAGIC_NUM_SIZE 8
|
||||||
|
#define ETHASH_DAG_MAGIC_NUM 0xFEE1DEADBADDCAFE
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/// Type of a seedhash/blockhash e.t.c.
|
||||||
|
typedef struct ethash_h256 { uint8_t b[32]; } ethash_h256_t;
|
||||||
|
|
||||||
|
// convenience macro to statically initialize an h256_t
|
||||||
|
// usage:
|
||||||
|
// ethash_h256_t a = ethash_h256_static_init(1, 2, 3, ... )
|
||||||
|
// have to provide all 32 values. If you don't provide all the rest
|
||||||
|
// will simply be unitialized (not guranteed to be 0)
|
||||||
|
#define ethash_h256_static_init(...) \
|
||||||
|
{ {__VA_ARGS__} }
|
||||||
|
|
||||||
|
struct ethash_light;
|
||||||
|
typedef struct ethash_light* ethash_light_t;
|
||||||
|
struct ethash_full;
|
||||||
|
typedef struct ethash_full* ethash_full_t;
|
||||||
|
typedef int(*ethash_callback_t)(unsigned);
|
||||||
|
|
||||||
|
typedef struct ethash_return_value {
|
||||||
|
ethash_h256_t result;
|
||||||
|
ethash_h256_t mix_hash;
|
||||||
|
bool success;
|
||||||
|
} ethash_return_value_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate and initialize a new ethash_light handler
|
||||||
|
*
|
||||||
|
* @param block_number The block number for which to create the handler
|
||||||
|
* @return Newly allocated ethash_light handler or NULL in case of
|
||||||
|
* ERRNOMEM or invalid parameters used for @ref ethash_compute_cache_nodes()
|
||||||
|
*/
|
||||||
|
ethash_light_t ethash_light_new(uint64_t block_number);
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
bool ethash_compute_cache_nodes(
|
||||||
|
void* nodes,
|
||||||
|
uint64_t cache_size,
|
||||||
|
ethash_h256_t const* seed
|
||||||
|
);
|
||||||
|
/**
|
||||||
|
* Frees a previously allocated ethash_light handler
|
||||||
|
* @param light The light handler to free
|
||||||
|
*/
|
||||||
|
void ethash_light_delete(ethash_light_t light);
|
||||||
|
/**
|
||||||
|
* Calculate the light client data
|
||||||
|
*
|
||||||
|
* @param light The light client handler
|
||||||
|
* @param header_hash The header hash to pack into the mix
|
||||||
|
* @param nonce The nonce to pack into the mix
|
||||||
|
* @return an object of ethash_return_value_t holding the return values
|
||||||
|
*/
|
||||||
|
ethash_return_value_t ethash_light_compute(
|
||||||
|
ethash_light_t light,
|
||||||
|
ethash_h256_t const header_hash,
|
||||||
|
uint64_t nonce
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate and initialize a new ethash_full handler
|
||||||
|
*
|
||||||
|
* @param light The light handler containing the cache.
|
||||||
|
* @param callback A callback function with signature of @ref ethash_callback_t
|
||||||
|
* It accepts an unsigned with which a progress of DAG calculation
|
||||||
|
* can be displayed. If all goes well the callback should return 0.
|
||||||
|
* If a non-zero value is returned then DAG generation will stop.
|
||||||
|
* Be advised. A progress value of 100 means that DAG creation is
|
||||||
|
* almost complete and that this function will soon return succesfully.
|
||||||
|
* It does not mean that the function has already had a succesfull return.
|
||||||
|
* @return Newly allocated ethash_full handler or NULL in case of
|
||||||
|
* ERRNOMEM or invalid parameters used for @ref ethash_compute_full_data()
|
||||||
|
*/
|
||||||
|
ethash_full_t ethash_full_new(ethash_light_t light, ethash_callback_t callback);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Frees a previously allocated ethash_full handler
|
||||||
|
* @param full The light handler to free
|
||||||
|
*/
|
||||||
|
void ethash_full_delete(ethash_full_t full);
|
||||||
|
/**
|
||||||
|
* Calculate the full client data
|
||||||
|
*
|
||||||
|
* @param full The full client handler
|
||||||
|
* @param header_hash The header hash to pack into the mix
|
||||||
|
* @param nonce The nonce to pack into the mix
|
||||||
|
* @return An object of ethash_return_value to hold the return value
|
||||||
|
*/
|
||||||
|
ethash_return_value_t ethash_full_compute(
|
||||||
|
ethash_full_t full,
|
||||||
|
ethash_h256_t const header_hash,
|
||||||
|
uint64_t nonce
|
||||||
|
);
|
||||||
|
/**
|
||||||
|
* Get a pointer to the full DAG data
|
||||||
|
*/
|
||||||
|
void const* ethash_full_dag(ethash_full_t full);
|
||||||
|
/**
|
||||||
|
* Get the size of the DAG data
|
||||||
|
*/
|
||||||
|
uint64_t ethash_full_dag_size(ethash_full_t full);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate the seedhash for a given epoch
|
||||||
|
*/
|
||||||
|
ethash_h256_t ethash_get_seedhash(uint64_t epoch);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* KeccakF800 for ProgPoW
|
||||||
|
*/
|
||||||
|
void ethash_keccakf800(uint32_t state[25]);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
463
src/3rdparty/libethash/ethash_internal.c
vendored
Normal file
463
src/3rdparty/libethash/ethash_internal.c
vendored
Normal file
@@ -0,0 +1,463 @@
|
|||||||
|
/*
|
||||||
|
This file is part of ethash.
|
||||||
|
|
||||||
|
ethash 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.
|
||||||
|
|
||||||
|
ethash 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 cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
/** @file internal.c
|
||||||
|
* @author Tim Hughes <tim@twistedfury.com>
|
||||||
|
* @author Matthew Wampler-Doty
|
||||||
|
* @date 2015
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "ethash.h"
|
||||||
|
#include "fnv.h"
|
||||||
|
#include "endian.h"
|
||||||
|
#include "ethash_internal.h"
|
||||||
|
#include "data_sizes.h"
|
||||||
|
#include "base/crypto/sha3.h"
|
||||||
|
|
||||||
|
#if defined(_M_X64) || defined(__x86_64__) || defined(__SSE2__)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#include <x86intrin.h>
|
||||||
|
#else
|
||||||
|
#include <intrin.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define kp_prefetch(x) _mm_prefetch((x), _MM_HINT_T0);
|
||||||
|
#else
|
||||||
|
#define kp_prefetch(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define SHA3_256(a, b, c) sha3_HashBuffer(256, SHA3_FLAGS_KECCAK, b, c, a, 32)
|
||||||
|
#define SHA3_512(a, b, c) sha3_HashBuffer(512, SHA3_FLAGS_KECCAK, b, c, a, 64)
|
||||||
|
|
||||||
|
uint64_t ethash_get_datasize(uint64_t const block_number)
|
||||||
|
{
|
||||||
|
assert(block_number / ETHASH_EPOCH_LENGTH < 2048);
|
||||||
|
return dag_sizes[block_number / ETHASH_EPOCH_LENGTH];
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t ethash_get_cachesize(uint64_t const block_number)
|
||||||
|
{
|
||||||
|
assert(block_number / ETHASH_EPOCH_LENGTH < 2048);
|
||||||
|
return cache_sizes[block_number / ETHASH_EPOCH_LENGTH];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Follows Sergio's "STRICT MEMORY HARD HASHING FUNCTIONS" (2014)
|
||||||
|
// https://bitslog.files.wordpress.com/2013/12/memohash-v0-3.pdf
|
||||||
|
// SeqMemoHash(s, R, N)
|
||||||
|
bool ethash_compute_cache_nodes(
|
||||||
|
void* nodes_ptr,
|
||||||
|
uint64_t cache_size,
|
||||||
|
ethash_h256_t const* seed
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (cache_size % sizeof(node) != 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
uint32_t const num_nodes = (uint32_t) (cache_size / sizeof(node));
|
||||||
|
|
||||||
|
node* nodes = (node*)nodes_ptr;
|
||||||
|
SHA3_512(nodes[0].bytes, (uint8_t*)seed, 32);
|
||||||
|
|
||||||
|
for (uint32_t i = 1; i != num_nodes; ++i) {
|
||||||
|
SHA3_512(nodes[i].bytes, nodes[i - 1].bytes, 64);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint32_t j = 0; j != ETHASH_CACHE_ROUNDS; j++) {
|
||||||
|
for (uint32_t i = 0; i != num_nodes; i++) {
|
||||||
|
uint32_t const idx = nodes[i].words[0] % num_nodes;
|
||||||
|
node data;
|
||||||
|
data = nodes[(num_nodes - 1 + i) % num_nodes];
|
||||||
|
for (uint32_t w = 0; w != NODE_WORDS; ++w) {
|
||||||
|
data.words[w] ^= nodes[idx].words[w];
|
||||||
|
}
|
||||||
|
SHA3_512(nodes[i].bytes, data.bytes, sizeof(data));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// now perform endian conversion
|
||||||
|
fix_endian_arr32(nodes->words, num_nodes * NODE_WORDS);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ethash_calculate_dag_item(
|
||||||
|
node* const ret,
|
||||||
|
uint32_t node_index,
|
||||||
|
uint32_t num_parents,
|
||||||
|
ethash_light_t const light
|
||||||
|
)
|
||||||
|
{
|
||||||
|
uint32_t num_parent_nodes = (uint32_t) (light->cache_size / sizeof(node));
|
||||||
|
node const* cache_nodes = (node const *) light->cache;
|
||||||
|
node const* init = &cache_nodes[node_index % num_parent_nodes];
|
||||||
|
memcpy(ret, init, sizeof(node));
|
||||||
|
ret->words[0] ^= node_index;
|
||||||
|
SHA3_512(ret->bytes, ret->bytes, sizeof(node));
|
||||||
|
#if defined(_M_X64) && ENABLE_SSE
|
||||||
|
__m128i const fnv_prime = _mm_set1_epi32(FNV_PRIME);
|
||||||
|
__m128i xmm0 = ret->xmm[0];
|
||||||
|
__m128i xmm1 = ret->xmm[1];
|
||||||
|
__m128i xmm2 = ret->xmm[2];
|
||||||
|
__m128i xmm3 = ret->xmm[3];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i != num_parents; ++i) {
|
||||||
|
uint32_t parent_index = fnv_hash(node_index ^ i, ret->words[i % NODE_WORDS]) % num_parent_nodes;
|
||||||
|
node const *parent = &cache_nodes[parent_index];
|
||||||
|
|
||||||
|
#if defined(_M_X64) && ENABLE_SSE
|
||||||
|
{
|
||||||
|
xmm0 = _mm_mullo_epi32(xmm0, fnv_prime);
|
||||||
|
xmm1 = _mm_mullo_epi32(xmm1, fnv_prime);
|
||||||
|
xmm2 = _mm_mullo_epi32(xmm2, fnv_prime);
|
||||||
|
xmm3 = _mm_mullo_epi32(xmm3, fnv_prime);
|
||||||
|
xmm0 = _mm_xor_si128(xmm0, parent->xmm[0]);
|
||||||
|
xmm1 = _mm_xor_si128(xmm1, parent->xmm[1]);
|
||||||
|
xmm2 = _mm_xor_si128(xmm2, parent->xmm[2]);
|
||||||
|
xmm3 = _mm_xor_si128(xmm3, parent->xmm[3]);
|
||||||
|
|
||||||
|
// have to write to ret as values are used to compute index
|
||||||
|
ret->xmm[0] = xmm0;
|
||||||
|
ret->xmm[1] = xmm1;
|
||||||
|
ret->xmm[2] = xmm2;
|
||||||
|
ret->xmm[3] = xmm3;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
for (unsigned w = 0; w != NODE_WORDS; ++w) {
|
||||||
|
ret->words[w] = fnv_hash(ret->words[w], parent->words[w]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
SHA3_512(ret->bytes, ret->bytes, sizeof(node));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint32_t fast_mod(uint64_t a, uint64_t d, uint64_t r, uint64_t i, uint64_t s)
|
||||||
|
{
|
||||||
|
const uint32_t q = ((a + i) * r) >> s;
|
||||||
|
return a - q * d;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ethash_calculate_dag_item_opt(
|
||||||
|
node* const ret,
|
||||||
|
uint32_t node_index,
|
||||||
|
uint32_t num_parents,
|
||||||
|
ethash_light_t const light
|
||||||
|
)
|
||||||
|
{
|
||||||
|
node const* cache_nodes = (node const*)light->cache;
|
||||||
|
node const* init = &cache_nodes[fast_mod(node_index, light->num_parent_nodes, light->reciprocal, light->increment, light->shift)];
|
||||||
|
memcpy(ret, init, sizeof(node));
|
||||||
|
ret->words[0] ^= node_index;
|
||||||
|
SHA3_512(ret->bytes, ret->bytes, sizeof(node));
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i != num_parents; ++i) {
|
||||||
|
uint32_t parent_index = fast_mod(fnv_hash(node_index ^ i, ret->words[i % NODE_WORDS]), light->num_parent_nodes, light->reciprocal, light->increment, light->shift);
|
||||||
|
node const* parent = &cache_nodes[parent_index];
|
||||||
|
for (unsigned w = 0; w != NODE_WORDS; ++w) {
|
||||||
|
ret->words[w] = fnv_hash(ret->words[w], parent->words[w]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SHA3_512(ret->bytes, ret->bytes, sizeof(node));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ethash_calculate_dag_item4_opt(
|
||||||
|
node* ret,
|
||||||
|
uint32_t node_index,
|
||||||
|
uint32_t num_parents,
|
||||||
|
ethash_light_t const light
|
||||||
|
)
|
||||||
|
{
|
||||||
|
node const* cache_nodes = (node const*)light->cache;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < 4; ++i) {
|
||||||
|
node const* init = &cache_nodes[fast_mod(node_index + i, light->num_parent_nodes, light->reciprocal, light->increment, light->shift)];
|
||||||
|
memcpy(ret + i, init, sizeof(node));
|
||||||
|
ret[i].words[0] ^= node_index + i;
|
||||||
|
SHA3_512(ret[i].bytes, ret[i].bytes, sizeof(node));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i != num_parents; ++i) {
|
||||||
|
node const* parent[4];
|
||||||
|
|
||||||
|
for (uint32_t j = 0; j < 4; ++j) {
|
||||||
|
const uint32_t parent_index = fast_mod(fnv_hash((node_index + j) ^ i, ret[j].words[i % NODE_WORDS]), light->num_parent_nodes, light->reciprocal, light->increment, light->shift);
|
||||||
|
parent[j] = &cache_nodes[parent_index];
|
||||||
|
kp_prefetch(parent[j]);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (unsigned w = 0; w != NODE_WORDS; ++w) ret[0].words[w] = fnv_hash(ret[0].words[w], parent[0]->words[w]);
|
||||||
|
for (unsigned w = 0; w != NODE_WORDS; ++w) ret[1].words[w] = fnv_hash(ret[1].words[w], parent[1]->words[w]);
|
||||||
|
for (unsigned w = 0; w != NODE_WORDS; ++w) ret[2].words[w] = fnv_hash(ret[2].words[w], parent[2]->words[w]);
|
||||||
|
for (unsigned w = 0; w != NODE_WORDS; ++w) ret[3].words[w] = fnv_hash(ret[3].words[w], parent[3]->words[w]);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i < 4; ++i) {
|
||||||
|
SHA3_512(ret[i].bytes, ret[i].bytes, sizeof(node));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ethash_compute_full_data(
|
||||||
|
void* mem,
|
||||||
|
uint64_t full_size,
|
||||||
|
ethash_light_t const light,
|
||||||
|
ethash_callback_t callback
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (full_size % (sizeof(uint32_t) * MIX_WORDS) != 0 ||
|
||||||
|
(full_size % sizeof(node)) != 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
uint32_t const max_n = (uint32_t)(full_size / sizeof(node));
|
||||||
|
node* full_nodes = (node*) mem;
|
||||||
|
double const progress_change = 1.0f / max_n;
|
||||||
|
double progress = 0.0f;
|
||||||
|
// now compute full nodes
|
||||||
|
for (uint32_t n = 0; n != max_n; ++n) {
|
||||||
|
if (callback &&
|
||||||
|
n % (max_n / 100) == 0 &&
|
||||||
|
callback((unsigned int)(ceil(progress * 100.0f))) != 0) {
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
progress += progress_change;
|
||||||
|
ethash_calculate_dag_item(&(full_nodes[n]), n, ETHASH_DATASET_PARENTS, light);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ethash_hash(
|
||||||
|
ethash_return_value_t* ret,
|
||||||
|
node const* full_nodes,
|
||||||
|
ethash_light_t const light,
|
||||||
|
uint64_t full_size,
|
||||||
|
ethash_h256_t const header_hash,
|
||||||
|
uint64_t const nonce
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (full_size % MIX_WORDS != 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// pack hash and nonce together into first 40 bytes of s_mix
|
||||||
|
assert(sizeof(node) * 8 == 512);
|
||||||
|
node s_mix[MIX_NODES + 1];
|
||||||
|
memcpy(s_mix[0].bytes, &header_hash, 32);
|
||||||
|
fix_endian64(s_mix[0].double_words[4], nonce);
|
||||||
|
|
||||||
|
// compute sha3-512 hash and replicate across mix
|
||||||
|
SHA3_512(s_mix->bytes, s_mix->bytes, 40);
|
||||||
|
fix_endian_arr32(s_mix[0].words, 16);
|
||||||
|
|
||||||
|
node* const mix = s_mix + 1;
|
||||||
|
for (uint32_t w = 0; w != MIX_WORDS; ++w) {
|
||||||
|
mix->words[w] = s_mix[0].words[w % NODE_WORDS];
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned const page_size = sizeof(uint32_t) * MIX_WORDS;
|
||||||
|
unsigned const num_full_pages = (unsigned) (full_size / page_size);
|
||||||
|
|
||||||
|
for (unsigned i = 0; i != ETHASH_ACCESSES; ++i) {
|
||||||
|
uint32_t const index = fnv_hash(s_mix->words[0] ^ i, mix->words[i % MIX_WORDS]) % num_full_pages;
|
||||||
|
|
||||||
|
for (unsigned n = 0; n != MIX_NODES; ++n) {
|
||||||
|
node const* dag_node;
|
||||||
|
node tmp_node;
|
||||||
|
if (full_nodes) {
|
||||||
|
dag_node = &full_nodes[MIX_NODES * index + n];
|
||||||
|
} else {
|
||||||
|
ethash_calculate_dag_item(&tmp_node, index * MIX_NODES + n, ETHASH_DATASET_PARENTS, light);
|
||||||
|
dag_node = &tmp_node;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(_M_X64) && ENABLE_SSE
|
||||||
|
{
|
||||||
|
__m128i fnv_prime = _mm_set1_epi32(FNV_PRIME);
|
||||||
|
__m128i xmm0 = _mm_mullo_epi32(fnv_prime, mix[n].xmm[0]);
|
||||||
|
__m128i xmm1 = _mm_mullo_epi32(fnv_prime, mix[n].xmm[1]);
|
||||||
|
__m128i xmm2 = _mm_mullo_epi32(fnv_prime, mix[n].xmm[2]);
|
||||||
|
__m128i xmm3 = _mm_mullo_epi32(fnv_prime, mix[n].xmm[3]);
|
||||||
|
mix[n].xmm[0] = _mm_xor_si128(xmm0, dag_node->xmm[0]);
|
||||||
|
mix[n].xmm[1] = _mm_xor_si128(xmm1, dag_node->xmm[1]);
|
||||||
|
mix[n].xmm[2] = _mm_xor_si128(xmm2, dag_node->xmm[2]);
|
||||||
|
mix[n].xmm[3] = _mm_xor_si128(xmm3, dag_node->xmm[3]);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
for (unsigned w = 0; w != NODE_WORDS; ++w) {
|
||||||
|
mix[n].words[w] = fnv_hash(mix[n].words[w], dag_node->words[w]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// compress mix
|
||||||
|
for (uint32_t w = 0; w != MIX_WORDS; w += 4) {
|
||||||
|
uint32_t reduction = mix->words[w + 0];
|
||||||
|
reduction = reduction * FNV_PRIME ^ mix->words[w + 1];
|
||||||
|
reduction = reduction * FNV_PRIME ^ mix->words[w + 2];
|
||||||
|
reduction = reduction * FNV_PRIME ^ mix->words[w + 3];
|
||||||
|
mix->words[w / 4] = reduction;
|
||||||
|
}
|
||||||
|
|
||||||
|
fix_endian_arr32(mix->words, MIX_WORDS / 4);
|
||||||
|
memcpy(&ret->mix_hash, mix->bytes, 32);
|
||||||
|
// final Keccak hash
|
||||||
|
SHA3_256(&ret->result, s_mix->bytes, 64 + 32); // Keccak-256(s + compressed_mix)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ethash_quick_hash(
|
||||||
|
ethash_h256_t* return_hash,
|
||||||
|
ethash_h256_t const* header_hash,
|
||||||
|
uint64_t nonce,
|
||||||
|
ethash_h256_t const* mix_hash
|
||||||
|
)
|
||||||
|
{
|
||||||
|
uint8_t buf[64 + 32];
|
||||||
|
memcpy(buf, header_hash, 32);
|
||||||
|
fix_endian64_same(nonce);
|
||||||
|
memcpy(&(buf[32]), &nonce, 8);
|
||||||
|
SHA3_512(buf, buf, 40);
|
||||||
|
memcpy(&(buf[64]), mix_hash, 32);
|
||||||
|
SHA3_256(return_hash, buf, 64 + 32);
|
||||||
|
}
|
||||||
|
|
||||||
|
ethash_h256_t ethash_get_seedhash(uint64_t epoch)
|
||||||
|
{
|
||||||
|
ethash_h256_t ret;
|
||||||
|
ethash_h256_reset(&ret);
|
||||||
|
for (uint32_t i = 0; i < epoch; ++i)
|
||||||
|
SHA3_256(&ret, (uint8_t*)&ret, 32);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ethash_quick_check_difficulty(
|
||||||
|
ethash_h256_t const* header_hash,
|
||||||
|
uint64_t const nonce,
|
||||||
|
ethash_h256_t const* mix_hash,
|
||||||
|
ethash_h256_t const* boundary
|
||||||
|
)
|
||||||
|
{
|
||||||
|
ethash_h256_t return_hash;
|
||||||
|
ethash_quick_hash(&return_hash, header_hash, nonce, mix_hash);
|
||||||
|
return ethash_check_difficulty(&return_hash, boundary);
|
||||||
|
}
|
||||||
|
|
||||||
|
ethash_light_t ethash_light_new_internal(uint64_t cache_size, ethash_h256_t const* seed)
|
||||||
|
{
|
||||||
|
struct ethash_light *ret;
|
||||||
|
ret = (struct ethash_light*)calloc(sizeof(*ret), 1);
|
||||||
|
if (!ret) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
ret->cache = malloc((size_t)cache_size);
|
||||||
|
if (!ret->cache) {
|
||||||
|
goto fail_free_light;
|
||||||
|
}
|
||||||
|
node* nodes = (node*)ret->cache;
|
||||||
|
if (!ethash_compute_cache_nodes(nodes, cache_size, seed)) {
|
||||||
|
goto fail_free_cache_mem;
|
||||||
|
}
|
||||||
|
ret->cache_size = cache_size;
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
fail_free_cache_mem:
|
||||||
|
free(ret->cache);
|
||||||
|
fail_free_light:
|
||||||
|
free(ret);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ethash_light_t ethash_light_new(uint64_t block_number)
|
||||||
|
{
|
||||||
|
ethash_h256_t seedhash = ethash_get_seedhash(block_number / ETHASH_EPOCH_LENGTH);
|
||||||
|
ethash_light_t ret;
|
||||||
|
ret = ethash_light_new_internal(ethash_get_cachesize(block_number), &seedhash);
|
||||||
|
ret->block_number = block_number;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ethash_light_delete(ethash_light_t light)
|
||||||
|
{
|
||||||
|
if (light->cache) {
|
||||||
|
free(light->cache);
|
||||||
|
}
|
||||||
|
free(light);
|
||||||
|
}
|
||||||
|
|
||||||
|
ethash_return_value_t ethash_light_compute_internal(
|
||||||
|
ethash_light_t light,
|
||||||
|
uint64_t full_size,
|
||||||
|
ethash_h256_t const header_hash,
|
||||||
|
uint64_t nonce
|
||||||
|
)
|
||||||
|
{
|
||||||
|
ethash_return_value_t ret;
|
||||||
|
ret.success = true;
|
||||||
|
if (!ethash_hash(&ret, NULL, light, full_size, header_hash, nonce)) {
|
||||||
|
ret.success = false;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ethash_return_value_t ethash_light_compute(
|
||||||
|
ethash_light_t light,
|
||||||
|
ethash_h256_t const header_hash,
|
||||||
|
uint64_t nonce
|
||||||
|
)
|
||||||
|
{
|
||||||
|
uint64_t full_size = ethash_get_datasize(light->block_number);
|
||||||
|
return ethash_light_compute_internal(light, full_size, header_hash, nonce);
|
||||||
|
}
|
||||||
|
|
||||||
|
ethash_return_value_t ethash_full_compute(
|
||||||
|
ethash_full_t full,
|
||||||
|
ethash_h256_t const header_hash,
|
||||||
|
uint64_t nonce
|
||||||
|
)
|
||||||
|
{
|
||||||
|
ethash_return_value_t ret;
|
||||||
|
ret.success = true;
|
||||||
|
if (!ethash_hash(
|
||||||
|
&ret,
|
||||||
|
(node const*)full->data,
|
||||||
|
NULL,
|
||||||
|
full->file_size,
|
||||||
|
header_hash,
|
||||||
|
nonce)) {
|
||||||
|
ret.success = false;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void const* ethash_full_dag(ethash_full_t full)
|
||||||
|
{
|
||||||
|
return full->data;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t ethash_full_dag_size(ethash_full_t full)
|
||||||
|
{
|
||||||
|
return full->file_size;
|
||||||
|
}
|
||||||
199
src/3rdparty/libethash/ethash_internal.h
vendored
Normal file
199
src/3rdparty/libethash/ethash_internal.h
vendored
Normal file
@@ -0,0 +1,199 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "endian.h"
|
||||||
|
#include "ethash.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define ENABLE_SSE 0
|
||||||
|
|
||||||
|
#if defined(_M_X64) && ENABLE_SSE
|
||||||
|
#include <smmintrin.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// compile time settings
|
||||||
|
#define NODE_WORDS (64/4)
|
||||||
|
#define MIX_WORDS (ETHASH_MIX_BYTES/4)
|
||||||
|
#define MIX_NODES (MIX_WORDS / NODE_WORDS)
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
typedef union node {
|
||||||
|
uint8_t bytes[NODE_WORDS * 4];
|
||||||
|
uint32_t words[NODE_WORDS];
|
||||||
|
uint64_t double_words[NODE_WORDS / 2];
|
||||||
|
|
||||||
|
#if defined(_M_X64) && ENABLE_SSE
|
||||||
|
__m128i xmm[NODE_WORDS/4];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} node;
|
||||||
|
|
||||||
|
static inline uint8_t ethash_h256_get(ethash_h256_t const* hash, unsigned int i)
|
||||||
|
{
|
||||||
|
return hash->b[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void ethash_h256_set(ethash_h256_t* hash, unsigned int i, uint8_t v)
|
||||||
|
{
|
||||||
|
hash->b[i] = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void ethash_h256_reset(ethash_h256_t* hash)
|
||||||
|
{
|
||||||
|
memset(hash, 0, 32);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns if hash is less than or equal to boundary (2^256/difficulty)
|
||||||
|
static inline bool ethash_check_difficulty(
|
||||||
|
ethash_h256_t const* hash,
|
||||||
|
ethash_h256_t const* boundary
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// Boundary is big endian
|
||||||
|
for (int i = 0; i < 32; i++) {
|
||||||
|
if (ethash_h256_get(hash, i) == ethash_h256_get(boundary, i)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return ethash_h256_get(hash, i) < ethash_h256_get(boundary, i);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Difficulty quick check for POW preverification
|
||||||
|
*
|
||||||
|
* @param header_hash The hash of the header
|
||||||
|
* @param nonce The block's nonce
|
||||||
|
* @param mix_hash The mix digest hash
|
||||||
|
* @param boundary The boundary is defined as (2^256 / difficulty)
|
||||||
|
* @return true for succesful pre-verification and false otherwise
|
||||||
|
*/
|
||||||
|
bool ethash_quick_check_difficulty(
|
||||||
|
ethash_h256_t const* header_hash,
|
||||||
|
uint64_t const nonce,
|
||||||
|
ethash_h256_t const* mix_hash,
|
||||||
|
ethash_h256_t const* boundary
|
||||||
|
);
|
||||||
|
|
||||||
|
struct ethash_light {
|
||||||
|
void* cache;
|
||||||
|
uint64_t cache_size;
|
||||||
|
uint64_t block_number;
|
||||||
|
|
||||||
|
// Used for fast division
|
||||||
|
uint32_t num_parent_nodes;
|
||||||
|
uint32_t reciprocal;
|
||||||
|
uint32_t increment;
|
||||||
|
uint32_t shift;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate and initialize a new ethash_light handler. Internal version
|
||||||
|
*
|
||||||
|
* @param cache_size The size of the cache in bytes
|
||||||
|
* @param seed Block seedhash to be used during the computation of the
|
||||||
|
* cache nodes
|
||||||
|
* @return Newly allocated ethash_light handler or NULL in case of
|
||||||
|
* ERRNOMEM or invalid parameters used for @ref ethash_compute_cache_nodes()
|
||||||
|
*/
|
||||||
|
ethash_light_t ethash_light_new_internal(uint64_t cache_size, ethash_h256_t const* seed);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate the light client data. Internal version.
|
||||||
|
*
|
||||||
|
* @param light The light client handler
|
||||||
|
* @param full_size The size of the full data in bytes.
|
||||||
|
* @param header_hash The header hash to pack into the mix
|
||||||
|
* @param nonce The nonce to pack into the mix
|
||||||
|
* @return The resulting hash.
|
||||||
|
*/
|
||||||
|
ethash_return_value_t ethash_light_compute_internal(
|
||||||
|
ethash_light_t light,
|
||||||
|
uint64_t full_size,
|
||||||
|
ethash_h256_t const header_hash,
|
||||||
|
uint64_t nonce
|
||||||
|
);
|
||||||
|
|
||||||
|
struct ethash_full {
|
||||||
|
FILE* file;
|
||||||
|
uint64_t file_size;
|
||||||
|
node* data;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate and initialize a new ethash_full handler. Internal version.
|
||||||
|
*
|
||||||
|
* @param dirname The directory in which to put the DAG file.
|
||||||
|
* @param seedhash The seed hash of the block. Used in the DAG file naming.
|
||||||
|
* @param full_size The size of the full data in bytes.
|
||||||
|
* @param cache A cache object to use that was allocated with @ref ethash_cache_new().
|
||||||
|
* Iff this function succeeds the ethash_full_t will take memory
|
||||||
|
* memory ownership of the cache and free it at deletion. If
|
||||||
|
* not then the user still has to handle freeing of the cache himself.
|
||||||
|
* @param callback A callback function with signature of @ref ethash_callback_t
|
||||||
|
* It accepts an unsigned with which a progress of DAG calculation
|
||||||
|
* can be displayed. If all goes well the callback should return 0.
|
||||||
|
* If a non-zero value is returned then DAG generation will stop.
|
||||||
|
* @return Newly allocated ethash_full handler or NULL in case of
|
||||||
|
* ERRNOMEM or invalid parameters used for @ref ethash_compute_full_data()
|
||||||
|
*/
|
||||||
|
ethash_full_t ethash_full_new_internal(
|
||||||
|
char const* dirname,
|
||||||
|
ethash_h256_t const seed_hash,
|
||||||
|
uint64_t full_size,
|
||||||
|
ethash_light_t const light,
|
||||||
|
ethash_callback_t callback
|
||||||
|
);
|
||||||
|
|
||||||
|
void ethash_calculate_dag_item(
|
||||||
|
node* const ret,
|
||||||
|
uint32_t node_index,
|
||||||
|
uint32_t num_parents,
|
||||||
|
ethash_light_t const cache
|
||||||
|
);
|
||||||
|
|
||||||
|
void ethash_calculate_dag_item_opt(
|
||||||
|
node* const ret,
|
||||||
|
uint32_t node_index,
|
||||||
|
uint32_t num_parents,
|
||||||
|
ethash_light_t const cache
|
||||||
|
);
|
||||||
|
|
||||||
|
void ethash_calculate_dag_item4_opt(
|
||||||
|
node* ret,
|
||||||
|
uint32_t node_index,
|
||||||
|
uint32_t num_parents,
|
||||||
|
ethash_light_t const cache
|
||||||
|
);
|
||||||
|
|
||||||
|
void ethash_quick_hash(
|
||||||
|
ethash_h256_t* return_hash,
|
||||||
|
ethash_h256_t const* header_hash,
|
||||||
|
const uint64_t nonce,
|
||||||
|
ethash_h256_t const* mix_hash
|
||||||
|
);
|
||||||
|
|
||||||
|
uint64_t ethash_get_datasize(uint64_t const block_number);
|
||||||
|
uint64_t ethash_get_cachesize(uint64_t const block_number);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compute the memory data for a full node's memory
|
||||||
|
*
|
||||||
|
* @param mem A pointer to an ethash full's memory
|
||||||
|
* @param full_size The size of the full data in bytes
|
||||||
|
* @param cache A cache object to use in the calculation
|
||||||
|
* @param callback The callback function. Check @ref ethash_full_new() for details.
|
||||||
|
* @return true if all went fine and false for invalid parameters
|
||||||
|
*/
|
||||||
|
bool ethash_compute_full_data(
|
||||||
|
void* mem,
|
||||||
|
uint64_t full_size,
|
||||||
|
ethash_light_t const light,
|
||||||
|
ethash_callback_t callback
|
||||||
|
);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
42
src/3rdparty/libethash/fnv.h
vendored
Normal file
42
src/3rdparty/libethash/fnv.h
vendored
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
This file is part of cpp-ethereum.
|
||||||
|
|
||||||
|
cpp-ethereum 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.
|
||||||
|
|
||||||
|
cpp-ethereum 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 cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
/** @file fnv.h
|
||||||
|
* @author Matthew Wampler-Doty <negacthulhu@gmail.com>
|
||||||
|
* @date 2015
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define FNV_PRIME 0x01000193
|
||||||
|
|
||||||
|
/* The FNV-1 spec multiplies the prime with the input one byte (octet) in turn.
|
||||||
|
We instead multiply it with the full 32-bit input.
|
||||||
|
This gives a different result compared to a canonical FNV-1 implementation.
|
||||||
|
*/
|
||||||
|
static inline uint32_t fnv_hash(uint32_t const x, uint32_t const y)
|
||||||
|
{
|
||||||
|
return x * FNV_PRIME ^ y;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
253
src/3rdparty/libethash/keccakf800.c
vendored
Normal file
253
src/3rdparty/libethash/keccakf800.c
vendored
Normal file
@@ -0,0 +1,253 @@
|
|||||||
|
/* ethash: C/C++ implementation of Ethash, the Ethereum Proof of Work algorithm.
|
||||||
|
* Copyright 2018-2019 Pawel Bylica.
|
||||||
|
* Licensed under the Apache License, Version 2.0.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
static uint32_t rol(uint32_t x, unsigned s)
|
||||||
|
{
|
||||||
|
return (x << s) | (x >> (32 - s));
|
||||||
|
}
|
||||||
|
|
||||||
|
static const uint32_t round_constants[22] = {
|
||||||
|
0x00000001,
|
||||||
|
0x00008082,
|
||||||
|
0x0000808A,
|
||||||
|
0x80008000,
|
||||||
|
0x0000808B,
|
||||||
|
0x80000001,
|
||||||
|
0x80008081,
|
||||||
|
0x00008009,
|
||||||
|
0x0000008A,
|
||||||
|
0x00000088,
|
||||||
|
0x80008009,
|
||||||
|
0x8000000A,
|
||||||
|
0x8000808B,
|
||||||
|
0x0000008B,
|
||||||
|
0x00008089,
|
||||||
|
0x00008003,
|
||||||
|
0x00008002,
|
||||||
|
0x00000080,
|
||||||
|
0x0000800A,
|
||||||
|
0x8000000A,
|
||||||
|
0x80008081,
|
||||||
|
0x00008080,
|
||||||
|
};
|
||||||
|
|
||||||
|
void ethash_keccakf800(uint32_t state[25])
|
||||||
|
{
|
||||||
|
/* The implementation directly translated from ethash_keccakf1600. */
|
||||||
|
|
||||||
|
int round;
|
||||||
|
|
||||||
|
uint32_t Aba, Abe, Abi, Abo, Abu;
|
||||||
|
uint32_t Aga, Age, Agi, Ago, Agu;
|
||||||
|
uint32_t Aka, Ake, Aki, Ako, Aku;
|
||||||
|
uint32_t Ama, Ame, Ami, Amo, Amu;
|
||||||
|
uint32_t Asa, Ase, Asi, Aso, Asu;
|
||||||
|
|
||||||
|
uint32_t Eba, Ebe, Ebi, Ebo, Ebu;
|
||||||
|
uint32_t Ega, Ege, Egi, Ego, Egu;
|
||||||
|
uint32_t Eka, Eke, Eki, Eko, Eku;
|
||||||
|
uint32_t Ema, Eme, Emi, Emo, Emu;
|
||||||
|
uint32_t Esa, Ese, Esi, Eso, Esu;
|
||||||
|
|
||||||
|
uint32_t Ba, Be, Bi, Bo, Bu;
|
||||||
|
|
||||||
|
uint32_t Da, De, Di, Do, Du;
|
||||||
|
|
||||||
|
Aba = state[0];
|
||||||
|
Abe = state[1];
|
||||||
|
Abi = state[2];
|
||||||
|
Abo = state[3];
|
||||||
|
Abu = state[4];
|
||||||
|
Aga = state[5];
|
||||||
|
Age = state[6];
|
||||||
|
Agi = state[7];
|
||||||
|
Ago = state[8];
|
||||||
|
Agu = state[9];
|
||||||
|
Aka = state[10];
|
||||||
|
Ake = state[11];
|
||||||
|
Aki = state[12];
|
||||||
|
Ako = state[13];
|
||||||
|
Aku = state[14];
|
||||||
|
Ama = state[15];
|
||||||
|
Ame = state[16];
|
||||||
|
Ami = state[17];
|
||||||
|
Amo = state[18];
|
||||||
|
Amu = state[19];
|
||||||
|
Asa = state[20];
|
||||||
|
Ase = state[21];
|
||||||
|
Asi = state[22];
|
||||||
|
Aso = state[23];
|
||||||
|
Asu = state[24];
|
||||||
|
|
||||||
|
for (round = 0; round < 22; round += 2)
|
||||||
|
{
|
||||||
|
/* Round (round + 0): Axx -> Exx */
|
||||||
|
|
||||||
|
Ba = Aba ^ Aga ^ Aka ^ Ama ^ Asa;
|
||||||
|
Be = Abe ^ Age ^ Ake ^ Ame ^ Ase;
|
||||||
|
Bi = Abi ^ Agi ^ Aki ^ Ami ^ Asi;
|
||||||
|
Bo = Abo ^ Ago ^ Ako ^ Amo ^ Aso;
|
||||||
|
Bu = Abu ^ Agu ^ Aku ^ Amu ^ Asu;
|
||||||
|
|
||||||
|
Da = Bu ^ rol(Be, 1);
|
||||||
|
De = Ba ^ rol(Bi, 1);
|
||||||
|
Di = Be ^ rol(Bo, 1);
|
||||||
|
Do = Bi ^ rol(Bu, 1);
|
||||||
|
Du = Bo ^ rol(Ba, 1);
|
||||||
|
|
||||||
|
Ba = Aba ^ Da;
|
||||||
|
Be = rol(Age ^ De, 12);
|
||||||
|
Bi = rol(Aki ^ Di, 11);
|
||||||
|
Bo = rol(Amo ^ Do, 21);
|
||||||
|
Bu = rol(Asu ^ Du, 14);
|
||||||
|
Eba = Ba ^ (~Be & Bi) ^ round_constants[round];
|
||||||
|
Ebe = Be ^ (~Bi & Bo);
|
||||||
|
Ebi = Bi ^ (~Bo & Bu);
|
||||||
|
Ebo = Bo ^ (~Bu & Ba);
|
||||||
|
Ebu = Bu ^ (~Ba & Be);
|
||||||
|
|
||||||
|
Ba = rol(Abo ^ Do, 28);
|
||||||
|
Be = rol(Agu ^ Du, 20);
|
||||||
|
Bi = rol(Aka ^ Da, 3);
|
||||||
|
Bo = rol(Ame ^ De, 13);
|
||||||
|
Bu = rol(Asi ^ Di, 29);
|
||||||
|
Ega = Ba ^ (~Be & Bi);
|
||||||
|
Ege = Be ^ (~Bi & Bo);
|
||||||
|
Egi = Bi ^ (~Bo & Bu);
|
||||||
|
Ego = Bo ^ (~Bu & Ba);
|
||||||
|
Egu = Bu ^ (~Ba & Be);
|
||||||
|
|
||||||
|
Ba = rol(Abe ^ De, 1);
|
||||||
|
Be = rol(Agi ^ Di, 6);
|
||||||
|
Bi = rol(Ako ^ Do, 25);
|
||||||
|
Bo = rol(Amu ^ Du, 8);
|
||||||
|
Bu = rol(Asa ^ Da, 18);
|
||||||
|
Eka = Ba ^ (~Be & Bi);
|
||||||
|
Eke = Be ^ (~Bi & Bo);
|
||||||
|
Eki = Bi ^ (~Bo & Bu);
|
||||||
|
Eko = Bo ^ (~Bu & Ba);
|
||||||
|
Eku = Bu ^ (~Ba & Be);
|
||||||
|
|
||||||
|
Ba = rol(Abu ^ Du, 27);
|
||||||
|
Be = rol(Aga ^ Da, 4);
|
||||||
|
Bi = rol(Ake ^ De, 10);
|
||||||
|
Bo = rol(Ami ^ Di, 15);
|
||||||
|
Bu = rol(Aso ^ Do, 24);
|
||||||
|
Ema = Ba ^ (~Be & Bi);
|
||||||
|
Eme = Be ^ (~Bi & Bo);
|
||||||
|
Emi = Bi ^ (~Bo & Bu);
|
||||||
|
Emo = Bo ^ (~Bu & Ba);
|
||||||
|
Emu = Bu ^ (~Ba & Be);
|
||||||
|
|
||||||
|
Ba = rol(Abi ^ Di, 30);
|
||||||
|
Be = rol(Ago ^ Do, 23);
|
||||||
|
Bi = rol(Aku ^ Du, 7);
|
||||||
|
Bo = rol(Ama ^ Da, 9);
|
||||||
|
Bu = rol(Ase ^ De, 2);
|
||||||
|
Esa = Ba ^ (~Be & Bi);
|
||||||
|
Ese = Be ^ (~Bi & Bo);
|
||||||
|
Esi = Bi ^ (~Bo & Bu);
|
||||||
|
Eso = Bo ^ (~Bu & Ba);
|
||||||
|
Esu = Bu ^ (~Ba & Be);
|
||||||
|
|
||||||
|
|
||||||
|
/* Round (round + 1): Exx -> Axx */
|
||||||
|
|
||||||
|
Ba = Eba ^ Ega ^ Eka ^ Ema ^ Esa;
|
||||||
|
Be = Ebe ^ Ege ^ Eke ^ Eme ^ Ese;
|
||||||
|
Bi = Ebi ^ Egi ^ Eki ^ Emi ^ Esi;
|
||||||
|
Bo = Ebo ^ Ego ^ Eko ^ Emo ^ Eso;
|
||||||
|
Bu = Ebu ^ Egu ^ Eku ^ Emu ^ Esu;
|
||||||
|
|
||||||
|
Da = Bu ^ rol(Be, 1);
|
||||||
|
De = Ba ^ rol(Bi, 1);
|
||||||
|
Di = Be ^ rol(Bo, 1);
|
||||||
|
Do = Bi ^ rol(Bu, 1);
|
||||||
|
Du = Bo ^ rol(Ba, 1);
|
||||||
|
|
||||||
|
Ba = Eba ^ Da;
|
||||||
|
Be = rol(Ege ^ De, 12);
|
||||||
|
Bi = rol(Eki ^ Di, 11);
|
||||||
|
Bo = rol(Emo ^ Do, 21);
|
||||||
|
Bu = rol(Esu ^ Du, 14);
|
||||||
|
Aba = Ba ^ (~Be & Bi) ^ round_constants[round + 1];
|
||||||
|
Abe = Be ^ (~Bi & Bo);
|
||||||
|
Abi = Bi ^ (~Bo & Bu);
|
||||||
|
Abo = Bo ^ (~Bu & Ba);
|
||||||
|
Abu = Bu ^ (~Ba & Be);
|
||||||
|
|
||||||
|
Ba = rol(Ebo ^ Do, 28);
|
||||||
|
Be = rol(Egu ^ Du, 20);
|
||||||
|
Bi = rol(Eka ^ Da, 3);
|
||||||
|
Bo = rol(Eme ^ De, 13);
|
||||||
|
Bu = rol(Esi ^ Di, 29);
|
||||||
|
Aga = Ba ^ (~Be & Bi);
|
||||||
|
Age = Be ^ (~Bi & Bo);
|
||||||
|
Agi = Bi ^ (~Bo & Bu);
|
||||||
|
Ago = Bo ^ (~Bu & Ba);
|
||||||
|
Agu = Bu ^ (~Ba & Be);
|
||||||
|
|
||||||
|
Ba = rol(Ebe ^ De, 1);
|
||||||
|
Be = rol(Egi ^ Di, 6);
|
||||||
|
Bi = rol(Eko ^ Do, 25);
|
||||||
|
Bo = rol(Emu ^ Du, 8);
|
||||||
|
Bu = rol(Esa ^ Da, 18);
|
||||||
|
Aka = Ba ^ (~Be & Bi);
|
||||||
|
Ake = Be ^ (~Bi & Bo);
|
||||||
|
Aki = Bi ^ (~Bo & Bu);
|
||||||
|
Ako = Bo ^ (~Bu & Ba);
|
||||||
|
Aku = Bu ^ (~Ba & Be);
|
||||||
|
|
||||||
|
Ba = rol(Ebu ^ Du, 27);
|
||||||
|
Be = rol(Ega ^ Da, 4);
|
||||||
|
Bi = rol(Eke ^ De, 10);
|
||||||
|
Bo = rol(Emi ^ Di, 15);
|
||||||
|
Bu = rol(Eso ^ Do, 24);
|
||||||
|
Ama = Ba ^ (~Be & Bi);
|
||||||
|
Ame = Be ^ (~Bi & Bo);
|
||||||
|
Ami = Bi ^ (~Bo & Bu);
|
||||||
|
Amo = Bo ^ (~Bu & Ba);
|
||||||
|
Amu = Bu ^ (~Ba & Be);
|
||||||
|
|
||||||
|
Ba = rol(Ebi ^ Di, 30);
|
||||||
|
Be = rol(Ego ^ Do, 23);
|
||||||
|
Bi = rol(Eku ^ Du, 7);
|
||||||
|
Bo = rol(Ema ^ Da, 9);
|
||||||
|
Bu = rol(Ese ^ De, 2);
|
||||||
|
Asa = Ba ^ (~Be & Bi);
|
||||||
|
Ase = Be ^ (~Bi & Bo);
|
||||||
|
Asi = Bi ^ (~Bo & Bu);
|
||||||
|
Aso = Bo ^ (~Bu & Ba);
|
||||||
|
Asu = Bu ^ (~Ba & Be);
|
||||||
|
}
|
||||||
|
|
||||||
|
state[0] = Aba;
|
||||||
|
state[1] = Abe;
|
||||||
|
state[2] = Abi;
|
||||||
|
state[3] = Abo;
|
||||||
|
state[4] = Abu;
|
||||||
|
state[5] = Aga;
|
||||||
|
state[6] = Age;
|
||||||
|
state[7] = Agi;
|
||||||
|
state[8] = Ago;
|
||||||
|
state[9] = Agu;
|
||||||
|
state[10] = Aka;
|
||||||
|
state[11] = Ake;
|
||||||
|
state[12] = Aki;
|
||||||
|
state[13] = Ako;
|
||||||
|
state[14] = Aku;
|
||||||
|
state[15] = Ama;
|
||||||
|
state[16] = Ame;
|
||||||
|
state[17] = Ami;
|
||||||
|
state[18] = Amo;
|
||||||
|
state[19] = Amu;
|
||||||
|
state[20] = Asa;
|
||||||
|
state[21] = Ase;
|
||||||
|
state[22] = Asi;
|
||||||
|
state[23] = Aso;
|
||||||
|
state[24] = Asu;
|
||||||
|
}
|
||||||
23
src/App.cpp
23
src/App.cpp
@@ -6,8 +6,8 @@
|
|||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
* Copyright 2018 Lee Clagett <https://github.com/vtnerd>
|
* Copyright 2018 Lee Clagett <https://github.com/vtnerd>
|
||||||
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -32,12 +32,11 @@
|
|||||||
#include "backend/cpu/Cpu.h"
|
#include "backend/cpu/Cpu.h"
|
||||||
#include "base/io/Console.h"
|
#include "base/io/Console.h"
|
||||||
#include "base/io/log/Log.h"
|
#include "base/io/log/Log.h"
|
||||||
#include "base/kernel/Signals.h"
|
#include "base/io/log/Tags.h"
|
||||||
|
#include "base/io/Signals.h"
|
||||||
#include "base/kernel/Platform.h"
|
#include "base/kernel/Platform.h"
|
||||||
#include "core/config/Config.h"
|
#include "core/config/Config.h"
|
||||||
#include "core/Controller.h"
|
#include "core/Controller.h"
|
||||||
#include "core/Miner.h"
|
|
||||||
#include "net/Network.h"
|
|
||||||
#include "Summary.h"
|
#include "Summary.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
@@ -61,7 +60,7 @@ xmrig::App::~App()
|
|||||||
int xmrig::App::exec()
|
int xmrig::App::exec()
|
||||||
{
|
{
|
||||||
if (!m_controller->isReady()) {
|
if (!m_controller->isReady()) {
|
||||||
LOG_EMERG("no valid configuration found.");
|
LOG_EMERG("no valid configuration found, try https://xmrig.com/wizard");
|
||||||
|
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
@@ -85,7 +84,7 @@ int xmrig::App::exec()
|
|||||||
Summary::print(m_controller);
|
Summary::print(m_controller);
|
||||||
|
|
||||||
if (m_controller->config()->isDryRun()) {
|
if (m_controller->config()->isDryRun()) {
|
||||||
LOG_NOTICE("OK");
|
LOG_NOTICE("%s " WHITE_BOLD("OK"), Tags::config());
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -102,11 +101,11 @@ int xmrig::App::exec()
|
|||||||
void xmrig::App::onConsoleCommand(char command)
|
void xmrig::App::onConsoleCommand(char command)
|
||||||
{
|
{
|
||||||
if (command == 3) {
|
if (command == 3) {
|
||||||
LOG_WARN("Ctrl+C received, exiting");
|
LOG_WARN("%s " YELLOW("Ctrl+C received, exiting"), Tags::signal());
|
||||||
close();
|
close();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
m_controller->miner()->execCommand(command);
|
m_controller->execCommand(command);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,15 +115,15 @@ void xmrig::App::onSignal(int signum)
|
|||||||
switch (signum)
|
switch (signum)
|
||||||
{
|
{
|
||||||
case SIGHUP:
|
case SIGHUP:
|
||||||
LOG_WARN("SIGHUP received, exiting");
|
LOG_WARN("%s " YELLOW("SIGHUP received, exiting"), Tags::signal());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SIGTERM:
|
case SIGTERM:
|
||||||
LOG_WARN("SIGTERM received, exiting");
|
LOG_WARN("%s " YELLOW("SIGTERM received, exiting"), Tags::signal());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SIGINT:
|
case SIGINT:
|
||||||
LOG_WARN("SIGINT received, exiting");
|
LOG_WARN("%s " YELLOW("SIGINT received, exiting"), Tags::signal());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -6,8 +6,8 @@
|
|||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
* Copyright 2018 Lee Clagett <https://github.com/vtnerd>
|
* Copyright 2018 Lee Clagett <https://github.com/vtnerd>
|
||||||
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -161,11 +161,14 @@ static void print_commands(Config *)
|
|||||||
{
|
{
|
||||||
if (Log::isColors()) {
|
if (Log::isColors()) {
|
||||||
Log::print(GREEN_BOLD(" * ") WHITE_BOLD("COMMANDS ") MAGENTA_BG(WHITE_BOLD_S "h") WHITE_BOLD("ashrate, ")
|
Log::print(GREEN_BOLD(" * ") WHITE_BOLD("COMMANDS ") MAGENTA_BG(WHITE_BOLD_S "h") WHITE_BOLD("ashrate, ")
|
||||||
MAGENTA_BG(WHITE_BOLD_S "p") WHITE_BOLD("ause, ")
|
MAGENTA_BG(WHITE_BOLD_S "p") WHITE_BOLD("ause, ")
|
||||||
MAGENTA_BG(WHITE_BOLD_S "r") WHITE_BOLD("esume"));
|
MAGENTA_BG(WHITE_BOLD_S "r") WHITE_BOLD("esume, ")
|
||||||
|
WHITE_BOLD("re") MAGENTA_BG(WHITE_BOLD_S "s") WHITE_BOLD("ults, ")
|
||||||
|
MAGENTA_BG(WHITE_BOLD_S "c") WHITE_BOLD("onnection")
|
||||||
|
);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Log::print(" * COMMANDS 'h' hashrate, 'p' pause, 'r' resume");
|
Log::print(" * COMMANDS 'h' hashrate, 'p' pause, 'r' resume, 's' results, 'c' connection");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
103
src/backend/common/Benchmark.cpp
Normal file
103
src/backend/common/Benchmark.cpp
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
/* XMRig
|
||||||
|
* Copyright (c) 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright (c) 2016-2020 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/common/Benchmark.h"
|
||||||
|
#include "backend/common/interfaces/IWorker.h"
|
||||||
|
#include "base/io/log/Log.h"
|
||||||
|
#include "base/io/log/Tags.h"
|
||||||
|
#include "base/tools/Chrono.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
static uint64_t hashCheck[2][10] = {
|
||||||
|
{ 0x898B6E0431C28A6BULL, 0xEE9468F8B40926BCULL, 0xC2BC5D11724813C0ULL, 0x3A2C7B285B87F941ULL, 0x3B5BD2C3A16B450EULL, 0x5CD0602F20C5C7C4ULL, 0x101DE939474B6812ULL, 0x52B765A1B156C6ECULL, 0x323935102AB6B45CULL, 0xB5231262E2792B26ULL },
|
||||||
|
{ 0x0F3E5400B39EA96AULL, 0x85944CCFA2752D1FULL, 0x64AFFCAE991811BAULL, 0x3E4D0B836D3B13BAULL, 0xEB7417D621271166ULL, 0x97FFE10C0949FFA5ULL, 0x84CAC0F8879A4BA1ULL, 0xA1B79F031DA2459FULL, 0x9B65226DA873E65DULL, 0x0F9E00C5A511C200ULL },
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace xmrig
|
||||||
|
|
||||||
|
|
||||||
|
bool xmrig::Benchmark::finish(uint64_t totalHashCount)
|
||||||
|
{
|
||||||
|
m_reset = true;
|
||||||
|
m_current = totalHashCount;
|
||||||
|
|
||||||
|
if (m_done < m_workers) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const double dt = (m_doneTime - m_startTime) / 1000.0;
|
||||||
|
uint64_t checkData = 0;
|
||||||
|
const uint32_t N = (m_end / 1000000) - 1;
|
||||||
|
|
||||||
|
if (((m_algo == Algorithm::RX_0) || (m_algo == Algorithm::RX_WOW)) && ((m_end % 1000000) == 0) && (N < 10)) {
|
||||||
|
checkData = hashCheck[(m_algo == Algorithm::RX_0) ? 0 : 1][N];
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *color = checkData ? ((m_data == checkData) ? GREEN_BOLD_S : RED_BOLD_S) : BLACK_BOLD_S;
|
||||||
|
|
||||||
|
LOG_NOTICE("%s " WHITE_BOLD("benchmark finished in ") CYAN_BOLD("%.3f seconds") WHITE_BOLD_S " hash sum = " CLEAR "%s%016" PRIX64 CLEAR, Tags::bench(), dt, color, m_data);
|
||||||
|
LOG_INFO("%s " WHITE_BOLD("press ") MAGENTA_BOLD("Ctrl+C") WHITE_BOLD(" to exit"), Tags::bench());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void xmrig::Benchmark::start()
|
||||||
|
{
|
||||||
|
m_startTime = Chrono::steadyMSecs();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void xmrig::Benchmark::printProgress() const
|
||||||
|
{
|
||||||
|
if (!m_startTime || !m_current) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const double dt = (Chrono::steadyMSecs() - m_startTime) / 1000.0;
|
||||||
|
const double percent = static_cast<double>(m_current) / m_end * 100.0;
|
||||||
|
|
||||||
|
LOG_NOTICE("%s " MAGENTA_BOLD("%5.2f%% ") CYAN_BOLD("%" PRIu64) CYAN("/%" PRIu64) BLACK_BOLD(" (%.3fs)"), Tags::bench(), percent, m_current, m_end, dt);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void xmrig::Benchmark::tick(IWorker *worker)
|
||||||
|
{
|
||||||
|
if (m_reset) {
|
||||||
|
m_data = 0;
|
||||||
|
m_done = 0;
|
||||||
|
m_reset = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint64_t doneTime = worker->benchDoneTime();
|
||||||
|
if (!doneTime) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
++m_done;
|
||||||
|
m_data ^= worker->benchData();
|
||||||
|
m_doneTime = std::max(doneTime, m_doneTime);
|
||||||
|
}
|
||||||
62
src/backend/common/Benchmark.h
Normal file
62
src/backend/common/Benchmark.h
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
/* XMRig
|
||||||
|
* Copyright (c) 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright (c) 2016-2020 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_BENCHMARK_H
|
||||||
|
#define XMRIG_BENCHMARK_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "base/tools/Object.h"
|
||||||
|
#include "base/crypto/Algorithm.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
class IWorker;
|
||||||
|
|
||||||
|
|
||||||
|
class Benchmark
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
XMRIG_DISABLE_COPY_MOVE_DEFAULT(Benchmark)
|
||||||
|
|
||||||
|
Benchmark(uint32_t end, const Algorithm &algo, size_t workers) : m_algo(algo), m_workers(workers), m_end(end) {}
|
||||||
|
~Benchmark() = default;
|
||||||
|
|
||||||
|
bool finish(uint64_t totalHashCount);
|
||||||
|
void printProgress() const;
|
||||||
|
void start();
|
||||||
|
void tick(IWorker *worker);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool m_reset = false;
|
||||||
|
const Algorithm m_algo = Algorithm::RX_0;
|
||||||
|
const size_t m_workers = 0;
|
||||||
|
const uint64_t m_end = 0;
|
||||||
|
uint32_t m_done = 0;
|
||||||
|
uint64_t m_current = 0;
|
||||||
|
uint64_t m_data = 0;
|
||||||
|
uint64_t m_doneTime = 0;
|
||||||
|
uint64_t m_startTime = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace xmrig
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* XMRIG_BENCHMARK_H */
|
||||||
@@ -5,8 +5,8 @@
|
|||||||
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -30,16 +30,16 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "backend/common/Hashrate.h"
|
#include "backend/common/Hashrate.h"
|
||||||
|
#include "3rdparty/rapidjson/document.h"
|
||||||
#include "base/io/json/Json.h"
|
#include "base/io/json/Json.h"
|
||||||
#include "base/tools/Chrono.h"
|
#include "base/tools/Chrono.h"
|
||||||
#include "base/tools/Handle.h"
|
#include "base/tools/Handle.h"
|
||||||
#include "rapidjson/document.h"
|
|
||||||
|
|
||||||
|
|
||||||
inline static const char *format(double h, char *buf, size_t size)
|
inline static const char *format(double h, char *buf, size_t size)
|
||||||
{
|
{
|
||||||
if (std::isnormal(h)) {
|
if (std::isnormal(h)) {
|
||||||
snprintf(buf, size, "%03.1f", h);
|
snprintf(buf, size, (h < 100.0) ? "%04.2f" : "%03.1f", h);
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -48,13 +48,13 @@ inline static const char *format(double h, char *buf, size_t size)
|
|||||||
|
|
||||||
|
|
||||||
xmrig::Hashrate::Hashrate(size_t threads) :
|
xmrig::Hashrate::Hashrate(size_t threads) :
|
||||||
m_threads(threads)
|
m_threads(threads + 1)
|
||||||
{
|
{
|
||||||
m_counts = new uint64_t*[threads];
|
m_counts = new uint64_t*[m_threads];
|
||||||
m_timestamps = new uint64_t*[threads];
|
m_timestamps = new uint64_t*[m_threads];
|
||||||
m_top = new uint32_t[threads];
|
m_top = new uint32_t[m_threads];
|
||||||
|
|
||||||
for (size_t i = 0; i < threads; i++) {
|
for (size_t i = 0; i < m_threads; i++) {
|
||||||
m_counts[i] = new uint64_t[kBucketSize]();
|
m_counts[i] = new uint64_t[kBucketSize]();
|
||||||
m_timestamps[i] = new uint64_t[kBucketSize]();
|
m_timestamps[i] = new uint64_t[kBucketSize]();
|
||||||
m_top[i] = 0;
|
m_top[i] = 0;
|
||||||
@@ -77,17 +77,8 @@ xmrig::Hashrate::~Hashrate()
|
|||||||
|
|
||||||
double xmrig::Hashrate::calc(size_t ms) const
|
double xmrig::Hashrate::calc(size_t ms) const
|
||||||
{
|
{
|
||||||
double result = 0.0;
|
const double data = calc(0, ms);
|
||||||
double data;
|
return std::isnormal(data) ? data : 0.0;
|
||||||
|
|
||||||
for (size_t i = 0; i < m_threads; ++i) {
|
|
||||||
data = calc(i, ms);
|
|
||||||
if (std::isnormal(data)) {
|
|
||||||
result += data;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -102,7 +93,7 @@ double xmrig::Hashrate::calc(size_t threadId, size_t ms) const
|
|||||||
uint64_t earliestStamp = 0;
|
uint64_t earliestStamp = 0;
|
||||||
bool haveFullSet = false;
|
bool haveFullSet = false;
|
||||||
|
|
||||||
const uint64_t timeStampLimit = xmrig::Chrono::highResolutionMSecs() - ms;
|
const uint64_t timeStampLimit = xmrig::Chrono::steadyMSecs() - ms;
|
||||||
uint64_t* timestamps = m_timestamps[threadId];
|
uint64_t* timestamps = m_timestamps[threadId];
|
||||||
uint64_t* counts = m_counts[threadId];
|
uint64_t* counts = m_counts[threadId];
|
||||||
|
|
||||||
@@ -183,9 +174,9 @@ rapidjson::Value xmrig::Hashrate::toJSON(size_t threadId, rapidjson::Document &d
|
|||||||
auto &allocator = doc.GetAllocator();
|
auto &allocator = doc.GetAllocator();
|
||||||
|
|
||||||
Value out(kArrayType);
|
Value out(kArrayType);
|
||||||
out.PushBack(normalize(calc(threadId, ShortInterval)), allocator);
|
out.PushBack(normalize(calc(threadId + 1, ShortInterval)), allocator);
|
||||||
out.PushBack(normalize(calc(threadId, MediumInterval)), allocator);
|
out.PushBack(normalize(calc(threadId + 1, MediumInterval)), allocator);
|
||||||
out.PushBack(normalize(calc(threadId, LargeInterval)), allocator);
|
out.PushBack(normalize(calc(threadId + 1, LargeInterval)), allocator);
|
||||||
|
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,8 +5,8 @@
|
|||||||
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -30,8 +30,8 @@
|
|||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
|
|
||||||
|
#include "3rdparty/rapidjson/fwd.h"
|
||||||
#include "base/tools/Object.h"
|
#include "base/tools/Object.h"
|
||||||
#include "rapidjson/fwd.h"
|
|
||||||
|
|
||||||
|
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
|||||||
63
src/backend/common/HashrateInterpolator.cpp
Normal file
63
src/backend/common/HashrateInterpolator.cpp
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
/* 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-2020 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright 2016-2020 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/common/HashrateInterpolator.h"
|
||||||
|
|
||||||
|
|
||||||
|
uint64_t xmrig::HashrateInterpolator::interpolate(uint64_t timeStamp) const
|
||||||
|
{
|
||||||
|
timeStamp -= LagMS;
|
||||||
|
|
||||||
|
std::lock_guard<std::mutex> l(m_lock);
|
||||||
|
|
||||||
|
const size_t N = m_data.size();
|
||||||
|
|
||||||
|
if (N < 2) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i < N - 1; ++i) {
|
||||||
|
const auto& a = m_data[i];
|
||||||
|
const auto& b = m_data[i + 1];
|
||||||
|
|
||||||
|
if (a.second <= timeStamp && timeStamp <= b.second) {
|
||||||
|
return a.first + static_cast<int64_t>(b.first - a.first) * (timeStamp - a.second) / (b.second - a.second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void xmrig::HashrateInterpolator::addDataPoint(uint64_t count, uint64_t timeStamp)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> l(m_lock);
|
||||||
|
|
||||||
|
// Clean up old data
|
||||||
|
while (!m_data.empty() && (timeStamp - m_data.front().second > LagMS * 2)) {
|
||||||
|
m_data.pop_front();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_data.emplace_back(count, timeStamp);
|
||||||
|
}
|
||||||
57
src/backend/common/HashrateInterpolator.h
Normal file
57
src/backend/common/HashrateInterpolator.h
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
/* 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-2020 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright 2016-2020 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_HASHRATE_INTERPOLATOR_H
|
||||||
|
#define XMRIG_HASHRATE_INTERPOLATOR_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <mutex>
|
||||||
|
#include <deque>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
class HashrateInterpolator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum {
|
||||||
|
LagMS = 4000,
|
||||||
|
};
|
||||||
|
|
||||||
|
uint64_t interpolate(uint64_t timeStamp) const;
|
||||||
|
void addDataPoint(uint64_t count, uint64_t timeStamp);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Buffer of hashrate counters, used for linear interpolation of past data
|
||||||
|
mutable std::mutex m_lock;
|
||||||
|
std::deque<std::pair<uint64_t, uint64_t>> m_data;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace xmrig
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* XMRIG_HASHRATE_INTERPOLATOR_H */
|
||||||
@@ -6,8 +6,8 @@
|
|||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
* Copyright 2018 Lee Clagett <https://github.com/vtnerd>
|
* Copyright 2018 Lee Clagett <https://github.com/vtnerd>
|
||||||
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -23,8 +23,8 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef XMRIG_TAGS_H
|
#ifndef XMRIG_BACKEND_TAGS_H
|
||||||
#define XMRIG_TAGS_H
|
#define XMRIG_BACKEND_TAGS_H
|
||||||
|
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
@@ -35,7 +35,6 @@ namespace xmrig {
|
|||||||
|
|
||||||
const char *backend_tag(uint32_t backend);
|
const char *backend_tag(uint32_t backend);
|
||||||
const char *cpu_tag();
|
const char *cpu_tag();
|
||||||
const char *net_tag();
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef XMRIG_FEATURE_OPENCL
|
#ifdef XMRIG_FEATURE_OPENCL
|
||||||
@@ -48,13 +47,7 @@ const char *cuda_tag();
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef XMRIG_ALGO_RANDOMX
|
|
||||||
const char *rx_tag();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace xmrig
|
} // namespace xmrig
|
||||||
|
|
||||||
|
|
||||||
#endif /* XMRIG_TAGS_H */
|
#endif /* XMRIG_BACKEND_TAGS_H */
|
||||||
|
|||||||
@@ -5,8 +5,8 @@
|
|||||||
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -24,9 +24,9 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "backend/common/Threads.h"
|
#include "backend/common/Threads.h"
|
||||||
|
#include "3rdparty/rapidjson/document.h"
|
||||||
#include "backend/cpu/CpuThreads.h"
|
#include "backend/cpu/CpuThreads.h"
|
||||||
#include "crypto/cn/CnAlgo.h"
|
#include "crypto/cn/CnAlgo.h"
|
||||||
#include "rapidjson/document.h"
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef XMRIG_FEATURE_OPENCL
|
#ifdef XMRIG_FEATURE_OPENCL
|
||||||
|
|||||||
@@ -5,8 +5,8 @@
|
|||||||
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -30,9 +30,9 @@
|
|||||||
#include <set>
|
#include <set>
|
||||||
|
|
||||||
|
|
||||||
|
#include "3rdparty/rapidjson/fwd.h"
|
||||||
|
#include "base/crypto/Algorithm.h"
|
||||||
#include "base/tools/String.h"
|
#include "base/tools/String.h"
|
||||||
#include "crypto/common/Algorithm.h"
|
|
||||||
#include "rapidjson/fwd.h"
|
|
||||||
|
|
||||||
|
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
|||||||
@@ -32,9 +32,7 @@
|
|||||||
|
|
||||||
xmrig::Worker::Worker(size_t id, int64_t affinity, int priority) :
|
xmrig::Worker::Worker(size_t id, int64_t affinity, int priority) :
|
||||||
m_affinity(affinity),
|
m_affinity(affinity),
|
||||||
m_id(id),
|
m_id(id)
|
||||||
m_hashCount(0),
|
|
||||||
m_timestamp(0)
|
|
||||||
{
|
{
|
||||||
m_node = VirtualMemory::bindToNUMANode(affinity);
|
m_node = VirtualMemory::bindToNUMANode(affinity);
|
||||||
|
|
||||||
@@ -45,6 +43,23 @@ xmrig::Worker::Worker(size_t id, int64_t affinity, int priority) :
|
|||||||
|
|
||||||
void xmrig::Worker::storeStats()
|
void xmrig::Worker::storeStats()
|
||||||
{
|
{
|
||||||
m_hashCount.store(m_count, std::memory_order_relaxed);
|
// Get index which is unused now
|
||||||
m_timestamp.store(Chrono::highResolutionMSecs(), std::memory_order_relaxed);
|
const uint32_t index = m_index.load(std::memory_order_relaxed) ^ 1;
|
||||||
|
|
||||||
|
// Fill in the data for that index
|
||||||
|
m_hashCount[index] = m_count;
|
||||||
|
m_timestamp[index] = Chrono::steadyMSecs();
|
||||||
|
|
||||||
|
// Switch to that index
|
||||||
|
// All data will be in memory by the time it completes thanks to std::memory_order_seq_cst
|
||||||
|
m_index.fetch_xor(1, std::memory_order_seq_cst);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void xmrig::Worker::getHashrateData(uint64_t& hashCount, uint64_t& timeStamp) const
|
||||||
|
{
|
||||||
|
const uint32_t index = m_index.load(std::memory_order_relaxed);
|
||||||
|
|
||||||
|
hashCount = m_hashCount[index];
|
||||||
|
timeStamp = m_timestamp[index];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,20 +42,33 @@ class Worker : public IWorker
|
|||||||
public:
|
public:
|
||||||
Worker(size_t id, int64_t affinity, int priority);
|
Worker(size_t id, int64_t affinity, int priority);
|
||||||
|
|
||||||
inline const VirtualMemory *memory() const override { return nullptr; }
|
inline const VirtualMemory *memory() const override { return nullptr; }
|
||||||
inline size_t id() const override { return m_id; }
|
inline size_t id() const override { return m_id; }
|
||||||
inline uint64_t hashCount() const override { return m_hashCount.load(std::memory_order_relaxed); }
|
inline uint64_t rawHashes() const override { return m_count; }
|
||||||
inline uint64_t timestamp() const override { return m_timestamp.load(std::memory_order_relaxed); }
|
inline void jobEarlyNotification(const Job&) override {}
|
||||||
|
|
||||||
|
void getHashrateData(uint64_t& hashCount, uint64_t& timeStamp) const override;
|
||||||
|
|
||||||
|
# ifdef XMRIG_FEATURE_BENCHMARK
|
||||||
|
inline uint64_t benchData() const override { return m_benchData; }
|
||||||
|
inline uint64_t benchDoneTime() const override { return m_benchDoneTime; }
|
||||||
|
# endif
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void storeStats();
|
void storeStats();
|
||||||
|
|
||||||
const int64_t m_affinity;
|
const int64_t m_affinity;
|
||||||
const size_t m_id;
|
const size_t m_id;
|
||||||
std::atomic<uint64_t> m_hashCount;
|
std::atomic<uint32_t> m_index = {};
|
||||||
std::atomic<uint64_t> m_timestamp;
|
uint32_t m_node = 0;
|
||||||
uint32_t m_node = 0;
|
uint64_t m_count = 0;
|
||||||
uint64_t m_count = 0;
|
uint64_t m_hashCount[2] = {};
|
||||||
|
uint64_t m_timestamp[2] = {};
|
||||||
|
|
||||||
|
# ifdef XMRIG_FEATURE_BENCHMARK
|
||||||
|
uint64_t m_benchData = 0;
|
||||||
|
uint64_t m_benchDoneTime = 0;
|
||||||
|
# endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ class WorkerJob
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
inline const Job ¤tJob() const { return m_jobs[index()]; }
|
inline const Job ¤tJob() const { return m_jobs[index()]; }
|
||||||
inline uint32_t *nonce(size_t i = 0) { return reinterpret_cast<uint32_t*>(blob() + (i * currentJob().size()) + 39); }
|
inline uint32_t *nonce(size_t i = 0) { return reinterpret_cast<uint32_t*>(blob() + (i * currentJob().size()) + nonceOffset()); }
|
||||||
inline uint64_t sequence() const { return m_sequence; }
|
inline uint64_t sequence() const { return m_sequence; }
|
||||||
inline uint8_t *blob() { return m_blobs[index()]; }
|
inline uint8_t *blob() { return m_blobs[index()]; }
|
||||||
inline uint8_t index() const { return m_index; }
|
inline uint8_t index() const { return m_index; }
|
||||||
@@ -66,14 +66,12 @@ public:
|
|||||||
|
|
||||||
inline bool nextRound(uint32_t rounds, uint32_t roundSize)
|
inline bool nextRound(uint32_t rounds, uint32_t roundSize)
|
||||||
{
|
{
|
||||||
bool ok = true;
|
|
||||||
m_rounds[index()]++;
|
m_rounds[index()]++;
|
||||||
|
|
||||||
if ((m_rounds[index()] % rounds) == 0) {
|
if ((m_rounds[index()] & (rounds - 1)) == 0) {
|
||||||
for (size_t i = 0; i < N; ++i) {
|
for (size_t i = 0; i < N; ++i) {
|
||||||
*nonce(i) = Nonce::next(index(), *nonce(i), rounds * roundSize, currentJob().isNicehash(), &ok);
|
if (!Nonce::next(index(), nonce(i), rounds * roundSize, nonceMask())) {
|
||||||
if (!ok) {
|
return false;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -83,23 +81,28 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ok;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
inline int32_t nonceOffset() const { return currentJob().nonceOffset(); }
|
||||||
|
inline size_t nonceSize() const { return currentJob().nonceSize(); }
|
||||||
|
inline uint64_t nonceMask() const { return m_nonce_mask[index()]; }
|
||||||
|
|
||||||
inline void save(const Job &job, uint32_t reserveCount, Nonce::Backend backend)
|
inline void save(const Job &job, uint32_t reserveCount, Nonce::Backend backend)
|
||||||
{
|
{
|
||||||
m_index = job.index();
|
m_index = job.index();
|
||||||
const size_t size = job.size();
|
const size_t size = job.size();
|
||||||
m_jobs[index()] = job;
|
m_jobs[index()] = job;
|
||||||
m_rounds[index()] = 0;
|
m_rounds[index()] = 0;
|
||||||
|
m_nonce_mask[index()] = job.nonceMask();
|
||||||
|
|
||||||
m_jobs[index()].setBackend(backend);
|
m_jobs[index()].setBackend(backend);
|
||||||
|
|
||||||
for (size_t i = 0; i < N; ++i) {
|
for (size_t i = 0; i < N; ++i) {
|
||||||
memcpy(m_blobs[index()] + (i * size), job.blob(), size);
|
memcpy(m_blobs[index()] + (i * size), job.blob(), size);
|
||||||
*nonce(i) = Nonce::next(index(), *nonce(i), reserveCount, job.isNicehash());
|
Nonce::next(index(), nonce(i), reserveCount, nonceMask());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,6 +110,7 @@ private:
|
|||||||
alignas(16) uint8_t m_blobs[2][Job::kMaxBlobSize * N]{};
|
alignas(16) uint8_t m_blobs[2][Job::kMaxBlobSize * N]{};
|
||||||
Job m_jobs[2];
|
Job m_jobs[2];
|
||||||
uint32_t m_rounds[2] = { 0, 0 };
|
uint32_t m_rounds[2] = { 0, 0 };
|
||||||
|
uint64_t m_nonce_mask[2];
|
||||||
uint64_t m_sequence = 0;
|
uint64_t m_sequence = 0;
|
||||||
uint8_t m_index = 0;
|
uint8_t m_index = 0;
|
||||||
};
|
};
|
||||||
@@ -115,24 +119,30 @@ private:
|
|||||||
template<>
|
template<>
|
||||||
inline uint32_t *xmrig::WorkerJob<1>::nonce(size_t)
|
inline uint32_t *xmrig::WorkerJob<1>::nonce(size_t)
|
||||||
{
|
{
|
||||||
return reinterpret_cast<uint32_t*>(blob() + 39);
|
return reinterpret_cast<uint32_t*>(blob() + nonceOffset());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline bool xmrig::WorkerJob<1>::nextRound(uint32_t rounds, uint32_t roundSize)
|
inline bool xmrig::WorkerJob<1>::nextRound(uint32_t rounds, uint32_t roundSize)
|
||||||
{
|
{
|
||||||
bool ok = true;
|
|
||||||
m_rounds[index()]++;
|
m_rounds[index()]++;
|
||||||
|
|
||||||
if ((m_rounds[index()] % rounds) == 0) {
|
uint32_t* n = nonce();
|
||||||
*nonce() = Nonce::next(index(), *nonce(), rounds * roundSize, currentJob().isNicehash(), &ok);
|
|
||||||
|
if ((m_rounds[index()] & (rounds - 1)) == 0) {
|
||||||
|
if (!Nonce::next(index(), n, rounds * roundSize, nonceMask())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (nonceSize() == sizeof(uint64_t)) {
|
||||||
|
m_jobs[index()].nonce()[1] = n[1];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
*nonce() += roundSize;
|
*n += roundSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ok;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -142,11 +152,12 @@ inline void xmrig::WorkerJob<1>::save(const Job &job, uint32_t reserveCount, Non
|
|||||||
m_index = job.index();
|
m_index = job.index();
|
||||||
m_jobs[index()] = job;
|
m_jobs[index()] = job;
|
||||||
m_rounds[index()] = 0;
|
m_rounds[index()] = 0;
|
||||||
|
m_nonce_mask[index()] = job.nonceMask();
|
||||||
|
|
||||||
m_jobs[index()].setBackend(backend);
|
m_jobs[index()].setBackend(backend);
|
||||||
|
|
||||||
memcpy(blob(), job.blob(), job.size());
|
memcpy(blob(), job.blob(), job.size());
|
||||||
*nonce() = Nonce::next(index(), *nonce(), reserveCount, currentJob().isNicehash());
|
Nonce::next(index(), nonce(), reserveCount, nonceMask());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,8 +6,8 @@
|
|||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
* Copyright 2018 Lee Clagett <https://github.com/vtnerd>
|
* Copyright 2018 Lee Clagett <https://github.com/vtnerd>
|
||||||
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -29,7 +29,11 @@
|
|||||||
#include "backend/common/Workers.h"
|
#include "backend/common/Workers.h"
|
||||||
#include "backend/cpu/CpuWorker.h"
|
#include "backend/cpu/CpuWorker.h"
|
||||||
#include "base/io/log/Log.h"
|
#include "base/io/log/Log.h"
|
||||||
|
#include "base/io/log/Tags.h"
|
||||||
|
#include "base/net/stratum/Pool.h"
|
||||||
|
#include "base/tools/Chrono.h"
|
||||||
#include "base/tools/Object.h"
|
#include "base/tools/Object.h"
|
||||||
|
#include "core/Miner.h"
|
||||||
|
|
||||||
|
|
||||||
#ifdef XMRIG_FEATURE_OPENCL
|
#ifdef XMRIG_FEATURE_OPENCL
|
||||||
@@ -42,6 +46,11 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef XMRIG_FEATURE_BENCHMARK
|
||||||
|
# include "backend/common/Benchmark.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
@@ -51,17 +60,12 @@ public:
|
|||||||
XMRIG_DISABLE_COPY_MOVE(WorkersPrivate)
|
XMRIG_DISABLE_COPY_MOVE(WorkersPrivate)
|
||||||
|
|
||||||
|
|
||||||
WorkersPrivate() = default;
|
WorkersPrivate() = default;
|
||||||
|
~WorkersPrivate() = default;
|
||||||
|
|
||||||
|
IBackend *backend = nullptr;
|
||||||
inline ~WorkersPrivate()
|
std::shared_ptr<Benchmark> benchmark;
|
||||||
{
|
std::shared_ptr<Hashrate> hashrate;
|
||||||
delete hashrate;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Hashrate *hashrate = nullptr;
|
|
||||||
IBackend *backend = nullptr;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -83,10 +87,77 @@ xmrig::Workers<T>::~Workers()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
xmrig::Benchmark *xmrig::Workers<T>::benchmark() const
|
||||||
|
{
|
||||||
|
return d_ptr->benchmark.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
static void getHashrateData(xmrig::IWorker* worker, uint64_t& hashCount, uint64_t& timeStamp)
|
||||||
|
{
|
||||||
|
worker->getHashrateData(hashCount, timeStamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<>
|
||||||
|
void getHashrateData<xmrig::CpuLaunchData>(xmrig::IWorker* worker, uint64_t& hashCount, uint64_t&)
|
||||||
|
{
|
||||||
|
hashCount = worker->rawHashes();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
bool xmrig::Workers<T>::tick(uint64_t)
|
||||||
|
{
|
||||||
|
if (!d_ptr->hashrate) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t ts = Chrono::steadyMSecs();
|
||||||
|
bool totalAvailable = true;
|
||||||
|
uint64_t totalHashCount = 0;
|
||||||
|
|
||||||
|
for (Thread<T> *handle : m_workers) {
|
||||||
|
IWorker *worker = handle->worker();
|
||||||
|
if (worker) {
|
||||||
|
uint64_t hashCount;
|
||||||
|
getHashrateData<T>(worker, hashCount, ts);
|
||||||
|
d_ptr->hashrate->add(handle->id() + 1, hashCount, ts);
|
||||||
|
|
||||||
|
const uint64_t n = worker->rawHashes();
|
||||||
|
if (n == 0) {
|
||||||
|
totalAvailable = false;
|
||||||
|
}
|
||||||
|
totalHashCount += n;
|
||||||
|
|
||||||
|
# ifdef XMRIG_FEATURE_BENCHMARK
|
||||||
|
if (d_ptr->benchmark) {
|
||||||
|
d_ptr->benchmark->tick(worker);
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (totalAvailable) {
|
||||||
|
d_ptr->hashrate->add(0, totalHashCount, Chrono::steadyMSecs());
|
||||||
|
}
|
||||||
|
|
||||||
|
# ifdef XMRIG_FEATURE_BENCHMARK
|
||||||
|
if (d_ptr->benchmark && d_ptr->benchmark->finish(totalHashCount)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
const xmrig::Hashrate *xmrig::Workers<T>::hashrate() const
|
const xmrig::Hashrate *xmrig::Workers<T>::hashrate() const
|
||||||
{
|
{
|
||||||
return d_ptr->hashrate;
|
return d_ptr->hashrate.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -100,21 +171,35 @@ void xmrig::Workers<T>::setBackend(IBackend *backend)
|
|||||||
template<class T>
|
template<class T>
|
||||||
void xmrig::Workers<T>::start(const std::vector<T> &data)
|
void xmrig::Workers<T>::start(const std::vector<T> &data)
|
||||||
{
|
{
|
||||||
|
# ifdef XMRIG_FEATURE_BENCHMARK
|
||||||
|
if (!data.empty() && data.front().benchSize) {
|
||||||
|
d_ptr->benchmark = std::make_shared<Benchmark>(data.front().benchSize, data.front().algorithm, data.size());
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
for (const T &item : data) {
|
for (const T &item : data) {
|
||||||
m_workers.push_back(new Thread<T>(d_ptr->backend, m_workers.size(), item));
|
m_workers.push_back(new Thread<T>(d_ptr->backend, m_workers.size(), item));
|
||||||
}
|
}
|
||||||
|
|
||||||
d_ptr->hashrate = new Hashrate(m_workers.size());
|
d_ptr->hashrate = std::make_shared<Hashrate>(m_workers.size());
|
||||||
Nonce::touch(T::backend());
|
Nonce::touch(T::backend());
|
||||||
|
|
||||||
for (Thread<T> *worker : m_workers) {
|
for (Thread<T> *worker : m_workers) {
|
||||||
worker->start(Workers<T>::onReady);
|
worker->start(Workers<T>::onReady);
|
||||||
|
|
||||||
// This sleep is important for optimal caching!
|
# ifdef XMRIG_FEATURE_BENCHMARK
|
||||||
// Threads must allocate scratchpads in order so that adjacent cores will use adjacent scratchpads
|
if (!d_ptr->benchmark)
|
||||||
// Sub-optimal caching can result in up to 0.5% hashrate penalty
|
# endif
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(20));
|
{
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(20));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ifdef XMRIG_FEATURE_BENCHMARK
|
||||||
|
if (d_ptr->benchmark) {
|
||||||
|
d_ptr->benchmark->start();
|
||||||
|
}
|
||||||
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -130,25 +215,7 @@ void xmrig::Workers<T>::stop()
|
|||||||
m_workers.clear();
|
m_workers.clear();
|
||||||
Nonce::touch(T::backend());
|
Nonce::touch(T::backend());
|
||||||
|
|
||||||
delete d_ptr->hashrate;
|
d_ptr->hashrate.reset();
|
||||||
d_ptr->hashrate = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
void xmrig::Workers<T>::tick(uint64_t)
|
|
||||||
{
|
|
||||||
if (!d_ptr->hashrate) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Thread<T> *handle : m_workers) {
|
|
||||||
if (!handle->worker()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
d_ptr->hashrate->add(handle->id(), handle->worker()->hashCount(), handle->worker()->timestamp());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,8 +6,8 @@
|
|||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
* Copyright 2018 Lee Clagett <https://github.com/vtnerd>
|
* Copyright 2018 Lee Clagett <https://github.com/vtnerd>
|
||||||
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -29,7 +29,6 @@
|
|||||||
|
|
||||||
#include "backend/common/Thread.h"
|
#include "backend/common/Thread.h"
|
||||||
#include "backend/cpu/CpuLaunchData.h"
|
#include "backend/cpu/CpuLaunchData.h"
|
||||||
#include "base/tools/Object.h"
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef XMRIG_FEATURE_OPENCL
|
#ifdef XMRIG_FEATURE_OPENCL
|
||||||
@@ -47,6 +46,8 @@ namespace xmrig {
|
|||||||
|
|
||||||
class Hashrate;
|
class Hashrate;
|
||||||
class WorkersPrivate;
|
class WorkersPrivate;
|
||||||
|
class Job;
|
||||||
|
class Benchmark;
|
||||||
|
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
@@ -58,11 +59,13 @@ public:
|
|||||||
Workers();
|
Workers();
|
||||||
~Workers();
|
~Workers();
|
||||||
|
|
||||||
|
Benchmark *benchmark() const;
|
||||||
|
bool tick(uint64_t ticks);
|
||||||
const Hashrate *hashrate() const;
|
const Hashrate *hashrate() const;
|
||||||
|
void jobEarlyNotification(const Job&);
|
||||||
void setBackend(IBackend *backend);
|
void setBackend(IBackend *backend);
|
||||||
void start(const std::vector<T> &data);
|
void start(const std::vector<T> &data);
|
||||||
void stop();
|
void stop();
|
||||||
void tick(uint64_t ticks);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static IWorker *create(Thread<T> *handle);
|
static IWorker *create(Thread<T> *handle);
|
||||||
@@ -73,6 +76,17 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
void xmrig::Workers<T>::jobEarlyNotification(const Job& job)
|
||||||
|
{
|
||||||
|
for (Thread<T>* t : m_workers) {
|
||||||
|
if (t->worker()) {
|
||||||
|
t->worker()->jobEarlyNotification(job);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
IWorker *Workers<CpuLaunchData>::create(Thread<CpuLaunchData> *handle);
|
IWorker *Workers<CpuLaunchData>::create(Thread<CpuLaunchData> *handle);
|
||||||
extern template class Workers<CpuLaunchData>;
|
extern template class Workers<CpuLaunchData>;
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
set(HEADERS_BACKEND_COMMON
|
set(HEADERS_BACKEND_COMMON
|
||||||
src/backend/common/Hashrate.h
|
src/backend/common/Hashrate.h
|
||||||
|
src/backend/common/HashrateInterpolator.h
|
||||||
src/backend/common/Tags.h
|
src/backend/common/Tags.h
|
||||||
src/backend/common/interfaces/IBackend.h
|
src/backend/common/interfaces/IBackend.h
|
||||||
src/backend/common/interfaces/IRxListener.h
|
src/backend/common/interfaces/IRxListener.h
|
||||||
src/backend/common/interfaces/IRxStorage.h
|
src/backend/common/interfaces/IRxStorage.h
|
||||||
src/backend/common/interfaces/IThread.h
|
|
||||||
src/backend/common/interfaces/IWorker.h
|
src/backend/common/interfaces/IWorker.h
|
||||||
src/backend/common/misc/PciTopology.h
|
src/backend/common/misc/PciTopology.h
|
||||||
src/backend/common/Thread.h
|
src/backend/common/Thread.h
|
||||||
@@ -16,7 +16,13 @@ set(HEADERS_BACKEND_COMMON
|
|||||||
|
|
||||||
set(SOURCES_BACKEND_COMMON
|
set(SOURCES_BACKEND_COMMON
|
||||||
src/backend/common/Hashrate.cpp
|
src/backend/common/Hashrate.cpp
|
||||||
|
src/backend/common/HashrateInterpolator.cpp
|
||||||
src/backend/common/Threads.cpp
|
src/backend/common/Threads.cpp
|
||||||
src/backend/common/Worker.cpp
|
src/backend/common/Worker.cpp
|
||||||
src/backend/common/Workers.cpp
|
src/backend/common/Workers.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (WITH_RANDOMX AND WITH_BENCHMARK)
|
||||||
|
list(APPEND HEADERS_BACKEND_COMMON src/backend/common/Benchmark.h)
|
||||||
|
list(APPEND SOURCES_BACKEND_COMMON src/backend/common/Benchmark.cpp)
|
||||||
|
endif()
|
||||||
|
|||||||
@@ -29,13 +29,14 @@
|
|||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
|
|
||||||
#include "rapidjson/fwd.h"
|
#include "3rdparty/rapidjson/fwd.h"
|
||||||
|
|
||||||
|
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
class Algorithm;
|
class Algorithm;
|
||||||
|
class Benchmark;
|
||||||
class Hashrate;
|
class Hashrate;
|
||||||
class IApiRequest;
|
class IApiRequest;
|
||||||
class IWorker;
|
class IWorker;
|
||||||
@@ -60,12 +61,17 @@ public:
|
|||||||
virtual void setJob(const Job &job) = 0;
|
virtual void setJob(const Job &job) = 0;
|
||||||
virtual void start(IWorker *worker, bool ready) = 0;
|
virtual void start(IWorker *worker, bool ready) = 0;
|
||||||
virtual void stop() = 0;
|
virtual void stop() = 0;
|
||||||
virtual void tick(uint64_t ticks) = 0;
|
virtual bool tick(uint64_t ticks) = 0;
|
||||||
|
|
||||||
# ifdef XMRIG_FEATURE_API
|
# ifdef XMRIG_FEATURE_API
|
||||||
virtual rapidjson::Value toJSON(rapidjson::Document &doc) const = 0;
|
virtual rapidjson::Value toJSON(rapidjson::Document &doc) const = 0;
|
||||||
virtual void handleRequest(IApiRequest &request) = 0;
|
virtual void handleRequest(IApiRequest &request) = 0;
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
# ifdef XMRIG_FEATURE_BENCHMARK
|
||||||
|
virtual Benchmark *benchmark() const = 0;
|
||||||
|
virtual void printBenchProgress() const = 0;
|
||||||
|
# endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,77 +0,0 @@
|
|||||||
/* 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 2016-2018 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_ITHREAD_H
|
|
||||||
#define XMRIG_ITHREAD_H
|
|
||||||
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
|
|
||||||
#include "crypto/common/Algorithm.h"
|
|
||||||
#include "rapidjson/fwd.h"
|
|
||||||
|
|
||||||
|
|
||||||
namespace xmrig {
|
|
||||||
|
|
||||||
|
|
||||||
class IThread
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
enum Type {
|
|
||||||
CPU,
|
|
||||||
OpenCL,
|
|
||||||
CUDA
|
|
||||||
};
|
|
||||||
|
|
||||||
enum Multiway {
|
|
||||||
SingleWay = 1,
|
|
||||||
DoubleWay,
|
|
||||||
TripleWay,
|
|
||||||
QuadWay,
|
|
||||||
PentaWay
|
|
||||||
};
|
|
||||||
|
|
||||||
virtual ~IThread() = default;
|
|
||||||
|
|
||||||
virtual Algorithm algorithm() const = 0;
|
|
||||||
virtual int priority() const = 0;
|
|
||||||
virtual int64_t affinity() const = 0;
|
|
||||||
virtual Multiway multiway() const = 0;
|
|
||||||
virtual rapidjson::Value toConfig(rapidjson::Document &doc) const = 0;
|
|
||||||
virtual size_t index() const = 0;
|
|
||||||
virtual Type type() const = 0;
|
|
||||||
|
|
||||||
# ifdef XMRIG_FEATURE_API
|
|
||||||
virtual rapidjson::Value toAPI(rapidjson::Document &doc) const = 0;
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# ifdef APP_DEBUG
|
|
||||||
virtual void print() const = 0;
|
|
||||||
# endif
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
} /* namespace xmrig */
|
|
||||||
|
|
||||||
|
|
||||||
#endif // XMRIG_ITHREAD_H
|
|
||||||
@@ -34,6 +34,7 @@ namespace xmrig {
|
|||||||
|
|
||||||
|
|
||||||
class VirtualMemory;
|
class VirtualMemory;
|
||||||
|
class Job;
|
||||||
|
|
||||||
|
|
||||||
class IWorker
|
class IWorker
|
||||||
@@ -41,13 +42,19 @@ class IWorker
|
|||||||
public:
|
public:
|
||||||
virtual ~IWorker() = default;
|
virtual ~IWorker() = default;
|
||||||
|
|
||||||
virtual bool selfTest() = 0;
|
virtual bool selfTest() = 0;
|
||||||
virtual const VirtualMemory *memory() const = 0;
|
virtual const VirtualMemory *memory() const = 0;
|
||||||
virtual size_t id() const = 0;
|
virtual size_t id() const = 0;
|
||||||
virtual size_t intensity() const = 0;
|
virtual size_t intensity() const = 0;
|
||||||
virtual uint64_t hashCount() const = 0;
|
virtual uint64_t rawHashes() const = 0;
|
||||||
virtual uint64_t timestamp() const = 0;
|
virtual void getHashrateData(uint64_t&, uint64_t&) const = 0;
|
||||||
virtual void start() = 0;
|
virtual void start() = 0;
|
||||||
|
virtual void jobEarlyNotification(const Job&) = 0;
|
||||||
|
|
||||||
|
# ifdef XMRIG_FEATURE_BENCHMARK
|
||||||
|
virtual uint64_t benchData() const = 0;
|
||||||
|
virtual uint64_t benchDoneTime() const = 0;
|
||||||
|
# endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -5,8 +5,8 @@
|
|||||||
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "backend/cpu/Cpu.h"
|
#include "backend/cpu/Cpu.h"
|
||||||
#include "rapidjson/document.h"
|
#include "3rdparty/rapidjson/document.h"
|
||||||
|
|
||||||
|
|
||||||
#if defined(XMRIG_FEATURE_HWLOC)
|
#if defined(XMRIG_FEATURE_HWLOC)
|
||||||
@@ -60,39 +60,12 @@ xmrig::ICpuInfo *xmrig::Cpu::info()
|
|||||||
|
|
||||||
rapidjson::Value xmrig::Cpu::toJSON(rapidjson::Document &doc)
|
rapidjson::Value xmrig::Cpu::toJSON(rapidjson::Document &doc)
|
||||||
{
|
{
|
||||||
using namespace rapidjson;
|
return info()->toJSON(doc);
|
||||||
auto &allocator = doc.GetAllocator();
|
|
||||||
|
|
||||||
ICpuInfo *i = info();
|
|
||||||
Value cpu(kObjectType);
|
|
||||||
Assembly assembly(i->assembly());
|
|
||||||
|
|
||||||
cpu.AddMember("brand", StringRef(i->brand()), allocator);
|
|
||||||
cpu.AddMember("aes", i->hasAES(), allocator);
|
|
||||||
cpu.AddMember("avx2", i->hasAVX2(), allocator);
|
|
||||||
cpu.AddMember("x64", ICpuInfo::isX64(), allocator);
|
|
||||||
cpu.AddMember("l2", static_cast<uint64_t>(i->L2()), allocator);
|
|
||||||
cpu.AddMember("l3", static_cast<uint64_t>(i->L3()), allocator);
|
|
||||||
cpu.AddMember("cores", static_cast<uint64_t>(i->cores()), allocator);
|
|
||||||
cpu.AddMember("threads", static_cast<uint64_t>(i->threads()), allocator);
|
|
||||||
cpu.AddMember("packages", static_cast<uint64_t>(i->packages()), allocator);
|
|
||||||
cpu.AddMember("nodes", static_cast<uint64_t>(i->nodes()), allocator);
|
|
||||||
cpu.AddMember("backend", StringRef(i->backend()), allocator);
|
|
||||||
|
|
||||||
# ifdef XMRIG_FEATURE_ASM
|
|
||||||
cpu.AddMember("assembly", StringRef(assembly.toString()), allocator);
|
|
||||||
# else
|
|
||||||
cpu.AddMember("assembly", "none", allocator);
|
|
||||||
# endif
|
|
||||||
|
|
||||||
return cpu;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void xmrig::Cpu::release()
|
void xmrig::Cpu::release()
|
||||||
{
|
{
|
||||||
assert(cpuInfo != nullptr);
|
|
||||||
|
|
||||||
delete cpuInfo;
|
delete cpuInfo;
|
||||||
cpuInfo = nullptr;
|
cpuInfo = nullptr;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,8 +5,8 @@
|
|||||||
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -26,13 +26,15 @@
|
|||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
|
||||||
|
|
||||||
|
#include "backend/cpu/CpuBackend.h"
|
||||||
|
#include "3rdparty/rapidjson/document.h"
|
||||||
#include "backend/common/Hashrate.h"
|
#include "backend/common/Hashrate.h"
|
||||||
#include "backend/common/interfaces/IWorker.h"
|
#include "backend/common/interfaces/IWorker.h"
|
||||||
#include "backend/common/Tags.h"
|
#include "backend/common/Tags.h"
|
||||||
#include "backend/common/Workers.h"
|
#include "backend/common/Workers.h"
|
||||||
#include "backend/cpu/Cpu.h"
|
#include "backend/cpu/Cpu.h"
|
||||||
#include "backend/cpu/CpuBackend.h"
|
|
||||||
#include "base/io/log/Log.h"
|
#include "base/io/log/Log.h"
|
||||||
|
#include "base/io/log/Tags.h"
|
||||||
#include "base/net/stratum/Job.h"
|
#include "base/net/stratum/Job.h"
|
||||||
#include "base/tools/Chrono.h"
|
#include "base/tools/Chrono.h"
|
||||||
#include "base/tools/String.h"
|
#include "base/tools/String.h"
|
||||||
@@ -41,7 +43,6 @@
|
|||||||
#include "crypto/common/VirtualMemory.h"
|
#include "crypto/common/VirtualMemory.h"
|
||||||
#include "crypto/rx/Rx.h"
|
#include "crypto/rx/Rx.h"
|
||||||
#include "crypto/rx/RxDataset.h"
|
#include "crypto/rx/RxDataset.h"
|
||||||
#include "rapidjson/document.h"
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef XMRIG_FEATURE_API
|
#ifdef XMRIG_FEATURE_API
|
||||||
@@ -54,13 +55,17 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef XMRIG_FEATURE_BENCHMARK
|
||||||
|
# include "backend/common/Benchmark.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
extern template class Threads<CpuThreads>;
|
extern template class Threads<CpuThreads>;
|
||||||
|
|
||||||
|
|
||||||
static const char *tag = CYAN_BG_BOLD(WHITE_BOLD_S " cpu ");
|
|
||||||
static const String kType = "cpu";
|
static const String kType = "cpu";
|
||||||
static std::mutex mutex;
|
static std::mutex mutex;
|
||||||
|
|
||||||
@@ -102,13 +107,13 @@ public:
|
|||||||
inline void print() const
|
inline void print() const
|
||||||
{
|
{
|
||||||
if (m_started == 0) {
|
if (m_started == 0) {
|
||||||
LOG_ERR("%s " RED_BOLD("disabled") YELLOW(" (failed to start threads)"), tag);
|
LOG_ERR("%s " RED_BOLD("disabled") YELLOW(" (failed to start threads)"), Tags::cpu());
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_INFO("%s" GREEN_BOLD(" READY") " threads %s%zu/%zu (%zu)" CLEAR " huge pages %s%1.0f%% %zu/%zu" CLEAR " memory " CYAN_BOLD("%zu KB") BLACK_BOLD(" (%" PRIu64 " ms)"),
|
LOG_INFO("%s" GREEN_BOLD(" READY") " threads %s%zu/%zu (%zu)" CLEAR " huge pages %s%1.0f%% %zu/%zu" CLEAR " memory " CYAN_BOLD("%zu KB") BLACK_BOLD(" (%" PRIu64 " ms)"),
|
||||||
tag,
|
Tags::cpu(),
|
||||||
m_errors == 0 ? CYAN_BOLD_S : YELLOW_BOLD_S,
|
m_errors == 0 ? CYAN_BOLD_S : YELLOW_BOLD_S,
|
||||||
m_started, m_threads, m_ways,
|
m_started, m_threads, m_ways,
|
||||||
(m_hugePages.isFullyAllocated() ? GREEN_BOLD_S : (m_hugePages.allocated == 0 ? RED_BOLD_S : YELLOW_BOLD_S)),
|
(m_hugePages.isFullyAllocated() ? GREEN_BOLD_S : (m_hugePages.allocated == 0 ? RED_BOLD_S : YELLOW_BOLD_S)),
|
||||||
@@ -142,7 +147,7 @@ public:
|
|||||||
inline void start()
|
inline void start()
|
||||||
{
|
{
|
||||||
LOG_INFO("%s use profile " BLUE_BG(WHITE_BOLD_S " %s ") WHITE_BOLD_S " (" CYAN_BOLD("%zu") WHITE_BOLD(" thread%s)") " scratchpad " CYAN_BOLD("%zu KB"),
|
LOG_INFO("%s use profile " BLUE_BG(WHITE_BOLD_S " %s ") WHITE_BOLD_S " (" CYAN_BOLD("%zu") WHITE_BOLD(" thread%s)") " scratchpad " CYAN_BOLD("%zu KB"),
|
||||||
tag,
|
Tags::cpu(),
|
||||||
profileName.data(),
|
profileName.data(),
|
||||||
threads.size(),
|
threads.size(),
|
||||||
threads.size() > 1 ? "s" : "",
|
threads.size() > 1 ? "s" : "",
|
||||||
@@ -219,13 +224,13 @@ const char *xmrig::backend_tag(uint32_t backend)
|
|||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
return tag;
|
return Tags::cpu();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const char *xmrig::cpu_tag()
|
const char *xmrig::cpu_tag()
|
||||||
{
|
{
|
||||||
return tag;
|
return Tags::cpu();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -275,12 +280,15 @@ const xmrig::String &xmrig::CpuBackend::type() const
|
|||||||
void xmrig::CpuBackend::prepare(const Job &nextJob)
|
void xmrig::CpuBackend::prepare(const Job &nextJob)
|
||||||
{
|
{
|
||||||
# ifdef XMRIG_ALGO_ARGON2
|
# ifdef XMRIG_ALGO_ARGON2
|
||||||
if (nextJob.algorithm().family() == Algorithm::ARGON2 && argon2::Impl::select(d_ptr->controller->config()->cpu().argon2Impl())) {
|
const xmrig::Algorithm::Family f = nextJob.algorithm().family();
|
||||||
LOG_INFO("%s use " WHITE_BOLD("argon2") " implementation " CSI "1;%dm" "%s",
|
if ((f == Algorithm::ARGON2) || (f == Algorithm::RANDOM_X)) {
|
||||||
tag,
|
if (argon2::Impl::select(d_ptr->controller->config()->cpu().argon2Impl())) {
|
||||||
argon2::Impl::name() == "default" ? 33 : 32,
|
LOG_INFO("%s use " WHITE_BOLD("argon2") " implementation " CSI "1;%dm" "%s",
|
||||||
argon2::Impl::name().data()
|
Tags::cpu(),
|
||||||
);
|
argon2::Impl::name() == "default" ? 33 : 32,
|
||||||
|
argon2::Impl::name().data()
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
@@ -301,9 +309,9 @@ void xmrig::CpuBackend::printHashrate(bool details)
|
|||||||
Log::print("| %8zu | %8" PRId64 " | %7s | %7s | %7s |",
|
Log::print("| %8zu | %8" PRId64 " | %7s | %7s | %7s |",
|
||||||
i,
|
i,
|
||||||
data.affinity,
|
data.affinity,
|
||||||
Hashrate::format(hashrate()->calc(i, Hashrate::ShortInterval), num, sizeof num / 3),
|
Hashrate::format(hashrate()->calc(i + 1, Hashrate::ShortInterval), num, sizeof num / 3),
|
||||||
Hashrate::format(hashrate()->calc(i, Hashrate::MediumInterval), num + 8, sizeof num / 3),
|
Hashrate::format(hashrate()->calc(i + 1, Hashrate::MediumInterval), num + 8, sizeof num / 3),
|
||||||
Hashrate::format(hashrate()->calc(i, Hashrate::LargeInterval), num + 8 * 2, sizeof num / 3)
|
Hashrate::format(hashrate()->calc(i + 1, Hashrate::LargeInterval), num + 8 * 2, sizeof num / 3)
|
||||||
);
|
);
|
||||||
|
|
||||||
i++;
|
i++;
|
||||||
@@ -332,7 +340,7 @@ void xmrig::CpuBackend::setJob(const Job &job)
|
|||||||
|
|
||||||
const CpuConfig &cpu = d_ptr->controller->config()->cpu();
|
const CpuConfig &cpu = d_ptr->controller->config()->cpu();
|
||||||
|
|
||||||
std::vector<CpuLaunchData> threads = cpu.get(d_ptr->controller->miner(), job.algorithm());
|
std::vector<CpuLaunchData> threads = cpu.get(d_ptr->controller->miner(), job.algorithm(), d_ptr->controller->config()->pools().benchSize());
|
||||||
if (!d_ptr->threads.empty() && d_ptr->threads.size() == threads.size() && std::equal(d_ptr->threads.begin(), d_ptr->threads.end(), threads.begin())) {
|
if (!d_ptr->threads.empty() && d_ptr->threads.size() == threads.size() && std::equal(d_ptr->threads.begin(), d_ptr->threads.end(), threads.begin())) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -341,7 +349,7 @@ void xmrig::CpuBackend::setJob(const Job &job)
|
|||||||
d_ptr->profileName = cpu.threads().profileName(job.algorithm());
|
d_ptr->profileName = cpu.threads().profileName(job.algorithm());
|
||||||
|
|
||||||
if (d_ptr->profileName.isNull() || threads.empty()) {
|
if (d_ptr->profileName.isNull() || threads.empty()) {
|
||||||
LOG_WARN("%s " RED_BOLD("disabled") YELLOW(" (no suitable configuration found)"), tag);
|
LOG_WARN("%s " RED_BOLD("disabled") YELLOW(" (no suitable configuration found)"), Tags::cpu());
|
||||||
|
|
||||||
return stop();
|
return stop();
|
||||||
}
|
}
|
||||||
@@ -380,13 +388,13 @@ void xmrig::CpuBackend::stop()
|
|||||||
d_ptr->workers.stop();
|
d_ptr->workers.stop();
|
||||||
d_ptr->threads.clear();
|
d_ptr->threads.clear();
|
||||||
|
|
||||||
LOG_INFO("%s" YELLOW(" stopped") BLACK_BOLD(" (%" PRIu64 " ms)"), tag, Chrono::steadyMSecs() - ts);
|
LOG_INFO("%s" YELLOW(" stopped") BLACK_BOLD(" (%" PRIu64 " ms)"), Tags::cpu(), Chrono::steadyMSecs() - ts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void xmrig::CpuBackend::tick(uint64_t ticks)
|
bool xmrig::CpuBackend::tick(uint64_t ticks)
|
||||||
{
|
{
|
||||||
d_ptr->workers.tick(ticks);
|
return d_ptr->workers.tick(ticks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -416,6 +424,10 @@ rapidjson::Value xmrig::CpuBackend::toJSON(rapidjson::Document &doc) const
|
|||||||
out.AddMember("argon2-impl", argon2::Impl::name().toJSON(), allocator);
|
out.AddMember("argon2-impl", argon2::Impl::name().toJSON(), allocator);
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
# ifdef XMRIG_ALGO_ASTROBWT
|
||||||
|
out.AddMember("astrobwt-max-size", cpu.astrobwtMaxSize(), allocator);
|
||||||
|
# endif
|
||||||
|
|
||||||
out.AddMember("hugepages", d_ptr->hugePages(2, doc), allocator);
|
out.AddMember("hugepages", d_ptr->hugePages(2, doc), allocator);
|
||||||
out.AddMember("memory", static_cast<uint64_t>(d_ptr->algo.isValid() ? (d_ptr->ways() * d_ptr->algo.l3()) : 0), allocator);
|
out.AddMember("memory", static_cast<uint64_t>(d_ptr->algo.isValid() ? (d_ptr->ways() * d_ptr->algo.l3()) : 0), allocator);
|
||||||
|
|
||||||
@@ -452,3 +464,20 @@ void xmrig::CpuBackend::handleRequest(IApiRequest &request)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef XMRIG_FEATURE_BENCHMARK
|
||||||
|
xmrig::Benchmark *xmrig::CpuBackend::benchmark() const
|
||||||
|
{
|
||||||
|
return d_ptr->workers.benchmark();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void xmrig::CpuBackend::printBenchProgress() const
|
||||||
|
{
|
||||||
|
auto benchmark = d_ptr->workers.benchmark();
|
||||||
|
if (benchmark) {
|
||||||
|
benchmark->printProgress();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|||||||
@@ -63,13 +63,18 @@ protected:
|
|||||||
void setJob(const Job &job) override;
|
void setJob(const Job &job) override;
|
||||||
void start(IWorker *worker, bool ready) override;
|
void start(IWorker *worker, bool ready) override;
|
||||||
void stop() override;
|
void stop() override;
|
||||||
void tick(uint64_t ticks) override;
|
bool tick(uint64_t ticks) override;
|
||||||
|
|
||||||
# ifdef XMRIG_FEATURE_API
|
# ifdef XMRIG_FEATURE_API
|
||||||
rapidjson::Value toJSON(rapidjson::Document &doc) const override;
|
rapidjson::Value toJSON(rapidjson::Document &doc) const override;
|
||||||
void handleRequest(IApiRequest &request) override;
|
void handleRequest(IApiRequest &request) override;
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
# ifdef XMRIG_FEATURE_BENCHMARK
|
||||||
|
Benchmark *benchmark() const override;
|
||||||
|
void printBenchProgress() const override;
|
||||||
|
# endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CpuBackendPrivate *d_ptr;
|
CpuBackendPrivate *d_ptr;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -5,8 +5,8 @@
|
|||||||
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -24,30 +24,40 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "backend/cpu/CpuConfig.h"
|
#include "backend/cpu/CpuConfig.h"
|
||||||
|
#include "3rdparty/rapidjson/document.h"
|
||||||
#include "backend/cpu/CpuConfig_gen.h"
|
#include "backend/cpu/CpuConfig_gen.h"
|
||||||
#include "backend/cpu/Cpu.h"
|
#include "backend/cpu/Cpu.h"
|
||||||
#include "base/io/json/Json.h"
|
#include "base/io/json/Json.h"
|
||||||
#include "rapidjson/document.h"
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
|
||||||
static const char *kEnabled = "enabled";
|
const char *CpuConfig::kEnabled = "enabled";
|
||||||
static const char *kHugePages = "huge-pages";
|
const char *CpuConfig::kField = "cpu";
|
||||||
static const char *kHwAes = "hw-aes";
|
const char *CpuConfig::kHugePages = "huge-pages";
|
||||||
static const char *kMaxThreadsHint = "max-threads-hint";
|
const char *CpuConfig::kHugePagesJit = "huge-pages-jit";
|
||||||
static const char *kMemoryPool = "memory-pool";
|
const char *CpuConfig::kHwAes = "hw-aes";
|
||||||
static const char *kPriority = "priority";
|
const char *CpuConfig::kMaxThreadsHint = "max-threads-hint";
|
||||||
static const char *kYield = "yield";
|
const char *CpuConfig::kMemoryPool = "memory-pool";
|
||||||
|
const char *CpuConfig::kPriority = "priority";
|
||||||
|
const char *CpuConfig::kYield = "yield";
|
||||||
|
|
||||||
#ifdef XMRIG_FEATURE_ASM
|
#ifdef XMRIG_FEATURE_ASM
|
||||||
static const char *kAsm = "asm";
|
const char *CpuConfig::kAsm = "asm";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef XMRIG_ALGO_ARGON2
|
#ifdef XMRIG_ALGO_ARGON2
|
||||||
static const char *kArgon2Impl = "argon2-impl";
|
const char *CpuConfig::kArgon2Impl = "argon2-impl";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef XMRIG_ALGO_ASTROBWT
|
||||||
|
const char *CpuConfig::kAstroBWTMaxSize = "astrobwt-max-size";
|
||||||
|
const char *CpuConfig::kAstroBWTAVX2 = "astrobwt-avx2";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
extern template class Threads<CpuThreads>;
|
extern template class Threads<CpuThreads>;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -68,6 +78,7 @@ rapidjson::Value xmrig::CpuConfig::toJSON(rapidjson::Document &doc) const
|
|||||||
|
|
||||||
obj.AddMember(StringRef(kEnabled), m_enabled, allocator);
|
obj.AddMember(StringRef(kEnabled), m_enabled, allocator);
|
||||||
obj.AddMember(StringRef(kHugePages), m_hugePages, allocator);
|
obj.AddMember(StringRef(kHugePages), m_hugePages, allocator);
|
||||||
|
obj.AddMember(StringRef(kHugePagesJit), m_hugePagesJit, allocator);
|
||||||
obj.AddMember(StringRef(kHwAes), m_aes == AES_AUTO ? Value(kNullType) : Value(m_aes == AES_HW), allocator);
|
obj.AddMember(StringRef(kHwAes), m_aes == AES_AUTO ? Value(kNullType) : Value(m_aes == AES_HW), allocator);
|
||||||
obj.AddMember(StringRef(kPriority), priority() != -1 ? Value(priority()) : Value(kNullType), allocator);
|
obj.AddMember(StringRef(kPriority), priority() != -1 ? Value(priority()) : Value(kNullType), allocator);
|
||||||
obj.AddMember(StringRef(kMemoryPool), m_memoryPool < 1 ? Value(m_memoryPool < 0) : Value(m_memoryPool), allocator);
|
obj.AddMember(StringRef(kMemoryPool), m_memoryPool < 1 ? Value(m_memoryPool < 0) : Value(m_memoryPool), allocator);
|
||||||
@@ -85,6 +96,11 @@ rapidjson::Value xmrig::CpuConfig::toJSON(rapidjson::Document &doc) const
|
|||||||
obj.AddMember(StringRef(kArgon2Impl), m_argon2Impl.toJSON(), allocator);
|
obj.AddMember(StringRef(kArgon2Impl), m_argon2Impl.toJSON(), allocator);
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
# ifdef XMRIG_ALGO_ASTROBWT
|
||||||
|
obj.AddMember(StringRef(kAstroBWTMaxSize), m_astrobwtMaxSize, allocator);
|
||||||
|
obj.AddMember(StringRef(kAstroBWTAVX2), m_astrobwtAVX2, allocator);
|
||||||
|
# endif
|
||||||
|
|
||||||
m_threads.toJSON(obj, doc);
|
m_threads.toJSON(obj, doc);
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
@@ -97,7 +113,7 @@ size_t xmrig::CpuConfig::memPoolSize() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::vector<xmrig::CpuLaunchData> xmrig::CpuConfig::get(const Miner *miner, const Algorithm &algorithm) const
|
std::vector<xmrig::CpuLaunchData> xmrig::CpuConfig::get(const Miner *miner, const Algorithm &algorithm, uint32_t benchSize) const
|
||||||
{
|
{
|
||||||
std::vector<CpuLaunchData> out;
|
std::vector<CpuLaunchData> out;
|
||||||
const CpuThreads &threads = m_threads.get(algorithm);
|
const CpuThreads &threads = m_threads.get(algorithm);
|
||||||
@@ -109,7 +125,7 @@ std::vector<xmrig::CpuLaunchData> xmrig::CpuConfig::get(const Miner *miner, cons
|
|||||||
out.reserve(threads.count());
|
out.reserve(threads.count());
|
||||||
|
|
||||||
for (const CpuThread &thread : threads.data()) {
|
for (const CpuThread &thread : threads.data()) {
|
||||||
out.emplace_back(miner, algorithm, *this, thread);
|
out.emplace_back(miner, algorithm, *this, thread, benchSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
return out;
|
return out;
|
||||||
@@ -119,10 +135,11 @@ std::vector<xmrig::CpuLaunchData> xmrig::CpuConfig::get(const Miner *miner, cons
|
|||||||
void xmrig::CpuConfig::read(const rapidjson::Value &value)
|
void xmrig::CpuConfig::read(const rapidjson::Value &value)
|
||||||
{
|
{
|
||||||
if (value.IsObject()) {
|
if (value.IsObject()) {
|
||||||
m_enabled = Json::getBool(value, kEnabled, m_enabled);
|
m_enabled = Json::getBool(value, kEnabled, m_enabled);
|
||||||
m_hugePages = Json::getBool(value, kHugePages, m_hugePages);
|
m_hugePages = Json::getBool(value, kHugePages, m_hugePages);
|
||||||
m_limit = Json::getUint(value, kMaxThreadsHint, m_limit);
|
m_hugePagesJit = Json::getBool(value, kHugePagesJit, m_hugePagesJit);
|
||||||
m_yield = Json::getBool(value, kYield, m_yield);
|
m_limit = Json::getUint(value, kMaxThreadsHint, m_limit);
|
||||||
|
m_yield = Json::getBool(value, kYield, m_yield);
|
||||||
|
|
||||||
setAesMode(Json::getValue(value, kHwAes));
|
setAesMode(Json::getValue(value, kHwAes));
|
||||||
setPriority(Json::getInt(value, kPriority, -1));
|
setPriority(Json::getInt(value, kPriority, -1));
|
||||||
@@ -136,6 +153,24 @@ void xmrig::CpuConfig::read(const rapidjson::Value &value)
|
|||||||
m_argon2Impl = Json::getString(value, kArgon2Impl);
|
m_argon2Impl = Json::getString(value, kArgon2Impl);
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
# ifdef XMRIG_ALGO_ASTROBWT
|
||||||
|
const auto& astroBWTMaxSize = Json::getValue(value, kAstroBWTMaxSize);
|
||||||
|
if (astroBWTMaxSize.IsNull() || !astroBWTMaxSize.IsInt()) {
|
||||||
|
m_shouldSave = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
m_astrobwtMaxSize = std::min(std::max(astroBWTMaxSize.GetInt(), 400), 1200);
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto& astroBWTAVX2 = Json::getValue(value, kAstroBWTAVX2);
|
||||||
|
if (astroBWTAVX2.IsNull() || !astroBWTAVX2.IsBool()) {
|
||||||
|
m_shouldSave = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
m_astrobwtAVX2 = astroBWTAVX2.GetBool();
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
m_threads.read(value);
|
m_threads.read(value);
|
||||||
|
|
||||||
generate();
|
generate();
|
||||||
@@ -167,7 +202,7 @@ void xmrig::CpuConfig::generate()
|
|||||||
count += xmrig::generate<Algorithm::ARGON2>(m_threads, m_limit);
|
count += xmrig::generate<Algorithm::ARGON2>(m_threads, m_limit);
|
||||||
count += xmrig::generate<Algorithm::ASTROBWT>(m_threads, m_limit);
|
count += xmrig::generate<Algorithm::ASTROBWT>(m_threads, m_limit);
|
||||||
|
|
||||||
m_shouldSave = count > 0;
|
m_shouldSave |= count > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -5,8 +5,8 @@
|
|||||||
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -44,21 +44,47 @@ public:
|
|||||||
AES_SOFT
|
AES_SOFT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const char *kEnabled;
|
||||||
|
static const char *kField;
|
||||||
|
static const char *kHugePages;
|
||||||
|
static const char *kHugePagesJit;
|
||||||
|
static const char *kHwAes;
|
||||||
|
static const char *kMaxThreadsHint;
|
||||||
|
static const char *kMemoryPool;
|
||||||
|
static const char *kPriority;
|
||||||
|
static const char *kYield;
|
||||||
|
|
||||||
|
# ifdef XMRIG_FEATURE_ASM
|
||||||
|
static const char *kAsm;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifdef XMRIG_ALGO_ARGON2
|
||||||
|
static const char *kArgon2Impl;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifdef XMRIG_ALGO_ASTROBWT
|
||||||
|
static const char *kAstroBWTMaxSize;
|
||||||
|
static const char *kAstroBWTAVX2;
|
||||||
|
# endif
|
||||||
|
|
||||||
CpuConfig() = default;
|
CpuConfig() = default;
|
||||||
|
|
||||||
bool isHwAES() const;
|
bool isHwAES() const;
|
||||||
rapidjson::Value toJSON(rapidjson::Document &doc) const;
|
rapidjson::Value toJSON(rapidjson::Document &doc) const;
|
||||||
size_t memPoolSize() const;
|
size_t memPoolSize() const;
|
||||||
std::vector<CpuLaunchData> get(const Miner *miner, const Algorithm &algorithm) const;
|
std::vector<CpuLaunchData> get(const Miner *miner, const Algorithm &algorithm, uint32_t benchSize) const;
|
||||||
void read(const rapidjson::Value &value);
|
void read(const rapidjson::Value &value);
|
||||||
|
|
||||||
inline bool isEnabled() const { return m_enabled; }
|
inline bool isEnabled() const { return m_enabled; }
|
||||||
inline bool isHugePages() const { return m_hugePages; }
|
inline bool isHugePages() const { return m_hugePages; }
|
||||||
|
inline bool isHugePagesJit() const { return m_hugePagesJit; }
|
||||||
inline bool isShouldSave() const { return m_shouldSave; }
|
inline bool isShouldSave() const { return m_shouldSave; }
|
||||||
inline bool isYield() const { return m_yield; }
|
inline bool isYield() const { return m_yield; }
|
||||||
inline const Assembly &assembly() const { return m_assembly; }
|
inline const Assembly &assembly() const { return m_assembly; }
|
||||||
inline const String &argon2Impl() const { return m_argon2Impl; }
|
inline const String &argon2Impl() const { return m_argon2Impl; }
|
||||||
inline const Threads<CpuThreads> &threads() const { return m_threads; }
|
inline const Threads<CpuThreads> &threads() const { return m_threads; }
|
||||||
|
inline int astrobwtMaxSize() const { return m_astrobwtMaxSize; }
|
||||||
|
inline bool astrobwtAVX2() const { return m_astrobwtAVX2; }
|
||||||
inline int priority() const { return m_priority; }
|
inline int priority() const { return m_priority; }
|
||||||
inline uint32_t limit() const { return m_limit; }
|
inline uint32_t limit() const { return m_limit; }
|
||||||
|
|
||||||
@@ -69,17 +95,20 @@ private:
|
|||||||
|
|
||||||
inline void setPriority(int priority) { m_priority = (priority >= -1 && priority <= 5) ? priority : -1; }
|
inline void setPriority(int priority) { m_priority = (priority >= -1 && priority <= 5) ? priority : -1; }
|
||||||
|
|
||||||
AesMode m_aes = AES_AUTO;
|
AesMode m_aes = AES_AUTO;
|
||||||
Assembly m_assembly;
|
Assembly m_assembly;
|
||||||
bool m_enabled = true;
|
bool m_astrobwtAVX2 = false;
|
||||||
bool m_hugePages = true;
|
bool m_enabled = true;
|
||||||
bool m_shouldSave = false;
|
bool m_hugePages = true;
|
||||||
bool m_yield = true;
|
bool m_hugePagesJit = false;
|
||||||
int m_memoryPool = 0;
|
bool m_shouldSave = false;
|
||||||
int m_priority = -1;
|
bool m_yield = true;
|
||||||
|
int m_astrobwtMaxSize = 550;
|
||||||
|
int m_memoryPool = 0;
|
||||||
|
int m_priority = -1;
|
||||||
String m_argon2Impl;
|
String m_argon2Impl;
|
||||||
Threads<CpuThreads> m_threads;
|
Threads<CpuThreads> m_threads;
|
||||||
uint32_t m_limit = 100;
|
uint32_t m_limit = 100;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user