Post
Topic
Board Mining (Altcoins)
Re: cpuminer-opt 3.7.6 only using 32 CPUs on a 48 CPU system?
by
joblo
on 16/12/2017, 03:25:26 UTC

Code:
[2017-12-16 01:03:56] Starting Stratum on stratum+tcp://ip:port
[2017-12-16 01:03:56] Binding thread 0 to cpu 0 (mask 1)
[2017-12-16 01:03:56] Binding thread 1 to cpu 1 (mask 2)
[2017-12-16 01:03:56] Binding thread 2 to cpu 2 (mask 4)
[2017-12-16 01:03:56] Binding thread 3 to cpu 3 (mask 8)
[2017-12-16 01:03:56] Binding thread 4 to cpu 4 (mask 10)
[2017-12-16 01:03:56] Binding thread 5 to cpu 5 (mask 20)
[2017-12-16 01:03:56] Binding thread 6 to cpu 6 (mask 40)
[2017-12-16 01:03:56] Binding thread 7 to cpu 7 (mask 80)
[2017-12-16 01:03:56] Binding thread 8 to cpu 8 (mask 100)
[2017-12-16 01:03:56] Binding thread 9 to cpu 9 (mask 200)
[2017-12-16 01:03:56] Binding thread 10 to cpu 10 (mask 400)
[2017-12-16 01:03:56] Binding thread 11 to cpu 11 (mask 800)
[2017-12-16 01:03:56] Binding thread 12 to cpu 12 (mask 1000)
[2017-12-16 01:03:56] Binding thread 13 to cpu 13 (mask 2000)
[2017-12-16 01:03:56] Binding thread 14 to cpu 14 (mask 4000)
[2017-12-16 01:03:56] Binding thread 15 to cpu 15 (mask 8000)
[2017-12-16 01:03:56] Binding thread 16 to cpu 16 (mask 10000)
[2017-12-16 01:03:56] Binding thread 17 to cpu 17 (mask 20000)
[2017-12-16 01:03:56] Binding thread 18 to cpu 18 (mask 40000)
[2017-12-16 01:03:56] Binding thread 19 to cpu 19 (mask 80000)
[2017-12-16 01:03:56] Binding thread 20 to cpu 20 (mask 100000)
[2017-12-16 01:03:56] Binding thread 21 to cpu 21 (mask 200000)
[2017-12-16 01:03:56] Binding thread 22 to cpu 22 (mask 400000)
[2017-12-16 01:03:56] Binding thread 23 to cpu 23 (mask 800000)
[2017-12-16 01:03:56] Binding thread 24 to cpu 24 (mask 1000000)
[2017-12-16 01:03:56] Binding thread 25 to cpu 25 (mask 2000000)
[2017-12-16 01:03:56] Binding thread 26 to cpu 26 (mask 4000000)
[2017-12-16 01:03:56] Binding thread 27 to cpu 27 (mask 8000000)
[2017-12-16 01:03:56] Binding thread 28 to cpu 28 (mask 10000000)
[2017-12-16 01:03:56] Binding thread 29 to cpu 29 (mask 20000000)
[2017-12-16 01:03:56] Binding thread 30 to cpu 30 (mask 40000000)
[2017-12-16 01:03:56] Binding thread 31 to cpu 31 (mask 80000000)
[2017-12-16 01:03:56] Binding thread 32 to cpu 32 (mask 1)
[2017-12-16 01:03:56] Binding thread 33 to cpu 33 (mask 2)
[2017-12-16 01:03:56] Binding thread 34 to cpu 34 (mask 4)
[2017-12-16 01:03:56] Binding thread 35 to cpu 35 (mask 8)
[2017-12-16 01:03:56] Binding thread 36 to cpu 36 (mask 10)
[2017-12-16 01:03:56] Binding thread 37 to cpu 37 (mask 20)
[2017-12-16 01:03:56] Binding thread 38 to cpu 38 (mask 40)
[2017-12-16 01:03:56] Binding thread 39 to cpu 39 (mask 80)
[2017-12-16 01:03:56] Binding thread 40 to cpu 40 (mask 100)
[2017-12-16 01:03:56] Binding thread 41 to cpu 41 (mask 200)
[2017-12-16 01:03:56] Binding thread 42 to cpu 42 (mask 400)
[2017-12-16 01:03:56] Binding thread 43 to cpu 43 (mask 800)
[2017-12-16 01:03:56] Binding thread 44 to cpu 44 (mask 1000)
[2017-12-16 01:03:56] Binding thread 45 to cpu 45 (mask 2000)
[2017-12-16 01:03:56] Binding thread 46 to cpu 46 (mask 4000)
[2017-12-16 01:03:56] 48 miner threads started, using 'lyra2z' algorithm.
[2017-12-16 01:03:56] Binding thread 47 to cpu 47 (mask 8000)
[2017-12-16 01:03:57] Stratum session id: deadbeefcafebabef76c160000000000
[2017-12-16 01:03:57] Stratum difficulty set to 10
[2017-12-16 01:03:58] Stratum difficulty set to 5
[2017-12-16 01:03:58] DEBUG: job_id='1e40' extranonce2=00000000 ntime=5a3470e6
[2017-12-16 01:03:58] Stratum difficulty set to 10 (0.03906)
(...)
I've reviewed the changes I made for 64 CPU support and they should only have an effect when
there are more than 64 vcores. It's as simple as if num_cpus > 64 do something different else
do as usual.
Quote
The issue must be somewhere in cpu-miner.c.

If we copy cpu-miner.c from v3.7.5.tar.gz to 3.7.6 and compile it, all 48 CPUs are used.

If we copy cpu-miner.c from v3.7.6.tar.gz to 3.7.5 and compile it, only 32 CPUs are used.
Code:
        applog( LOG_DEBUG, "Binding thread %d to cpu %d (mask %x)",
                   thr_id, thr_id % num_cpus, ( 1 << (thr_id % num_cpus) ) );
         affine_to_cpu_mask( thr_id, 1 << (thr_id % num_cpus) );

Something isn't making sense. The mask is rolling over at 32. The only way that happens is if num_cpus == 32.

This is really bugging me. The only idea I have is the literal constant 1 is not being extended to 64 bits and the result
of ( 1 << (thr_id % num_cpus) ) is only a 32 bit value even though num_cpus is 48. If this is the case I don't know
why it worked before. But it's worth a try forcing it to 64 bits:

Code:
207c207
<       if( (ncpus > 64) || ( mask & (1ULL << i) ) )  CPU_SET( i, &set );
---
>       if( (ncpus > 64) || ( mask & (1UL << i) ) )  CPU_SET( i, &set );
1693c1693
<                    thr_id, thr_id % num_cpus, ( 1ULL << (thr_id % num_cpus) ) );
---
>                    thr_id, thr_id % num_cpus, ( 1 << (thr_id % num_cpus) ) );
1695c1695
<          affine_to_cpu_mask( thr_id, 1ULL << (thr_id % num_cpus) );
---
>          affine_to_cpu_mask( thr_id, 1 << (thr_id % num_cpus) );