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...
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);
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
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.
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.
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?
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
Consenti l'uso dei cookie per accedere al sito MQL5.com.
Abilita le impostazioni necessarie nel browser, altrimenti non sarà possibile accedere.
Hai effettuato l'accesso. L'autenticazione a due fattori è stata disattivata. Configurala di nuovo e scansiona un nuovo codice QR, oppure continua con l'autenticazione a due fattori disattivata.
Giustificare
I registri sono misurati in bit, non in byte. Perciò questa linea è usata in modo scorretto nel resto del codice:
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
Non ho bisogno di registri, non parlo affatto di loro.
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:
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
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.
Forum sul trading, sistemi di trading automatico e test di strategie di trading
Forse, ma finora non mi hai convinto.
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.
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.
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.
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?
2. trovare i suoi offset dall'inizio della linea della cache
Cosa ti fa pensare che sia un modo per scoprire il suo offset?
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!
A cosa servono questi freni?