mirror of
https://github.com/status-im/EIPs.git
synced 2025-03-04 00:20:54 +00:00
Automatically merged updates to draft EIP(s) 1057
Hi, I'm a bot! This change was automatically merged because: - It only modifies existing Draft or Last Call EIP(s) - The PR was approved or written by at least one author of each modified EIP - The build is passing
This commit is contained in:
parent
77000b43ae
commit
d5b5e28065
@ -283,15 +283,6 @@ uint32_t math(uint32_t a, uint32_t b, uint32_t r)
|
||||
The main loop:
|
||||
|
||||
```cpp
|
||||
// Helper to get the next value in the per-program random sequence
|
||||
#define rnd() (kiss99(prog_rnd))
|
||||
// Helper to pick a random mix location
|
||||
#define mix_src() (rnd() % PROGPOW_REGS)
|
||||
// Helper to access the sequence of mix destinations
|
||||
#define mix_dst() (mix_seq_dst[(mix_seq_dst_cnt++)%PROGPOW_REGS])
|
||||
// Helper to access the sequence of cache sources
|
||||
#define mix_cache() (mix_seq_cache[(mix_seq_cache_cnt++)%PROGPOW_REGS])
|
||||
|
||||
void progPowLoop(
|
||||
const uint64_t prog_seed,
|
||||
const uint32_t loop,
|
||||
@ -300,47 +291,64 @@ void progPowLoop(
|
||||
{
|
||||
// All lanes share a base address for the global load
|
||||
// Global offset uses mix[0] to guarantee it depends on the load result
|
||||
uint32_t data_g[PROGPOW_LANES][PROGPOW_DAG_LOADS];
|
||||
uint32_t offset_g = mix[loop%PROGPOW_LANES][0] % (DAG_BYTES / (PROGPOW_LANES*PROGPOW_DAG_LOADS*sizeof(uint32_t)));
|
||||
// Lanes can execute in parallel and will be convergent
|
||||
for (int l = 0; l < PROGPOW_LANES; l++)
|
||||
{
|
||||
// global load to the 256 byte DAG entry
|
||||
// every lane can access every part of the entry
|
||||
uint32_t data_g[PROGPOW_DAG_LOADS];
|
||||
uint32_t offset_l = offset_g * PROGPOW_LANES + (l ^ loop) % PROGPOW_LANES;
|
||||
for (int i = 0; i < PROGPOW_DAG_LOADS; i++)
|
||||
data_g[i] = dag[offset_l * PROGPOW_DAG_LOADS + i];
|
||||
data_g[l][i] = dag[offset_l * PROGPOW_DAG_LOADS + i];
|
||||
}
|
||||
|
||||
// initialize the seed and mix destination sequence
|
||||
int mix_seq_dst[PROGPOW_REGS];
|
||||
int mix_seq_cache[PROGPOW_REGS];
|
||||
int mix_seq_dst_cnt = 0;
|
||||
int mix_seq_cache_cnt = 0;
|
||||
kiss99_t prog_rnd = progPowInit(prog_seed, mix_seq_dst, mix_seq_cache);
|
||||
// Initialize the program seed and sequences
|
||||
// When mining these are evaluated on the CPU and compiled away
|
||||
int mix_seq_dst[PROGPOW_REGS];
|
||||
int mix_seq_src[PROGPOW_REGS];
|
||||
int mix_seq_dst_cnt = 0;
|
||||
int mix_seq_src_cnt = 0;
|
||||
kiss99_t prog_rnd = progPowInit(prog_seed, mix_seq_dst, mix_seq_src);
|
||||
|
||||
int max_i = max(PROGPOW_CNT_CACHE, PROGPOW_CNT_MATH);
|
||||
for (int i = 0; i < max_i; i++)
|
||||
int max_i = max(PROGPOW_CNT_CACHE, PROGPOW_CNT_MATH);
|
||||
for (int i = 0; i < max_i; i++)
|
||||
{
|
||||
if (i < PROGPOW_CNT_CACHE)
|
||||
{
|
||||
if (i < PROGPOW_CNT_CACHE)
|
||||
// Cached memory access
|
||||
// lanes access random 32-bit locations within the first portion of the DAG
|
||||
int src = mix_seq_src[(mix_seq_src_cnt++)%PROGPOW_REGS];
|
||||
int dst = mix_seq_dst[(mix_seq_dst_cnt++)%PROGPOW_REGS];
|
||||
int sel = kiss99(prog_rnd);
|
||||
for (int l = 0; l < PROGPOW_LANES; l++)
|
||||
{
|
||||
// Cached memory access
|
||||
// lanes access random 32-bit locations within the first portion of the DAG
|
||||
uint32_t offset = mix[l][mix_cache()] % (PROGPOW_CACHE_BYTES/sizeof(uint32_t));
|
||||
uint32_t data = dag[offset];
|
||||
merge(mix[l][mix_dst()], data, rnd());
|
||||
}
|
||||
if (i < PROGPOW_CNT_MATH)
|
||||
{
|
||||
// Random Math
|
||||
uint32_t data = math(mix[l][mix_src()], mix[l][mix_src()], rnd());
|
||||
merge(mix[l][mix_dst()], data, rnd());
|
||||
uint32_t offset = mix[l][src] % (PROGPOW_CACHE_BYTES/sizeof(uint32_t));
|
||||
merge(mix[l][dst], dag[offset], sel);
|
||||
}
|
||||
}
|
||||
// Consume the global load data at the very end of the loop to allow full latency hiding
|
||||
// Always merge into mix[0] to feed the offset calculation
|
||||
merge(mix[l][0], data_g[0], rnd());
|
||||
for (int i = 1; i < PROGPOW_DAG_LOADS; i++)
|
||||
merge(mix[l][mix_dst()], data_g[i], rnd());
|
||||
if (i < PROGPOW_CNT_MATH)
|
||||
{
|
||||
// Random Math
|
||||
int src1 = kiss99(prog_rnd) % PROGPOW_REGS;
|
||||
int src2 = kiss99(prog_rnd) % PROGPOW_REGS;
|
||||
int sel1 = kiss99(prog_rnd);
|
||||
int dst = mix_seq_dst[(mix_seq_dst_cnt++)%PROGPOW_REGS];
|
||||
int sel2 = kiss99(prog_rnd);
|
||||
for (int l = 0; l < PROGPOW_LANES; l++)
|
||||
{
|
||||
uint32_t data = math(mix[l][src1], mix[l][src2], sel1);
|
||||
merge(mix[l][dst], data, sel2);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Consume the global load data at the very end of the loop to allow full latency hiding
|
||||
// Always merge into mix[0] to feed the offset calculation
|
||||
for (int i = 0; i < PROGPOW_DAG_LOADS; i++)
|
||||
{
|
||||
int dst = (i==0) ? 0 : mix_seq_dst[(mix_seq_dst_cnt++)%PROGPOW_REGS];
|
||||
int sel = kiss99(prog_rnd);
|
||||
for (int l = 0; l < PROGPOW_LANES; l++)
|
||||
merge(mix[l][dst], data_g[l][i], sel);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
Loading…
x
Reference in New Issue
Block a user