Errori, bug, domande - pagina 2506

 
Vict:
Giustificare

I registri sono misurati in bit, non in byte. Perciò questa linea è usata in modo scorretto nel resto del codice:

#define  CACHE_LINE_SIZE 64
 
Francuz:

I registri sono misurati in bit, non in byte. Perciò questa linea è usata in modo scorretto nel resto del codice:

No, lei sta dicendo qualcosa di strano. Non ho intenzione di provarlo. Guarda la documentazione sul processore, leggi qui https://stackoverflow.com/questions/7281699/aligning-to-cache-line-and-knowing-the-cache-line-size/7284876

Su x86 le linee di cache sono 64 byte

Non ho bisogno di registri, non parlo affatto di loro.

Aligning to cache line and knowing the cache line size
Aligning to cache line and knowing the cache line size
  • 2011.09.02
  • MetallicPriestMetallicPriest 12.1k2929 gold badges135135 silver badges259259 bronze badges
  • stackoverflow.com
To prevent false sharing, I want to align each element of an array to a cache line. So first I need to know the size of a cache line, so I assign each element that amount of bytes. Secondly I want the start of the array to be aligned to a cache line. I am using Linux and 8-core x86 platform...
 
Vict:

No, lei sta dicendo qualcosa di strano. Non ho intenzione di provarlo. Guarda la documentazione del processore, leggi qui https://stackoverflow.com/questions/7281699/aligning-to-cache-line-and-knowing-the-cache-line-size/7284876

Non ho bisogno di registri, non parlo affatto di loro.

Hmm... Ok. Comunque, la cache varia da modello a modello. Non c'è modo di sapere le sue dimensioni dal software. Per questo è sciocco prenderlo come guida. Ma tutti i processori hanno due tipi di registri ed è sulla dimensione dei registri che si concentrano i programmatori esperti. E anche questo orientamento ai registri non ha sempre successo, perché tra il programma e il processore ci sono un compilatore e un sistema operativo.

Inoltre questa linea è calcolata in modo errato e senza registri:

int index = int(CACHE_LINE_SIZE - getaddr(data[rndnum].ar[0]) % CACHE_LINE_SIZE) / sizeof(int);
 
Francuz:

Hmm... Ok. Comunque, la cache varia da processore a processore. E non c'è modo di sapere le sue dimensioni dal software. Per questo è sciocco farsi guidare da esso. Ma tutti i processori hanno due tipi di registri ed è sulla dimensione dei registri che si concentrano i programmatori esperti. E anche il targeting della dimensione del registro non sempre vi salva, perché il compilatore e il sistema operativo sono situati tra il programma e il processore.

Di nuovo, le cose si stanno evolvendo, sempre più enfasi è posta sul multithreading, ed ecco una libreria cross std che vi dirà tutto al riguardo

https://en.cppreference.com/w/cpp/thread/hardware_destructive_interference_size

Inoltre, questa linea è calcolata in modo errato e non tiene conto dei registri:
Forse, ma finora non mi hai convinto.
std::hardware_destructive_interference_size, std::hardware_constructive_interference_size - cppreference.com
  • en.cppreference.com
These constants provide a portable way to access the L1 data cache line size.
 
Vict:

Ancora no, le cose si stanno evolvendo, sempre più enfasi è posta sul multithreading, ed ecco che la libreria cross std vi dirà tutto

https://en.cppreference.com/w/cpp/thread/hardware_destructive_interference_size

Forse, ma finora non mi hai convinto.

Non ve lo dirà, ve lo dirà. Leggete attentamente le specifiche.


Anche se non sono sicuro di quale offset volevi, ma è facile da capire: un indirizzo assoluto è completamente inutile nei calcoli. Avete dimenticato che il punto di riferimento per la memoria è l'indirizzo della struttura? E probabilmente volevate ottenere l'offset dell'array nel blocco di memoria della struttura? E questo è ciò che ottiene la differenza tra gli indirizzi della struttura e l'elemento nullo dell'array.

 
Artyom Trishkin:

Se non c'è un valore nel buffer sulla barra, deve essere scritto esplicitamente nel buffer. Cioè, se il valore calcolato deve essere emesso nel buffer - lo scriviamo nel buffer, altrimenti - scriviamo un valore vuoto.

Grazie, Artem.

 
Francuz:

Anche se non sono sicuro di quale offset volevi, è facile capire il bug: un indirizzo assoluto è completamente inutile nei calcoli. Avete dimenticato che il punto di riferimento della memoria è l'indirizzo della struttura? E probabilmente volevate ottenere l'offset di un array in un blocco di memoria della struttura? E questa è la differenza tra gli indirizzi della struttura e l'elemento zero dell'array.

int index = int(CACHE_LINE_SIZE - getaddr(data[rndnum].ar[0]) % CACHE_LINE_SIZE) / sizeof(int);
                                3        1                    2                  4

Azioni in ordine:

1 - ottiene l'indirizzo del primo elemento ar[] nella struttura dati corrente.

2. trovare i suoi offset dall'inizio della linea della cache

3. trovare quanti byte da esso alla fine della linea della cache

4. trovare quanti byte entreranno in questo spazio fino alla fine della linea della cache.


L'hai eseguito sul tuo computer? C'è una differenza di velocità? O sono solo io?

 
Vict:

2. trovare i suoi offset dall'inizio della linea della cache

Cosa ti fa pensare che sia un modo per scoprire il suo offset?

 
Cosa sta causando questo rallentamento?

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Bug, bug, domande

fxsaber, 2019.07.09 11:13

   Data data[];
   
   ArrayResize(data, 32768);

C'è un rallentamento di 6 volte!

 
fxsaber:
A cosa servono questi freni?
Un array dinamico ha più controlli, Renat una volta ha scritto, non riesco a trovare il post, parlando solo dell'accesso all'indice, perché è significativamente più lento di plus