# GPUDispersion

This version uses GPU to help eliminate candidates at scale much faster.

Roughly speaking, the situation is this: we get an interval of about 12,000 integers to sieve per nonce. Multiples of 2,3,5 and 7 reduces this amount of 12K candidates to by 79% to 2500 candidates. Next we sieve by multiples of 11, 13, and so on. We remove candidates by checking if they are a multiple of ever larger primes.

In all previous testing of ECM on GPUs we did not see any advantage over CPU for this task of sieving until recently when someone in the team investigating this stumble upon the fact that, if we remove phase 2 from ECM, then we get a huge speed up and can sieve by much larger primes in the same amount of time we perviously had available.

In practice, when before we tested and reduced 12000 candidates to \~350 now, in that same amount of time, we hav left \~100 or so candidates. If we add three GPUs of the same type this number comes down to \~60 or so candidates. We tested with 14 RTX 4090 GPUs and this number comes down to \~20 candidates.

Where now we can perform GNFS using CUDA-NFS on the remaining 100 or 20 survivors of this proccess -- depending on how much GPU power your system has available.

This miner automagically uses ALL gpus available on the system -- though, only nvidia GPUs. The ECM GPU implementation we use is here\[<https://github.com/FACT0RN/ecmongpu>]. Feel free to improve it.

## Installation

You will need the following python modules:

`pip install numpy base58 nvidia-ml-py3`

To build ecmongpu you will the cuda toolkit. We will publish a release built for x86 and ubuntu.

## Running

Once you have CUDA-NFS and ecmongpu ready to go -- run the `build.sh` script. You will need to set the `RPC_USER` and `RPC_PASS` in the environment so the miner can talk to the daemon.

```
export RPC_USER=youruserforfactornd
export RPC_PASS=yourpasswordforfactornd
```

Exctremely important, run:

```
python sitter.py
```

This script checks for new blocks and tells the miner to start over from the new block.

Then you will need your ScriptPubKey and the ecm level to run the miner. For example:

```
python blockchain.py 00scriptpubkeygoeshereff 4
```

The ECM levels are as follows:

```
Usage: python blockchain.py <ScriptPubKey> <ECM Level>")
       ScriptPubKey is a hexadecimal string and ECM Level is an integer from 1 to 5.
         ECM Levels
         Level 1:    Remove factors with up to 20 decimal digits.
         Level 2:    Remove factors with up to 25 decimal digits.
         Level 3:    Remove factors with up to 30 decimal digits.
         Level 4:    Remove factors with up to 35 decimal digits.
         Level 5:    Remove factors with up to 40 decimal digits.
        Level 5:    Remove factors with up to 45 decimal digits.
 Choose the appropiate one for the computational power in GPU you have
```

The higher the level the more you sieve but the longer it takes. The number of CUDA cores you have the higher you can for a fixed amount of time.

So, for example if CUDA-NFS takes 4 minutes to factor a block solver candidate and the average block time is 10 minutes...you should now take more than 6 minuets on GPU sieving -- choose a level that takes less than that to leave yourselve some buffer room for running CADO-NFS.

## Improvements

Please report any bugs or funny behaviour, in terms of timing or not sieving as much as expected given a number of GPus, and we will take a look at it. Scaling should be linear in terms of GPUs


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.fact0rn.io/mining/gpudispersion.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
